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に何を使っているのかによるけど、大概 fcitx
か ibus
だと思うので、それを設定しておく。
他のものを利用している場合は、ここに条件を追加していけばいいはず。
自分は、大概 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を使っているが、今のところ問題なさそう。
設定もある程度シンプルに保てたと思うので、当面はこれで行きたいなと思った。