問題点
UbuntuでVimを使っているのですが、Vimで文字挿入モードからエスケープキー(以下ESC)でノーマルモードに切り替えますが、デフォルトの動作としては、切替時にIMEの入力モードは変更されません。そのため、日本語入力モードで入力していて、ESCでノーマルモードに切り替えてもそのままではノーマルモードの操作(たとえば、hjklなどでのカーソル移動)ができません。このため、IMEの日本語入力モードをOFFにするキー操作をさらに行うことになります。
つまり、
日本語挿入 → ESC → IME-OFF(半角/全角キーなど) → Vimノーマルモードの操作
となり、ESC以外の余分なキー操作が必要になります。
やりたい事
ESCキー一発で(IMEをOFFにして)すぐにノーマルモードの操作(カーソル移動とか)をしたい
環境
Ubuntu 24.04
デスクトップ環境:GNOME46.7
日本語入力環境:ibus-Mozc(IBus 1.5.29、Mozc-2.28)
対応方法(動かない!)
Vimで、:set iminsert=0 とするとIMEのOFFができるので、
.vimrcに
inoremap :set iminsert=0
とすれば、ESCで同時にIMEがOFFになる...はずが、
なぜかなりません。いろいろ検索してもできていたはずなのですが、
最新のibus-Mozc環境では、iminsertの変更がそもそも効かないようです。
これについては、いろいろ事情があるようで、改善される見込みは薄そうです。
対応方法
INPUTエンジンを日本語Mozcと通常とで切り替えることはできるので、それを利用します。
具体的には、コンソールから
ibus engine mozc-jp
# IME-ON
ibus engine xkb:jp::jpn
# IME-OFF
と操作できることを利用します。
※ただ、なぜかGNOMEのINPUTエンジンのインジケータ(あ、Aとかの表示)は変わりません。
.vimrcに以下を追記します。
function! IMCtrl(cmd)
let cmd = a:cmd
if cmd == 'on'
let res = system('ibus engine "mozc-jp"')
elseif cmd == 'off'
let res = system('ibus engine "xkb:jp::jpn"')
endif
return ''
endfunction
" 挿入モードに入る直前にIMEをオン
autocmd InsertEnter * call IMCtrl('on')
" 挿入モードから抜けた直後にIMEをオフ
autocmd InsertLeave * call IMCtrl('off')
" Vim終了時にIMEをオン
autocmd VimLeave * call IMCtrl('on')
これにより挿入モードからESCキー一発でIMEがオフの通常モードになります。
GNOMEのIMEインジケータは変わらないのは仕方がなさそうです。
謝辞
現在はページが削除されているようですが、ここで紹介されていた技法を踏襲しました。
im_control.vim - 外部コマンドによるIM制御の準備 - fudist