Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away