どういうこと?
WindowsでEmacsとripgrepを組み合わせて使いたいとします。
このとき、Emacsでは (prefer-coding-system 'utf-8-unix)
と設定しています。
また rg
へのパスは通しているものとします。
この状態でEmacsから ripgrep-regexp
や consult-ripgrep
など、rg
コマンドで日本語を含んだ検索をしようとしても、うまく動作しません。
どうして?
Windowsのプロセスはcp932で受けとるからです。
どうした?
対象の関数のときだけで coding-system-for-write
を切り替えると動作しました。
例えば consult-ripgrep
なら
(defun advice:with-cp932 (orig-fun &rest args)
(setq coding-system-for-write 'cp932)
(apply orig-fun args)
(setq coding-system-for-write 'utf-8-unix)) ; 使っているcoding-systemに戻す
(advice-add 'consult-ripgrep :around 'advice:with-cp932)
とすれば動作しました。
なお、consult-ripgrep
中に C-g
すると、 coding-system-for-write
が cp932
のままになります。とりあえず、
(add-hook 'before-save-hook (lambda () (setq coding-system-for-write 'utf-8-unix)))
として、むりやり coding-system-for-write
を戻しています。
うまいやりかたを知っていたら教えてください。