helm-migemo.el(レビュー) は、 helm でMigemo(レビュー) を使うことで
ローマ字で日本語文字列の候補選択を行う日本人必携のパッケージです。
しかし、 match-part 属性という表示文字列の一部にマッチさせる機能に
helm-migemo.elとhelm.elが対応していないので
Emacs24.4標準のnadvice.el で修正しました。
なお、この修正が必要なのは以下のように
migemo 属性と match-part 属性を併用している
情報源を定義している場合のみです。
(defvar helm-source-foo '((name . "foo") (match-part . helm-foo-match-part) (migemo) ...))
helmパッケージに入っている情報源ではこのケースはないので、
自分で情報源を作っている人で困ったら以下のファイルをrequireしてください。
(require 'mylisp-helm-migemo-match-part-fix)
設定 mylisp-helm-migemo-match-part-fix.el(以下のコードと同一)
(require 'helm) (require 'helm-migemo) (defvar helm-match-part-use-migemo nil) (defun helm-search-from-candidate-buffer--migemo-p (_ _ _ _ _ _ source) (setq helm-match-part-use-migemo (assq 'migemo source))) (advice-add 'helm-search-from-candidate-buffer :before 'helm-search-from-candidate-buffer--migemo-p) ;;; REDEFINED (defun helm-search-match-part--use-migemo (candidate pattern match-part-fn) "Match PATTERN only on part of CANDIDATE returned by MATCH-PART-FN. Because `helm-search-match-part' maybe called even if unspecified in source (negation), MATCH-PART-FN default to `identity' to match whole candidate. When using fuzzy matching and negation (i.e \"!\"), this function is always called." (let ((part (funcall match-part-fn candidate)) (match-fn (if helm-match-part-use-migemo (lambda (re str) (helm-string-match-with-migemo str re)) 'string-match)) (fuzzy-regexp (cadr (gethash 'helm-pattern helm--fuzzy-regexp-cache)))) (if (string-match " " pattern) (cl-loop for i in (split-string pattern) always (if (string-match "\\`!" i) (not (funcall match-fn (substring i 1) part)) (funcall match-fn i part))) (if (string-match "\\`!" pattern) (not (funcall match-fn (if helm--in-fuzzy ;; Fuzzy regexp have already been ;; computed with substring 1. fuzzy-regexp (substring 1 pattern)) part)) (funcall match-fn (if helm--in-fuzzy fuzzy-regexp pattern) part))))) (advice-add 'helm-search-match-part :override 'helm-search-match-part--use-migemo) (provide 'mylisp-helm-migemo-match-part-fix)
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。