Macで漫然とRubyをインストールすると、rails consoleやirbで日本語を使えないことがある。(どうなるかというと、日本語の変換を確定した途端に「\U+FFE3\U+FFAB」みたいにUnicodeのエスケープっぽいものが表示される。)そうなった時の直し方を説明する。
なぜ日本語を使えないのか
大雑把に言うと、Macに付属しているコマンドライン処理のライブラリ(libedit)が日本語に対応していないから。これを使わず、libreadlineを使うようにすれば直る。
誰がlibeditを使っているのか
Rubyをインストールしたディレクトリのどこかにあるreadline.bundleが使っている。findコマンドを使えば見つけられる。例えば、rbenvを使ってRubyをインストールしたなら、下のコマンドで見つかるだろう。
$ find ~/.rbenv/versions -name readline.bundle
例として、ここでは下のパスにreadline.bundleがあったものとする。
~/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/readline.bundle
readlineをインストールする
homebrewやmacportでインストールすればいい。例えば、homebrewなら下のようにする。
$ brew install readline
どうやってreadlineを使わせるのか
install_name_toolというコマンドを使う。readline.bundleというのはライブラリのエイリアスみたいなもので、別の場所にある実体を参照しているだけである。よって、install_name_toolでreadline.bundleにreadlineを使わせればいい。同時に、libeditから切り離す必要もある。
install_name_toolを実行するには、readlineとlibeditの正確なパスを知る必要がある。readlineのライブラリファイルは下のようなパスにインストールされたはずだ。
/usr/local/Cellar/readline/(readlineのバージョン)/lib/libreadline.dylib
例えばreadline-6.2.4をインストールしたなら、下のようになる。
/usr/local/Cellar/readline/6.2.4/lib/libreadline.dylib
libeditはどこにあるのか
otoolというコマンドで知ることができる。otoolはLinuxにおけるlddの役割を果たす。つまり、readline.bundleが参照している実体を調べられる。今回の例なら、下のように実行すればいい。
$ otool -L ~/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/readline.bundle
するとlibedit.dylibのパスが表示される。ここでは以下のように表示されたとする。
/usr/lib/libedit.3.dylib
このlibeditとreadline.bundle別れさせ、libreadlineとくっつければいい。
install_name_tool
いよいよ大詰め。install_name_toolではダイナミックライブラリに関する様々な操作が可能だが、今回は-changeというオプションで参照先の変更を行う。文法は下の通り。
$ install_name_tool -change 削除するパス 新しいパス bundleファイル
今回の例なら下のようになる。
$ install_name_tool -change /usr/lib/libedit.3.dylib /usr/local/Cellar/readline/6.2.4/lib/libreadline.dylib ~/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/readline.bundle
これでrails cなりirbなり起動してみればいい。日本語を入力すればその通りに表示されるはずである。