irbの日本語 2月17日, 2014


Mavericksになって、久しぶりにirbを起動してみたら日本語文字列が使用できない。これはirbが使用するlibeditが日本語を理解できないためらしい。解消する手順はネット上にも記事が多くさまざまな方法があるようで、要するにlibeditをGNUreadlineに入れ替えればよいということのよう。HomebrewやMacPortsを好まないのは少数派のようだな。以下は特にユニークな内容ではない自分用メモ。

■まず、日本語を理解してくれるGNUreadlineをcompile

$ mkdir work; cd work
$ curl -O http://www.ring.gr.jp/pub/GNU/readline/readline-6.2.tar.gz
$ tar xzvf readline-6.2.tar.gz; cd readline-6.2
$ ./configure CFLAGS="-arch i386 -arch x86_64" LDFLAGS="-arch i386 -arch x86_64"
$ sed -i "" -e 's|-dynamic|-dynamiclib|' -e 's|-arch_only `/usr/bin/arch`||' shlib/Makefile
$ make; sudo make install
$ ls -F /usr/local/lib/libreadline*
/usr/local/lib/libreadline.6.2.dylib*
/usr/local/lib/libreadline.6.dylib@
/usr/local/lib/libreadline.dylib@
/usr/local/lib/libreadline.a

■次に、libedit.3.dylibをつないでいるreadline.bundleを探す

$ find / -type f -name readline.bundle -print 2>/dev/null
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/
    universal-darwin13.0/readline.bundle
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/
    universal-darwin13/readline.bundle

この’1.8’の下は以前のバージョンのものなので、’2.0’の下が問題のもののはず。

■ライブラリの指定を確認する

$ cd /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/
     universal-darwin13/
$ otool -L readline.bundle
readline.bundle:
    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby
        .2.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
    /usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

この/usr/lib/libedit.3.dylilbを/usr/local/lib/libreadline.6.dylibに変更すればよいはず。

■ライブラリの指定を入れ替える

$ sudo cp -p readline.bundle readline.bundle.BK
$ sudo install_name_tool -change \
    /usr/lib/libedit.3.dylib /usr/local/lib/libreadline.6.dylib \
    readline.bundle

■結果を確認する

$ otool -L readline.bundle
readline.bundle:
    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib
      (compatibility version 2.0.0, current version 2.0.0)
    /usr/local/lib/libreadline.6.dylib (compatibility version 2.0.0, current version 3.0.0)
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

■irbの動作確認

$ irb
irb(main):001:0> name="あ"
=> "あ"
irb(main):002:0> 

よし、OK//