VimでIMEの切り替えを納得いくようにした

前までは「日本語入力固定モード」を使っていたのですが、どうもしっくりこないまま使っていたので好みに合うようにキッチリ設定してみました。

環境

  • fedora36
  • kde plasma 5.26.4
  • IBus 1.5.26
  • mozc 2.26.4577

条件

  • mozcのプロパティを設定してESCキーを押したときにIMEを無効にする方法は使わない
    • プロパティのウィンドウから設定項目が見切れる悲しい現象に遭遇しています
  • プラグインは入れない
    • プラグインを増やしたくない
  • 挿入モードでのIMEの状態をノーマルモードに移行している間も覚えていてほしい

vimドキュメントにある方法を色々試す

📕Vim日本語ドキュメント iminsertのiminsertの項目を読んでみるといくつか方法があるみたい。

iminsertを使う方法を試してみたけど、うまく機能しませんでした。他の人の設定を参考にしてみてもGvimとかでやっているみたいだし、私の環境で動くものなのか良くわからない😅

仕方がないので日本語ドキュメントを更に読み進めると以下の記述が。

Vim が +xim、+multi_byte_ime もしくは global-ime 付きでコンパイルされていない場合、外部コマンドによって IME/XIM を制御するために’imactivatefunc’ および ‘imstatusfunc’ を設定することができる。

とりあえず今使ってるvimがどういう設定でどうコンパイルされたか知る必要がありそう。
vimで:ver と打てば参照できた。

<一部だけ抜粋>
+cmdline_compl     -hangul_input      +mouse_urxvt       +spell             +vreplace
+cmdline_hist      +iconv             +mouse_xterm       +startuptime       +wildignore
+cmdline_info      +insert_expand     +multi_byte        +statusline        +wildmenu
+comments          +ipv6              +multi_lang        -sun_workshop      +windows
+conceal           +job               -mzscheme          +syntax            +writebackup
+cryptv            +jumplist          +netbeans_intg     +tag_binary        +X11
+cscope            +keymap            +num64             -tag_old_static    -xfontset
+cursorbind        +lambda            +packages          -tag_any_white     +xim

+xim、+multi_byte_imeは有効になっているけど、なんでうまく動かないのかな。
仕方がないので、外部コマンドで制御することに。

.vimrcでimactivatefuncを設定してみます。
vimのドキュメントのimactivatefuncの項目に詳しい書き方が載っているので参照します。

📕Vim日本語ドキュメント imactivatefunc

でも、これだけだと機能しませんでした。色々調べて試した結果iminsert=2という一行が必要だと判明。何故かはわからない🙄iminsertは冒頭で機能しなかったって書いたけれど、何かしらの条件がきたら参照されてIMの切り替えに影響するみたい。も〜!まあ出来たからこれ以上深追いするのはやめておこう。

設定完了

結果こんな感じになりました!

" IM
let s:kana = 'mozc-jp'
let s:eisu = 'xkb:jp::jpn'
let s:prev=s:eisu
function ImActivateFunc(active)
  "insertモードに入るとactiveのほうに入る
  if a:active
    call system('ibus engine ' . s:prev)
  else
    let s:prev=system('ibus engine')
    call system('ibus engine ' . s:eisu)
  endif
endfunction

set imactivatefunc=ImActivateFunc
set iminsert=2

参考

IMEの色んな周辺知識を勉強しました。結構面白いね。
📕最適な日本語環境を発掘せよ
📕XIM(X Input Method)日本語入力の流れ-Qiita
📕XIM/IME が使えない場合でも iminsert=2 は設定できるべき。 #1118|github.com