[vim][tips] VimとIBusの vi協調モード
IBusには vi協調モードがありますがVimを使っていたら、どうもバグ臭い挙動があって気になるので対処してみました。
具体的には次のような挙動です。
- 挿入モードへ
- IMオン
- なにも入力しないでノーマルモードへ
- IMはオンのまま
何か入力するとちゃんとノーマルモードでIMがオフになるのでバグじゃないかなと思います。
IBusでimactivatekeyを設定すると入力できなくなったりもするので、自分が何か間違えているのだろうかとも思いますが面倒なのでPythonスクリプトで回避することにしました。
Pythonを利用する事によりバグ回避だけでなく Vim(非GUI)でも vi協調モードが動作するようになります。
UbuntuはPythonがデフォルトでインストールされていて、VimもPythonインターフェイスが有効なのでIBusをPythonで制御します。
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協調モードは切ることが出来ないのでバグがあったり、自分で制御したい時はちょっと面倒だなとか思ったり思わなかったり。