Personal tools
You are here: Home ブログ sugawara
« January 2011 »
Su Mo Tu We Th Fr Sa
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
Recent entries
jlineで日本語を使えるようにする。 sugawara 2009-12-10
五反田Emacsの資料 sugawara 2009-10-19
trac-ticket.el sugawara 2007-11-19
Emacs Lisp 勉強会(バッファとウィンドウ編) sugawara 2007-10-22
Categories
Emacs
勉強会
java
 
Document Actions

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編につづかない。

jline-ime.patch jline-ime.patch
Size 2.9 kB - File type text/x-patch
Category(s)
java

Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.