【FreeBSD】vim/neovimのノーマルモード遷移時に日本語入力をOFFする(uim-fep/fcitx)

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.0-RELEASE-p5
CLI IME uim-fep version 1.8.8 / Mozc-2.23.2815.102+24.2.oss
GUI IME fcitx version: 4.2.9.5 / Mozc-2.23.2815.102+24.2.oss

課題

vimと日本語入力の相性は良くない。

例えば、vimの挿入モードで日本語入力を行った後、Escキーでノーマルモードに遷移する。

そしてカーソルを動かそうとして、Jキーを押す。

するとどうだろう。

カーソルは下には動かず、という全角文字が画面に表示される。。。
 
 
 
 
違う違う、そうじゃない!
 
 
 
 
ノーマルモードで日本語入力なんてしないよ。

僕はただ、カーソルを動かしたいだけなんだ。。。

対策

このvim史上最もストレスのたまる問題は、ノーマルモード遷移時に、uim-fepの日本語入力モード(以降、IM)を自動でOFFすることで解消できる。

uim-fepには、外部から入力モードを制御するためのファイルが用意されている。
それを利用すればいい。

ここでは、uim-fepの入力モードを制御するシェルスクリプトを作成し、それをvimのノーマルモード遷移時に呼び出して対応する。

  1. uim-fepの入力モードをコマンドラインから制御する方法
  2. シェルスクリプト化する
  3. vimの設定
  4. おまけ) fcitx追加版

1. uim-fepの入力モードをコマンドラインから制御する方法

uim-fepが起動したコンソールで、下記のコマンドを実行してみよう。

> echo 1 > "$UIM_FEP_SETMODE"     # IM ON
> echo 0 > "$UIM_FEP_SETMODE"     # IM OFF

$UIM_FEP_SETMODEは、uim-fepが起動したときに作成される環境変数。
IMをON/OFF制御するファイルへのパスが入っている。

このファイルに1を書き込めば、IM ON となる。
このファイルに0を書き込めば、IM OFF となる。

実に簡単。

このファイル名の末尾にはプロセスIDがつくので、uim-fepを複数のシェルで同時に立ち上げても問題ない。

2. シェルスクリプト化する

uim-fepの制御方法がわかったところで、vimから制御するためのシェルスクリプトを用意しよう。

僕が用意したのは、下記コード。

このスクリプトは、下記のような動作をする。

  • 引数に1を渡せば、IM ON する
  • 引数に1以外を渡せば、IM OFF する
  • $UIM_SET_FILEのファイルが書込不可の場合は、何もせずに終了する

このシェルスクリプトをvimから呼び出せるように、パスが通ったディレクトリ(1)に保存して、実行権限を追加(chmod +x)しておこう。
1 ... 参考) パスを通す

3. vimの設定

次に、vimの設定ファイル(~/.vimrc)に下記を追記しよう。
(neovimの設定ファイルは、~/.config/nvim/init.vim)

" IM OFF command
command! ImeOff silent !imectrl 0

" When in insert mode
augroup InsertHook
    autocmd!
    autocmd InsertLeave * ImeOff
augroup END

この例では、手順2で作成したシェルスクリプトをimectrlという名前で保存した例。
2行目のimectrlは、各自保存したファイル名に置き換えて欲しい。

これで、ノーマルモード遷移時に、作成したシェルスクリプトが呼ばれるようになる。

4. おまけ) fcitx追加版

もし、Xウィウンド上のIMとしてfcitxを使っているのなら、uim-fepとの併用は、下記のようなシェルスクリプトになると思う。

シェルスクリプト側で、呼び出されているのが仮想コンソールかXウィンドウかの判定を行っているので、vimの設定ファイルは修正不要。

その判定には、$XMODIFIERSという環境変数で行っている。
この環境変数は、~/.xinitrなどで下記のようにセットしていると思う。

export XMODIFIERS=@im=fcitx

つまり、Xウィンドウが立ち上がったときだけ、この環境変数がセットされているはずだ、という想定。

もし、もっと良さげな判定方法をご存知でしたら、コメント頂けると助かります。

最後に

ひとまずこれで、仮想コンソール上でもXウィンドウ上でも、vimのノーマルモード遷移時に、日本語入力をOFFすることができるようになった。

これなら、vimで日本語を扱うのも悪くないのではないだろうか。

下記ページを読む限り、先人達もvimと日本語入力の相性の悪さには苦労してきたようだ。
あきらめずに長年整備してきて頂いていることに、心から感謝したい。

ちなみに、挿入モード遷移時に日本語入力を賢くONしたいという人は、こちらの記事もご覧下さいましまし。

参考

以上。

違う、そうじゃない 

違う、そうじゃない 

  • アーティスト:鈴木雅之
  • 出版社/メーカー: Epic Records Japan Inc.
  • 発売日: 2014/04/01
  • メディア: MP3 ダウンロード