0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Ubuntu24]vimでエスケープ時にIMEをOFFにする

Last updated at Posted at 2025-10-08

問題点

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?