最近不調だった:sコマンドを直してみた
いつの頃からはもう忘れてしまったが,IdeaVIMでexコマンドの:sを使うと,もれなくArrayOutOfBoundsExceptionが出て動かなくなってしまってた。困ったなー,しかたないなーと思いつつ,ずーっと放置してたんだけど,今日ちょっとその気になったので調べてみたら,意外とあっさり解決した。:-)
ただし,原因は結構オカルト。ArrayOutOfBoundsExceptionを送出していた犯人は,[http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/CharSequence.html#subSequence(int,%20int):title=CharSequence.subSequence(int, int)]
(実体はjava.nio.StringCharBuffer
)なんだけど,どうゆうわけかJava5では普通に動き,Java6になるとArrayOutOfBoundsExceptionを吐く。
やらしいことに,問題のコードだけ抜き出したミニプロで再現させようとすると再現しない。なに,このオカルト。
仕方ないんで,IdeaVIM側のCharPointerクラス(com.maddyhome.idea.vim.regexp)
を下記のように直してお茶を濁す。
CharSequence cs2 = str.seq.subSequence(str.pointer, str.normalize(str.pointer + len)); ↓ CharSequence cs2 = str.seq.toString().substring(str.pointer, str.normalize(str.pointer + len));
まー,なんというしょっぱいパッチだ。それに説明めんどくさくて本家にパッチ送れない。:-P
ps.
IdeaVIM,できたらGitHubあたりにソース移してほしいな。どーも,sf.netにあるのとplugins.intellij.netにあるのと,jarを逆コンパイルしたのとで,どれもビミョーにコードベースが違ってるようなんだよねー。HEADブランチは一体どこにあるんだ!?