Linuxbrewに日本語のロケールを入れる

tmuxはデフォルトではUnicodeの曖昧な文字幅に対応していないので、パッチを入れるかあきらめるかで対処しなければならなかったのだが、最近はLinuxbrewというMacのHomebrew互換のパッケージマネージャ用にパッチ済みのtmuxの設定(Formula)を用意してくれている人がいるようだ。

最高なのでそれを使わせてもらおうとLinuxbrewを入れるところから始めたら、ロケール周りではまった。

tmuxは変なロケールで起動しようとすると、フォールバックなどせず以下のようなメッセージを出して落ちる。

tmux: invalid LC_ALL, LC_CTYPE or LANG

Linuxbrewで、こちらのFormulaを使ってtmuxを入れると、なぜかこの問題が起きる。試しにlocaleを実行して確認してみると、以下のような警告が出た。

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

結論から言うと、システムではja_JP.UTF-8が存在するが、Linuxbrewで入ったglibc周りでは存在しないということだった。

Linuxbrewでは、glibcが入るときにロケールを無視するらしい。詳しくはわからないのだが、どうもLinuxbrewは環境変数をフィルタリングするらしい。

以下のようにして、glibcインストール後のlocaledefなどの処理を再実行すると必要なロケールが入る。

HOMEBREW_NO_ENV_FILTERING=1 brew postinstall glibc

なおこの機能にはちょっとしたバグがあり、環境変数から雑にcharmap, localeの名前を取得しているため、ja_JP.utf8のような設定になっていると上記のコマンドがエラーになる。

この場合は、ロケールを再設定する。あるいは以下のようにlocaledefを手動で実行してもいいかもしれない。

localedef -i ja_JP -f UTF-8 ja_JP.utf8

ちなみに入れたパッチ済みtmuxはこちら。便利。あとLinuxbrewもバグったところ以外は便利な感じなので今後もいろいろ使ってみたい。