Skip to content
2009/01/24 / highmt

utf8 cygwin + lgrep on Meadow

にMeadowでlgrepを使う設定を書いたのだけれども
正しくなかった。

(setq grep-command '("lgrep -Ku8 -Ou8 -n '' *" . 21))
(setq grep-find-command '("find . -type f -exec lgrep -Ku8 -Ou8 -n '' {} NUL \\;" . 42))
(defadvice grep (around grep-coding-setup activate)
  (let ((coding-system-for-read 'utf-8))
    ad-do-it))

lgrepは、ファイルパスを決まったエンコーディングで出力するので
そのエンコーディングとファイル自体のエンコーディングが一致しないとき
違うエンコーディングが混ざってしまって変換がうまくいかないみたい。
どの層でうまくいってないのかは追えてない。

*grep*バッファの結果をどうやったら正しいエンコーディングで表示できるのだろう。
set-buffer-file-conding-systemだと保存用のエンコーディングが変更されるだけだし、
recode-regionだと編集不可能なのではじかれるし。
いろいろ試していると
revert-buffer-with-coding-systemで欲しいエンコーディングの下でgrepを再実行してくれることに気づいた。
元となるファイルがないとrevert-bufferは弾かれるという意識があったのでこれは盲点だった。

ということはrevert-buffer-with-coding-systemでなにか細工しているわけで、
見ると

(let ((coding-system-for-read coding-system))
  (revert-buffer))

ということをやっていた。coding-system-for-readってなんだ?

Specify the coding system for read operations.
It is useful to bind this variable with `let’, but do not set it globally.
If the value is a coding system, it is used for decoding on read operation.

なるほど。

というわけで結局、

  • lgrepは-Ou8として常に(ファイルパスと同じ)utf-8で出力させる。
  • grepにaroundアドバイスを定義してgrepを新しいcoding-system-for-readの下で動かす。

動的エクステントってこういうときには役に立つのだなー。

広告
%d人のブロガーが「いいね」をつけました。