consult-ripgrep と migemo を組み合わせて ripgrep でもローマ字日本語検索

consult-ripgrep と migemo を組み合わせて ripgrep でもローマ字日本語検索 の派生。

TL;DR

;; -*- lexical-binding: t -*-

(defun consult--migemo-regexp-compiler (input type)
  (setq input (mapcar #'migemo-get-pattern (consult--split-escaped input)))
  (cons (mapcar (lambda (x) (consult--convert-regexp x type)) input)
        (when-let (regexps (seq-filter #'consult--valid-regexp-p input))
          (lambda (str)
            (consult--highlight-regexps regexps str)))))
(setq migemo-options '("--quiet" "--nonewline" "--emacs"))
(setq consult--regexp-compiler #'consult--migemo-regexp-compiler)
Lexical Binding が有効でないとエラーになります。

cosult-ripgrep の仕組み

consult-ripgrep で指定する文字列は、 こちら にあるように構造化されている。

特に #first#second といった指定の場合に、 デフォルトでは区切り文字の前半(例の first の部分)は基本的にそのまま rg に渡され、 後半(例の second の部分)は rg の結果について更に Emacs 上で絞り込む、といった挙動になる ( 基本的に、と書いたのは Emacs の正規表現から rg に渡せる正規表現に変換してくれるという counsel-rg と同じ似たような機構が備わっているから。この辺 )。

後者については completion-styles の指定通りの補完スタイルが適用される為、 consultをmigemoizeしたい (未完→だいたいできた) - ワタタツの日記!(2021-06-15) の記事にあるように completion-styles を設定していれば migemo が使用されるが、 前者については consult-ripgrep 独自の仕組みなので completion-styles には影響されない。

consult--regexp-compiler

consult-grep の DOCSTRING に以下の記載がある:

In order to disable transformations of the grep input, adjust `consult–regexp-compiler' accordingly.

デフォルトの実装 はこんな感じ:

(defun consult--default-regexp-compiler (input type)
  "Compile the INPUT string to a list of regular expressions.
The function should return a pair, the list of regular expressions and a
highlight function. The highlight function should take a single argument, the
string to highlight given the INPUT. TYPE is the desired type of regular
expression, which can be `basic', `extended', `emacs' or `pcre'."
  (setq input (consult--split-escaped input))
  (cons (mapcar (lambda (x) (consult--convert-regexp x type)) input)
        (when-let (regexps (seq-filter #'consult--valid-regexp-p input))
          (lambda (str)
            (consult--highlight-regexps regexps str)))))

入力文字列から最終的に rg に渡される文字列を組み立てているここに、介入余地がある。

ということで、冒頭のような設定を行い、 migemo 対応版の consult--regexp-compiler を指定してやればよい。

consult--regexp-compiler はその命名からも分かる通り、あくまで内部変数のようである。 その為、今後の更新によって使えなくなる可能性も十分にある。
yewton
yewton
ソフトウェアエンジニア

父親兼エンジニア

comments powered by Disqus

関連項目