まメモ

みむ

Vim と VS Code Vim で挿入モードから抜けた時に IME を無効化する (Linux fcitx版)

 Vim を使って日本語を書いていると、IMEをONにした状態でノーマルモードで入力してしまって、思い通りに操作できないことがよくあると思います。 挿入モード以外で日本語を入力する必要はおそらく無いと思われるので、挿入モードを抜けるときに強制的にIMEをOFFにすることでこの問題は解決できそうです。

 同じことをやっている人は探せば結構出てくるのですが、挿入モードでは常にIMEをONにしたい流派がいたり、OSによって設定が異なったりと、人の数だけ設定がありそうだったので、なるべくミニマルで流用しやすそうな設定を残しておきたくてこの記事を書きました。

 IMEが絡む都合上、「これでどの環境でも動く」という楽々設定はできないので、以降はLinuxIMEとしてfcitxを使用している場合の話になります。 ただし、IME切り替えの部分を各自の環境に置き換えることで読み替えることは可能で、この点については後述します。

Linux 上の Vim での設定

autocmd InsertLeave * call system("fcitx-remote -c")

 IMEとしてfcitxを使っていればこの設定だけで挿入モードから抜けたときにIMEをOFFにできます。 WindowsMacLinuxでもibusを使っているような環境でも同じvimrcを使いまわしたければ、環境に応じてロードしないようにする設定も加えたほうが無難だと思います。

 InsertLeaveとは逆に、挿入モードに入ったときに発火されるイベントInsertEnterもあるので、挿入モードでは常にIMEをONにしたい派の人はそちらも使えると思います。

VSCode Vim での設定

 VSCode Vim でも同様の設定は可能で、settings.jsonに以下の設定を書き加えます。

"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.defaultIM": "-c",
"vim.autoSwitchInputMethod.switchIMCmd": "/usr/bin/fcitx-remote {im}",

 defaultIM の値が switchIMCmd の {im} の部分に渡されます。 現時点ではautoSwitchInputMethodは、挿入モードを抜ける時にdefaultIMに切り替えるという動作だけになっているようなので、switchIMCmdに直接書き下しても特に問題はなさそうですが、将来的にIME切り替え機能が追加される可能性を考えると、上述のような設定の方が無難に思えます。

fcitx-remote と他の環境への応用

fcitx-remote をオプションなしで実行すると現在のIMEの状態に応じて、

  • 0 → fcitxサーバーが起動していない
  • 1 → 直接入力 (IME OFF)
  • 2 → IME ON

が返ってきます。 また、オプションとして、

  • -cIMEを無効化
  • -oIMEを有効化
  • -tIMEの状態をトグル

があります。

今回は現在の状態に関与せずにただ無効化できればいいので、容易に設定できました。 挿入モードの最終状態に応じて処理を分けたい場合(次に挿入モードに入ったときに状態を保存したいなど)、このあたりをうまく使うことで実現できそうです。

逆に、他のIMEを使っていても、fcitx-remote -cに相当するコマンドがあれば、適宜置き換えることでその環境でも今回の記事と同等の効果が得られるはずです。