Emacs ctrlf を migemo 対応にしてみた!

最近emacsのパッケージ管理には、straightを使っています。 その作者が Isearch や Swiper、helm-swoop に代わる、ctrlf というパッケージをリリースしていたので、試しに使ってみました。

github.com

基本的な操作感は Isearch と同じですが、オーバーレイ表示で検索にヒットした数と何番目の検索位置にいるのかわかるのは便利だと思いました。残念なのは、日本語をインクリメンタルサーチができる migemo に対応してないことでした。

ドキュメントを読むと、ctrlf-style-alist に設定を追加すれば migemo が使えそうでした。 試行錯誤の結果、以下の設定を追加することで、ctrlf からも migemo することができました。

   (add-to-list 'ctrlf-style-alist '(ctrlf-migemo . (:prompt "Migemo"
                                                    :translator migemo-search-pattern-get
                                                    :case-fold ctrlf-no-uppercase-regexp-p)))

あとは ctrflを実行中に、サーチスタイルを C-o s で Migemo に変更できます。

最初から migemo 検索したい時は・・・

  (defun ctrlf-forward-migemo ()
    (interactive)
    (ctrlf-forward 'ctrlf-migemo))

・・・のような関数を定義しておけばOKでした。

とはいえ、今のところ helm-swoop を置き換えられないので、Isearch に戻したい時もあります。(^^;

いちいち M-x するのも面倒なので、オン・オフ用関数もついでに作成しました。

  (defun toggle-ctrlf-mode ()
      (interactive)
      (if ctrlf-mode
          (progn
            (ctrlf--delete-all-overlays) ;; これを実行しないと Isearch から helm-swoop した時に画面表示がおかしくなる。 
            (ctrlf-mode -1)
            (message "ctrlf disabled"))
        (progn
          (ctrlf-mode +1)
          (message "ctrlf enabled"))))