How To Turn OFF IME Automatically On Vim

一般的にVimのキーバインドをこよなく愛している人にとって、InsertModeからNormalModeに切り替わった時には、IMEが自動的にOFFになることが望ましいという要望があると思う。
で、色々な方法があるのだが、自分の場合の落としどころを書き残しておきたいと思う。

戦略

  • IMEの設定はいじらない
  • 常駐するようなツールにはあまり頼らない
  • CLIのVIM上だけで実現すれば良しとする
    • IDEやVimiumといったブラウザーのExtensionといった他のアプリケーション上での対応は諦める
  • 基本的にVimのInsertLeave autocmdにて対応する

MacOS

@vimrc

augroup AutoIMEOff
  autocmd!
  autocmd InsertLeave * :call system('osascript -e "tell application \"System Events\" to key code 102"')
augroup END

osascript上記のようなコマンドを実行すると EISU キーを叩いたことになりIMEがOFFになるということらしい。
これは実際のキーボードがUSキーボードでも有効。

Linux

@vimrc

if executable('fcitx-remote')
  augroup AutoIMEOff
    autocmd!
    autocmd InsertLeave * call system('fcitx-remote -c')
  augroup END
elseif executable('ibus')
  augroup AutoIMEOff
    autocmd!
    autocmd InsertLeave * call system('ibus engine "xkb:us::eng"')
  augroup END
endif

InputMethodに何を使っているのかによるけど、大概 fcitxibus だと思うので、それを設定しておく。
他のものを利用している場合は、ここに条件を追加していけばいいはず。
自分は、大概 fcitx を使っていたので、 ibus がちゃんと動くかは不明

Linux on WSL

@vimrc

if executable('zenhan.exe')
  augroup AutoIMEOff
    autocmd!
    autocmd InsertLeave * call system('zenhan.exe 0')
  augroup END
endif

Windowsの場合、いろいろ調べてみたけど、このzenhan.exeが一番使い勝手が良かった。
あまりメンテナンスされてないので、どうかな?と思ったけど、コードを見た感じとてもシンプルだし、簡潔なコードで好感が持てる。
これなら自分が作るより良いなと思ったので、このまま使わせてもらうことにした。

Windowsの本体側でVimを動かすことはなさそうなので、WSLに配置すればいいかなと思っていたんだけど、WSL上でzenhan.exeを置いて実行したらとても遅かったので、Windows側に設置している。
自分の場合、 C:\Users\{username}\Program Files というディレクトリを作って、そこにインストーラーがないようなプログラムを置くようにしていたので、zenhanも同じように配置した。
ひと手間かかってしまうが、これぐらいはしょうがないと割り切ることにした。

総括

仕事ではMac、プライベートではLinux on WSLを使っているが、今のところ問題なさそう。
設定もある程度シンプルに保てたと思うので、当面はこれで行きたいなと思った。