Vimでノーマルモード移行時に日本語入力を無効化する

Tools

Vimのノーマルモードでは日本語を使うことはないはずなので、挿入(編集)モードからノーマルモードへの移行とともに、日本語入力が無効になってくれると便利です。

各環境でこれを実現する方法をまとめました。

Windows

WindowsでVimと言えばKaoriya版です。Kaoriya版のGVimはそのままで表題の件に対応しているので、基本的にはこれを使っておけばOKです。

ですが、ターミナル上でVimを呼ぶ場合には対策が必要になります。私の場合はAutoHotkeyを使い、ターミナル上でEscが押された時に日本語入力を無効化することで対処しています。

AutoHotkeyのコードは次のような感じです。

;;IME.ahkは https://www6.atwiki.jp/eamat/pages/17.html より
#Include lib\IME.ahk
#NoTrayIcon
#IfWinActive, ahk_exe <ターミナルエミュレータ名など>
Esc::
getIMEMode := IME_GET()
if (getIMEMode = 1) {
IME_SET(0)
}
Send {Esc}
#IfWinActive

Google日本語入力の設定でEscの動作を変えてIMEをオフにする方法はMacでは有効ですが、WindowsではEscを二度押す必要があるため採用していません。

また、私は使っていないので詳しいことはわかりませんが、ターミナルがTera TermやRLoginであれば、制御シーケンスなるものを使うことで入力切替ができるようです。

挿入モードを出る時にIMEをオフにする(SSH接続など端末エミュレータからVimを利用する場合)

Mac

Kaoriya版VimをベースにしたMacVimが使えます。GUIのMacVimはノーマルモード移行でIMEを無効化してくれます。

ターミナル上のVimはiTermと Google日本語入力の組み合わせで対処できます。Google日本語入力の設定でEscキーの動作を「キャンセル後 IME を無効化」に変え、ターミナルにiTermを使えば、Escキーを一度押すだけで、ノーマルモードに切り替わるとともに日本語入力が無効になります。

ターミナルは純正のものでもいいんじゃないかと思ったのですが、純正ターミナルだとなぜかIMEが切り替わってくれません(私の環境だけかもしれません)。

Karabiner(旧:KeyRemap4MacBook)を使って入力切替をする方法もあります。ただ、KarabinerはSierraに現状(17/03)未対応です。

Linux(Ubuntu)

ローカルのVimの場合

IMがfcitxであればVimプラグインのvim-scripts/fcitx.vimを使うのがお手軽簡単です。

挿入モード時の入力状態を固定できるプラグインim_control.vimを使うのも手です。こちらはIBusなどでも動作し、ノーマルモード移行時にはIMEを無効化してくれます。

注意点ですが、これらの手法は単一の入力メソッドだけを使用する環境ではおそらく動作しません(im_control.vimは環境次第で動くかも)。

リモート接続のVimの場合

※追記 Autokeyでfcitx-remoteコマンドを使う方法を追記しました。こちらの方が自然に対応できますね。

Autokeyでfcitx-remoteを呼ぶ方法

fcitxはfcitx-remote -cコマンドでIMEを無効化できるので、Autokey(否Autohotkey)を使い、Terminal上でEscキーが押された時にIMEを無効にするスクリプトを以下のように作成します。


※WindowFilterなどはご自身の環境に合わせてください。

Mozcのキー設定とAutokeyの組み合わせで対応する方法

Open
入力切替時に入力メソッドの切替がされるとMozcの一部機能が使えないので、まずは使用する入力メソッドをMozcだけにします。

そして先述したMacの項での説明のように、Mozcの設定でEscキーの動作を「キャンセル後 IME を無効化」にします(MozcはGoogle日本語入力のオープンソース版なので設定が似ています)。

これだけだとEscを二度押さなくてはならないため、Autokeyで補います。Autokeyをインストール・起動し、一度のEscキー入力がEscキー*2の入力になるように次のようなスクリプトを加えます。

※スリープ時間を設定しているのは、これがないとmozcのIME無効化の動きが阻害されてしまうからです。WindowFilterなどはご自身の環境に合わせてください。

以上でターミナル上のVimも対処できますが、Autokeyが少し不安定なこと、ターミナル操作時のEsc入力が常に二度押しになってしまうこと、などから特におすすめはいたしません。

 

より良い方法をご存じの方はご教授ください。

補足

挿入モードに再移行したときに元の入力状態に戻るかどうかは、使っているVimや環境などによってまちまちです。動作を統一するのであれば inoremap <silent> <ESC> <ESC>:set iminsert=0<CR> などとして、元の入力状態を記憶しないようにします。

コメント