Download
(eval-when-compile (require 'anything))
(require 'migemo nil t)
(require 'anything-match-plugin nil t)
(defvar anything-use-migemo nil
"[Internal] If non-nil, `anything' is migemo-ized.")
(defun anything-migemo (with-migemo &rest anything-args)
"`anything' with migemo extension.
With prefix arugument, `anything-pattern' is migemo-ized, otherwise normal `anything'."
(interactive "P")
(let ((anything-use-migemo with-migemo))
(apply 'anything anything-args)))
(defvar anything-previous-migemo-info '("" . "")
"[Internal] Previous migemo query for anything-migemo.")
(defun* anything-string-match-with-migemo (str &optional (pattern anything-pattern))
"Migemo version of `string-match'."
(unless (string= pattern (car anything-previous-migemo-info))
(setq anything-previous-migemo-info (cons pattern (migemo-get-pattern pattern))))
(string-match (cdr anything-previous-migemo-info) str))
(when (memq 'anything-compile-source--match-plugin anything-compile-source-functions)
(defun* anything-mp-3migemo-match (str &optional (pattern anything-pattern))
(loop for (pred . re) in (anything-mp-3-get-patterns pattern)
always (funcall pred (anything-string-match-with-migemo str re))))
(defun anything-mp-3migemo-search (pattern &rest ignore)
(anything-mp-3-search-base migemo-forward migemo-forward bol eol))
(defun anything-mp-3migemo-search-backward (pattern &rest ignore)
(anything-mp-3-search-base migemo-backward migemo-backward eol bol)))
(defun anything-compile-source--migemo (source)
(if (not (featurep 'migemo))
source
(let* ((match-identity-p
(or (assoc 'candidates-in-buffer source)
(equal '(identity) (assoc-default 'match source))))
(use-match-plugin
(memq 'anything-compile-source--match-plugin anything-compile-source-functions))
(matcher (if use-match-plugin
'anything-mp-3migemo-match
'anything-string-match-with-migemo))
(searcher (if (assoc 'search-from-end source)
(if use-match-plugin
'anything-mp-3migemo-search-backward
'migemo-backward)
(if use-match-plugin
'anything-mp-3migemo-search
'migemo-forward))))
(cond (anything-use-migemo
`((delayed)
(search ,@(assoc-default 'search source) ,searcher)
,(if match-identity-p
'(match identity)
`(match ,matcher
,@(assoc-default 'match source)))
,@source))
((assoc 'migemo source)
`((search ,searcher)
,(if match-identity-p
'(match identity)
`(match ,matcher))
,@source))
(t source)))))
(add-to-list 'anything-compile-source-functions 'anything-compile-source--migemo t)
(defmacro anything-migemize-command (command)
"Use migemo in COMMAND when selectiong candidate by `anything'.
Bind `anything-use-migemo' = t in COMMAND."
`(defadvice ,command (around anything-use-migemo activate)
(let ((anything-use-migemo t)) ad-do-it)))
(dont-compile
(when (fboundp 'expectations)
(expectations
(desc "match")
(expect '(("TEST" ("日本語")))
(let ((anything-use-migemo t))
(anything-test-candidates
'(((name . "TEST")
(candidates "日本語")))
"nihongo"
'(anything-compile-source--migemo))))
(desc "candidates buffer")
(expect '(("TEST" ("日本語")))
(let ((anything-use-migemo t))
(anything-test-candidates
'(((name . "TEST")
(init
. (lambda () (with-current-buffer (anything-candidate-buffer 'global)
(insert "日本語\n"))))
(candidates-in-buffer)))
"nihongo"
'(anything-compile-source--candidates-in-buffer
anything-compile-source--migemo))))
(desc "migemo attribute")
(expect '(("TEST" ("日本語")))
(let ((anything-use-migemo nil))
(anything-test-candidates
'(((name . "TEST")
(candidates "日本語")
(migemo)))
"nihongo"
'(anything-compile-source--migemo))))
(expect '(("TEST" ("日本語")))
(let ((anything-use-migemo nil))
(anything-test-candidates
'(((name . "TEST")
(init
. (lambda () (with-current-buffer (anything-candidate-buffer 'global)
(insert "日本語\n"))))
(candidates-in-buffer)
(migemo)))
"nihongo"
'(anything-compile-source--candidates-in-buffer
anything-compile-source--migemo))))
(desc "search-from-end attribute")
(expect '(("FOO" ("日本語入力" "日本語会話")))
(let ((anything-use-migemo nil))
(anything-test-candidates '(((name . "FOO")
(init
. (lambda ()
(with-current-buffer (anything-candidate-buffer 'global)
(insert "日本語会話\n日本語入力\n"))))
(candidates-in-buffer)
(migemo)
(search-from-end)))
"nihongo"
'(anything-compile-source--candidates-in-buffer
anything-compile-source--migemo))))
(expect '(("FOO" ("日本語入力" "日本語会話")))
(let ((anything-use-migemo t))
(anything-test-candidates '(((name . "FOO")
(init
. (lambda ()
(with-current-buffer (anything-candidate-buffer 'global)
(insert "日本語会話\n日本語入力\n"))))
(candidates-in-buffer)
(search-from-end)))
"nihongo"
'(anything-compile-source--candidates-in-buffer
anything-compile-source--migemo))))
(desc "with anything-match-plugin")
(expect '(("FOO" ("日本語入力")))
(let ((anything-use-migemo nil))
(anything-test-candidates '(((name . "FOO")
(init
. (lambda ()
(with-current-buffer (anything-candidate-buffer 'global)
(insert "日本語会話\n日本語入力\n"))))
(candidates-in-buffer)
(migemo)))
"nihongo nyuuryoku"
'(anything-compile-source--candidates-in-buffer
anything-compile-source--match-plugin
anything-compile-source--migemo))))
(expect '(("FOO" ("日本語入力")))
(let ((anything-use-migemo t))
(anything-test-candidates '(((name . "FOO")
(init
. (lambda ()
(with-current-buffer (anything-candidate-buffer 'global)
(insert "日本語会話\n日本語入力\n"))))
(candidates-in-buffer)))
"nihongo nyuuryoku"
'(anything-compile-source--candidates-in-buffer
anything-compile-source--match-plugin
anything-compile-source--migemo))))
(expect '(("FOO" ("日本語入力")))
(let ((anything-use-migemo nil))
(anything-test-candidates '(((name . "FOO")
(init
. (lambda ()
(with-current-buffer (anything-candidate-buffer 'global)
(insert "日本語会話\n日本語入力\n"))))
(candidates-in-buffer)
(search-from-end)
(migemo)))
"nihongo nyuuryoku"
'(anything-compile-source--candidates-in-buffer
anything-compile-source--match-plugin
anything-compile-source--migemo))))
(expect '(("FOO" ("日本語入力")))
(let ((anything-use-migemo t))
(anything-test-candidates '(((name . "FOO")
(init
. (lambda ()
(with-current-buffer (anything-candidate-buffer 'global)
(insert "日本語会話\n日本語入力\n"))))
(candidates-in-buffer)
(search-from-end)))
"nihongo nyuuryoku"
'(anything-compile-source--candidates-in-buffer
anything-compile-source--match-plugin
anything-compile-source--migemo))))
(expect '(("TEST" ("日本語入力")))
(let ((anything-use-migemo nil))
(anything-test-candidates
'(((name . "TEST")
(migemo)
(candidates "日本語入力")))
"nihongo nyuuryoku"
'(anything-compile-source--match-plugin anything-compile-source--migemo))))
(expect '(("TEST" ("日本語入力")))
(let ((anything-use-migemo t))
(anything-test-candidates
'(((name . "TEST")
(candidates "日本語入力")))
"nihongo nyuuryoku"
'(anything-compile-source--match-plugin anything-compile-source--migemo))))
)))
(provide 'anything-migemo)