jlineで日本語を使えるようにする。
つい最近会社のボスがLuceneに付いてくるlucliというコマンドラインツールで日本語が使えないとなげいてました。どうやらこれが使っているjlineというライブラリが日本語を通さないからみたいです。というわけで日本語を通すパッチを作ってみました。
jline(http://sourceforge.net/projects/jline/)はJavaで書かれたreadlineのようなライブラリです。これを使うとラインエディットしたり補完したりといったのをJavaで書けるようになるみたいです。
このパッチを当てるとjlineで日本語の入力ができるようになります。ただし、カーソルの移動まわりに手を入れていないので、日本語を入れてから前に戻ると半分ずつ戻ったりします。多分ConsoleReader#moveInternal()でバイト数と同じだけBACKSPACEを入れてあげれば直ると思うので誰か直してください。
パッチはjlineのHEADへのパッチなんで、gitなりcvsなりでHEADのソースコードを落としてから当てて下さい。
jarを作るときは以下のようにすれば作れます:
mvn package
ただしひとつ罠があって、ConsoleReaderTestのテストが通らないのでパッケージが作れません。src/jline/src/test/java/jline/ConsoleReaderTest.javaを適当な名前に変えるなりして無理矢理パッケージを作ってしまうのが良いと思います。
動作確認をするにはsrc/test/java/jline/example/Example.javaがあるので、以下のようにすれば試せます:
java -cp "target/classes/;target/test-classes/" jline.example.Example
最後にこのパッチが何をやっているかを簡単に説明しておきます。
- WindowsTerminal.ReplayPrefixOneCharInputStreamがMS932に対応していなかった。
- 対応させた。
- WindowsTerminal.ReplayPrefixOneCharInputStream#read()がIMEからの入力を最初の1バイトしか読んでくれなかった。
- nativeのreadByteを呼んでいなかったので呼べるようにした。
こんな感じです。
最後の最後に悲しいおしらせです。せっかくjlineを日本語対応させたにの、lucliで日本語を入れると勝手1文字ずつ空白に区切られてしまいました。
と思ったらanalyzerにCJKAnalyzerを指定してなかっただけでした。lucliを起動してから以下のようにすれば日本語で検索できるようです:
lucli> analyzer org.apache.lucene.analysis.cjk.CJKAnalyzer
lucli編につづかない。
- Category(s)
- java