[vim][tips] VimとIBusの vi協調モード

IBusには vi協調モードがありますがVimを使っていたら、どうもバグ臭い挙動があって気になるので対処してみました。
具体的には次のような挙動です。

  1. 挿入モードへ
  2. IMオン
  3. なにも入力しないでノーマルモード
  4. IMはオンのまま

何か入力するとちゃんとノーマルモードでIMがオフになるのでバグじゃないかなと思います。
IBusでimactivatekeyを設定すると入力できなくなったりもするので、自分が何か間違えているのだろうかとも思いますが面倒なのでPythonスクリプトで回避することにしました。
Pythonを利用する事によりバグ回避だけでなく Vim(非GUI)でも vi協調モードが動作するようになります。


UbuntuPythonがデフォルトでインストールされていて、VimPythonインターフェイスが有効なのでIBusPythonで制御します。

au InsertLeave * call PyIBusDisable()

" PythonでIMのオフ
function! PyIBusDisable()
python << EOF
import ibus
bus = ibus.Bus()
ic = ibus.InputContext(bus, bus.current_input_contxt())
ic.disable()
EOF
endfunction


Pythonインターフェイスが使えないVimでは同じ内容を外部ファイルibus-disable.pyにして実行します。

au InsertLeave * call PyIBusDisable()

" 外部のPythonスクリプトでIMのオフ
function! PyIBusDisable()
  let res = system('python ~/path/to/ibus-disable.py &')
endfunction

ibus-disable.pyは適当なディレクトリにコピーしてsystem呼び出し部分のpathは変更して下さい。
最後の & は非同期にするためですがなくても問題ないかもしれません。。


当然IMオンも個別制御できるので、ついでにVim用の「日本語入力固定モード」もIBusできちんとした動作を行えるように修正しました。


IBusのvi協調モードは切ることが出来ないのでバグがあったり、自分で制御したい時はちょっと面倒だなとか思ったり思わなかったり。