Vim で Esc を押したら、IME を OFF

問題概要

vi 系のエディタを使っていて困るのは、IME 周り。

理由は、vi 系ではモードという概念が有るため。

Esc でノーマル・モードに戻り、他のモードに移るつもりで、i, /, ?, : をタイプした時に、日本語入力が ON のままだと、「い」「・」「?」「:」となり凹む。後者の2つは、半角固定にしていればそのまま Enter で済むが、前者だとorz

その為、ノーマル・モードに戻った時は、日本語入力が OFF になってほしい。

既存の方法

追加ツール無しで可能な方法

Fcitx の設定だけを用いる方法

昨今の Linux では入力環境として、Fcitx が採用されているので、この設定を変更して、Esc で入力メソッドを切り替えることが出来る。→「FcitxのIMEをEscapeでOffにする

ただこの方法だと、

  • 日本語入力 ON だと、最初の Esc で日本語入力は OFF になるものの、ノーマル・モードに戻るためにはもう一度 Esc をタイプする必要が有る
  • 日本語入力が OFF だと、既に日本語入力が OFF なので、最初の Esc でノーマル・モードになる

と日本語入力 ON/OFF で動きが変わってしまう。

Google 日本語入力の設定だけ用いる方法

次に入力メソッド Google 日本語入力の設定で変更する方法「 SSHを介してVimを使う人に感動的なESCキーを押すとESCキーが効きつつIMEがオフになる設定(Google日本語入力とVimの相性は最強!)Add Star」があるが、オープンソース版 Mozc を使っているせいか、私の環境では全くうまくいかない。

vim のプラグインを用いる方法

他の一般的な方法として、「Vim/GVimで「日本語入力固定モード」を使用する」があるので、大抵はこの方法を取ればよい。

私が試した方法

しかし私の好みとして、

  1. 使用するプラグインは少なくしたい
  2. 入力メソッドが切り替わるのではなく、あくまで直接入力モードになるだけで良い
  3. 固定は好みではない

という条件で何とか方法がないのか? を上記サイトを参考に考えてみた。

要は「Esc で直接入力モードにするか、IME を無効化するキー・コードを追加で送信すれば良い」を使う事が肝要。

以下は Linux の場合なので、それ以外の場合は、「Vim/GVimで「日本語入力固定モード」を使用する」を参考にして欲しい。

入力メソッドを OFF にすれば良い場合

先ず A だけなら、Fcitx で入力メソッドを OFF にすれば良いので、.vimrc に次の記述をすればよい。

if has('unix') inoremap <silent><Esc> <Esc>:silent call system('fcitx-remote -c" > /dev/null 2>&1')<CR> if has('gui_running') " ターミナルでカーソル・キーで履歴が辿れなくなる-- cnoremap <silent><Esc> <Esc>:silent call system('fcitx-remote -c" > /dev/null 2>&1')<CR> endif endif

ここでは、他の環境と .vimrc を共有することも考え、Unix の環境に限定し、入力モードとコマンドモードの設定だけ置き換えている。

入力メソッドは ON のまま、IME を無効化する場合

  1. 入力メソッドの設定

    入力メソッドはそのままに、IME を無効化するだけとなると、入力メソッド側の設定変更も必要になる。

    1. 設定起動
      「Mozc の設定」起動画面
      • Ubuntu なら Unity で、「mozc」で検索
      • ターミナルを使うなら
        /usr/lib/mozc/mozc_tool --mode=config_dialog
    2. 編集起動
      Mozc 設定画面

      起動したら「キー設定の選択」の [編集] を起動。

    3. キー設定の追加
      Mozc 設定画面
      1. [編集] から「エントリーを追加」を選び、キー設定を追加する
        この時
        1. 上記の「入力キー」「コマンド」は同じ設定で、最後の「モード」は、自分がどういった場面で、「ノーマルモードに戻り、IME を無効化したいのか?」に応じて選択
          私は「入力文字なし」だけにしているが、「変換前入力中」が一般的な
        2. 「入力キー」は、他と重ならず使わない適当なキーを割り当てる
          • 全角/半角 等 IME の有効/無効とは別にする
          • 私は Ctrl+無変換 にしている
        3. 最後の「コマンド」は「キャンセルして後 IME を無効化」
      2. 「モード」は、先の通り「ノーマルモードに戻り、IME を無効化したいのか?」に応じて、上記の「入力キー」「コマンド」は同じ設定で、場合によって複数個「エントリーを追加」
    4. キーコードを送信する xvkbd のインストール

      「Ubuntu software Center」では検索が上手くいかないようなので、ターミナルに

      sudo apt install -y xvkbd

      を入力。パスワードの入力を求められたら、管理者 (通常は自分) のパスワードを入力

      この時、場合によっては複数のパッケージがインストールされる

    5. 先の「入力キー」に応じて .vimrc に記述を追加
      私の Ctrl+無変換 だと
      if has('unix') inoremap <silent><Esc> <Esc>:silent call system('xvkbd -text "\C\[Muhenkan]" > /dev/null 2>&1')<CR> if has('gui_running') " ターミナルでカーソル・キーで履歴が辿れなくなる-- cnoremap <silent><Esc> <Esc>:silent call system('xvkbd -text "\C\[Muhenkan]" > /dev/null 2>&1')<CR> endif endif

      \C\[Muhenkan] の部分が、「入力キー」Ctrl+無変換 に対応

      よく使うキーとしては、

      \C
      Ctrl
      \A
      Alt
      \e
      Esc
      \t
      Tab
      \S
      Shift
      \M
      Meta
      \[keysym]
      keysym

      \C\[Muhenkan] でも用いている keysym については、「List of Keysyms Recognised by Xmodmap」に一覧が有る。よく使いそうな、全角/半角 は Zenkaku_Hankaku なので、\[Zenkaku_Hankaku] となる。

欠点

この方法にも欠点がないわけではない。

Esc を使っている場合は問題ないのだが、vi 系で同じ意味を持つ Ctrl+[ で問題が発生する。

上記の設定のまま、Ctrl+[Esc として動作し IME も無効化出来る。

しかしながら、ついついやりがちな連続したタイプでは、

  1. 2 回目以降は Ctrl を押したまま、[ だけをタイプ、つまり「押す/離す」
  2. Ctrl を押さずに [ をタイプした扱いになる
  3. Ctrl+[ を 3 回だと Ctrl+[ が 3 回ではなく、Ctrl+[ を 1 回と [ を 2 回の扱いになる
  4. よって後半部分で、
    :help [[
    にある
    [[
    [count] セクション後方に、もしくは1桁目が '{' で始まる
    前の場所に。|exclusive|
    Note しばしば|exclusive-linewise|になる。
    が働いてしまう

これは Ctrl+[ の設定を、Esc 同様に追加しても変わらない。

2017/01/09 追記

その後の試した方法としては、

autocmd InsertLeave * silent call system('fcitx-remote -c" > /dev/null 2>&1')

この方法は、次の欠点が有り、使うのを止めた。

  • インサート・モードで Ctrl+〜 系でタイプした直後に、Ctrl+[ でノーマル・モードに戻ろうとすると、上手くいかず「[」が入力されてしまう
  • どういった時か不明だが、IME を OFF にするように設定したキーが、Ctrl を押さないタイプが連続して起きる。上記の設定だと、無変換 が連続したタイプした扱いになる