Vimからfcitxを使う


近頃の ibus や uim の使い勝手がイマイチなこともあり、Linux 上での Input Method として fcitx が最近ポピュラーになってきました。

我らが SKK では、その他のInput Methodと違い、SKK内に直接入力モードがあり、SKKのままアルファベット入力が可能なため、一時期のUbuntu で発生したような ibus の不具合をほとんど受けることがなく、実はあまり fcitx に乗り換える必要もありません。

ともあれ、fcitxを使うとなった場合に、Linuxで問題となるのは、Input Mode⇔Normal Mode間で、ひらがなモードの有効/無効が自動的に切り替えられない事です。

日本語で文章を書いていて、SKKを直接入力モードに変更しないまま、<ESC>でInsert Modeを抜けて体裁を整えたり、編集をしようとした場合に、Normal Modeでもひらがな入力が有効のままになっていてムキー、というのはよくある光景です。

Vimから fcitx の On/Off を切り替える場合、FcitxでVimからIM制御するが有名かと思います。

このプラグインでは、Vimのpythonインタフェースを利用してOn/Offを実行していますが、fcitxにはfcitx-remoteというコマンドがあるようなので、それを利用してOn/Off切り替えが実現できます。

set iminsert=2
set imsearch=2
set imcmdline
set imactivatefunc=ImActivate
function! ImActivate(active)
  if a:active
    call system('fcitx-remote -o')
  else
    call system('fcitx-remote -c')
  endif
endfunction
set imstatusfunc=ImStatus
function! ImStatus()
  return system('fcitx-remote')[0] is# '2'
endfunction

このようにすることで、入力開始時には fcitx-remote -oにより fcitx を有効化し、入力終了時には fcitx-remote -cでfcitxを無効にできるようです。

ちなみに、Vimで入力時にIMの制御が必要となる場面というと、以下のようなものがあります。

  • Insert Mode … バッファへの文章の挿入
  • Cmdline (':') Mode … Ex コマンドの実行
  • Cmdline ('/' or '?') Mode … /? での検索文字の入力

今回の imactivatefunc を利用する方法を使えば、それぞれの場面での設定を、以下のオプションを設定することで制御できるようになるため、便利です。

  • iminsert
  • imcmdline
  • imsearch

紹介した設定例では、それぞれのパターンでIMを有効にするように設定しました。

SKKなどの、IM有効時の初期入力モードを設定できるIMでは、直接入力を初期設定としておくと、上記のVimの設定においても、通常は半角英数入力で、必要時のみ<C-j>で日本語入力することができ、また、Normal Modeに戻った時にも影響がなく、とても便利です。

ちなみに、Windowsでは、こんなしち面倒くさいことをせず、ただSKK日本語入力FEPを使うだけでInsert Mode⇔Normal Modeの切り替え時に自動的に直接入力モードへ変更してくれるので、以下の設定だけしておけばよいです。

set iminsert=0
set imsearch=0