VimのQuickFixモードで読み取る文字コード(エンコーディング)

MS VC++のcl.exeが常に日本語メッセージをShift-JISで出しくさるとか,cygwinのmakeがデフォルトではやはり日本語メッセージを出しくさるとか,うざい状況が色々ある.VimのQuickFixモードではエディタ内でそれらのコマンドを実行し,帰ってきたエラー・メッセージを解釈してエラーの行にジャンプとか便利な機能が色々あるのだが,それが文字化けでうまく働かなくなってしまう.Vimには様々な部分でテキストのエンコーディングを変更したりするオプションがあるがQuickFixには付いてない.そこで外部のフィルタ(とりあえずnkf)を噛ませる.多分,以下が最も楽で汎用性がある.

set shellpipe=2>\&1\|/tex/bin/nkf\ -w>%s

'&' と '|' はVimスクリプトで特別な意味を持つのでオプションの値に含めるには '\' でエスケープしなければならない.要するに(例えば)

/cygwin/bin/make -kr 2>&1|/tex/bin/nkf -w>(一時ファイル)

のようにコマンドが実行される仕掛け.私はVim全体の基本となるエンコーディングとしてUTF-8を使っているのでnkfにもUTF-8で出力させている (-w).nkfTeXのall-in-oneインストーラで一緒に入った(んだっけ?)やつを使ってみた.

なおMS .NET FrameworkのC#コンパイラ csc.exe だとUTF-8で出すオプションが一応ある.本当は扱いやすい英語がいいんですが...

またGNU gettext系だと日本語メッセージを格納している /usr/share/locale/ja/LC_MESSAGES/foo.moCygwinなら\cygwin\usr\share\locale\ja\LC_MESSAGES\foo.mo)を foo.mo.bak にリネームしてしまえば「make: 入ります ディレクトリ」とかの悪名高い*1うざい翻訳メッセージを目にしなくて済む(翻訳者の方,すみません...).

*1:今はもう直ってるみたい?