IdeaVIMで編集モード復帰時に強制的にInput MethodをOFFるようにした

タイトルで終了。

香り屋版VimやMacVimがこれできて大変便利だったので,ふと「IdeaVIMでも出来ないかな」と思ったのが運の尽き。ちょいと調べてみたらJavaでInput Methodを制御するのは難しい(できない?)らしく,このこの辺参考にしながら試行錯誤してみた。


つまるところ,

  • Javaで統一的なInput Method制御用APIはない。
  • Windowsの場合,たまたまJava IMFIMEのON/OFFに連動する。
  • Mac OS XLinuxみたくJava IMFの実装が残念な場合はawtのRobot使ってInput Methodの切替キーを送信して誤魔化す。

...なんですと。プラットフォームによって実装が異なるってのと,Robotでキーイベントを送信する実装のあやうさもあって,Windowsだけで動きゃいいや程度で弄ってたつもりが,Windows/Mac OS X両対応版ができてしまった(一体何が起こったのか...略


人柱になりたい方はこちらからどぞ(20120925版がそれ。
Downloads · masanobuimai/ideavim · GitHub


とは言え,胡散臭い実装なのは確かなので,とあるシステムプロパティが設定されてなければ機能しないようにしといた。"ideavim.imcontrol"ってのが無ければいつも通り,その値が "windows""osx"かで,それぞれの実装コードが動く(システムプロパティからプラットフォームを自動判別できたけど,そこまで凝るもんでも無いので,この辺はだいぶ手抜き実装。


システムプロパティ:"ideavim.imcontrol"は,$HOME/_ideavim.groovyで定義しちゃうのが簡単かと。

// Input Method制御のおまじない( windows / osx )
System.properties["ideavim.imcontrol"] = "windows"


あとMac OS Xで使う場合は,OSの設定も合わせてやっとかないとダメで「システム環境設定」の「キーボード」を開いて「キーボードと文字入力」の「入力メニューの次のソースを選択」を有効にしとく。要はRobot経由でopt+cmd+SPACEを送信するため、それに応えられるようにしとかないとダメって事(どうもcmd+SPACEはRobot側が都合が悪いそうな。


そんな仕込みをしといて、Mac OS Xで動かしてみると、編集モードに復帰するたび入力ソース(Input Method)のアイコンがくるくる動いてU.S.になる。
 → 


やってる事は単純でInput MethodがU.S.になるまで、opt+cmd+SPACEのキーイベントを送信してくだけ、というしろもの(一応、10回チャレンジしてダメだったら諦めてる)。たぶん、LinuxもInput Methodの切替キーが分かれば似たような実装でイケるんだと思う。


ps.
ちなみに、これはあまりにも実装がアレ過ぎるので本家にpull request送るつもりはないよ。