LoginSignup
7
6

More than 1 year has passed since last update.

avy-migemoを使わずにswiper-migemoを実現する

Last updated at Posted at 2020-06-19

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に変身します。ぜひお試しください。

スクリーンショット_2020-06-19_17-49-57.png

(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は駄目でした。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6