1年ほど前からavy-migemoのメンテナンスが止まり、最新のswiperではmigemoが機能しなくなってしまいました。やむなくisearch-migemoで代用していたのでが、つい最近、下記のTipsを見つけて試したところ実に快適なので皆様にもご紹介します。
私の場合、Tipsにあるコードを下記のとおりそのままコピーして、あっさり動いてくれました。スペース区切りの複数keywordにも賢く対応します。
(defun my:ivy-migemo-re-builder (str)
"Own function for my:ivy-migemo."
(let* ((sep " \\|\\^\\|\\.\\|\\*")
(splitted (--map (s-join "" it)
(--partition-by (s-matches-p " \\|\\^\\|\\.\\|\\*" it)
(s-split "" str t)))))
(s-join "" (--map (cond ((s-equals? it " ") ".*?")
((s-matches? sep it) it)
(t (migemo-get-pattern it)))
splitted))))
(setq ivy-re-builders-alist '((t . ivy--regex-plus)
(swiper . my:ivy-migemo-re-builder)))
※ 当然ながらmigemo自体の設定は機能することが前提です。
swiperの設定
regionからでも機能するように下記のように設定しています。以前は、swiper-isearch で動作していたのですが、なぜか躓くようになりました。私の場合、さほど巨大サイズのファイルを扱わないのでswiperのほうが使いやすい感じがしています。
(bind-key
"C-s"
(defun swiper-migemo-or-region ()
"If region is selected, `swiper-thing-at-point' with the keyword selected in region.
If the region isn't selected, `swiper' with migemo."
(interactive)
(if (not (use-region-p))
(swiper)
(swiper-thing-at-point))))
swiper-thing-at-pointの単体機能もごくたまに使うので別にキーバインドしています。こちらだけでもregionには対応するので我慢できるのですが、私の場合、連続した日本語文章から検索するケースが多いので上記をメインに使っています。
(bind-key "C-M-s" 'swiper-thing-at-point)
counsel-webとの連携を試す
emacsからのWEB検索は、いろいろあって、google-this, web-searchなどを使っていましたが、counsel-web という面白そうなpackegeを見つけました。
keyword検索すると検索結果のリストがミニバッファーに表示されて選択すると、あらかじめ設定したプラウザ(w3m, browse-urlなど)でそのページが開かれるというものです。検索エンジンはdefaultは、DuckDuckGoですが、設定でgoogleにすることもできます。
複数キーワードもOKなのでプラウザで検索するのと同じ感覚なのですが、emacsを離れることなくつかえるのがみそでしょうか。さほど魅力があるとは思わなかったのですが、これに先の独自関数を紐つけてやるとmigemo検索が可能になるので試してみたところ、じつに楽しいtoolに変身します。ぜひお試しください。
(leaf counsel-web
:ensure t
:bind ("s-s" . counsel-web-suggest)
:config
(setq counsel-web-search-action #'browse-url
counsel-web-engine 'google)
:init
(defun my:ivy-migemo-re-builder (str)
"Own function for my:ivy-migemo."
(let* ((sep " \\|\\^\\|\\.\\|\\*")
(splitted (--map (s-join "" it)
(--partition-by (s-matches-p " \\|\\^\\|\\.\\|\\*" it)
(s-split "" str t)))))
(s-join "" (--map (cond ((s-equals? it " ") ".*?")
((s-matches? sep it) it)
(t (migemo-get-pattern it)))
splitted))))
(setq ivy-re-builders-alist '((t . ivy--regex-plus)
(counsel-web . my:ivy-migemo-re-builder)
(swiper . my:ivy-migemo-re-builder))))
PS:counsel-rgでも機能するようですが私は試していません。counsel-agは駄目でした。