Windowsで:set encoding=utf-8する方法

Vimの'encoding'オプションはVimが内部で扱うエンコーディングを設定する。この値がcp932やsjisなどだと、ユニコード文字が表示できない。今時ユニコード文字の表示なんてメモ帳でもできる。メモ帳に負けていいのか!否!

と言うわけで是非とも:set encoding=utf-8で使いたいわけだが、Windowsでこれをやるとシステムメッセージなどが見事に文字化けする*1。で、これを回避する方法*2

  • 言語ファイルを入手する
  • 中身からja.poを取り出し、UTF-8に変換する。
    • ja.sjis.poもあるが、これはダメ。中にダメ文字を回避するバックスラッシュが入ってる。
    • Vimでやる場合は、ja.poをVimで開き、 :setl fenc=utf-8 して保存。
  • poファイルをmoファイルに変換する。
  • $VIMRUNTIME/lang/ja_JP.UTF-8/LC_MESSAGES ディレクトリを作り、そこにさきほどのmoファイルを vim.mo と言う名前で配置する。
    • Windows的にはja_JP.65001とかの方がいいのかも?よくわかってないけどこれでできたので気にしないことにする。
  • .vimrc で以下のように設定する。
let $LANG='ja_JP.UTF-8'
set encoding=utf-8
    • $LC_ALLでも大丈夫だった。

以上の手順で :set encoding=utf-8 しても文字化けしないはず!

ちなみに、 :language って言うコマンドもあるんだけど、これで設定しようとしてもエラーがでる。

:language ja_JP.UTF-8
E197: 言語を "ja_JP.UTF-8" に設定できません

なんでだろう。よくわかってない。

最後に、vimrcのエンコーディングに注意。例えば、 'statusline' にマルチバイト文字が含まれている場合、vimrcのエンコーディングutf-8じゃないと文字化けする。vimrcの文字コードを変更するか、iconv()関数で変換する必要がある。
注意2。使用しているフォントがユニコードに対応してないとやっぱり表示できない。その場合は'guifont'オプションで設定する。

*1:少なくとも私の環境では文字化けした

*2:英語メッセージを使えという突っ込みはなしの方向で