長らくLinux上のgvimでは日本語入力時に使いづらさがありました。その原因やら何やらについては横に置いておくとして、実は 7.3.1248 以降のVimではこれに対する1つの解決策(への可能性) imaf & imsf が実装されました。本記事ではそれらを使って gvim上でIME(=ibus)の制御をするスクリプト を紹介します。
必要なもの
- Vim
    
- パッチ 7.3.1248 を含むこと (7.4a以降でももちろん可)
 - gvim が使えること
 - Pythonが有効化されていること 
:echo has('python')で 1が返る 
 - ibus による日本語入力を用いていること(例: Mozc)
 
私は例によって Xubuntu 13.04 に Mozc を入れ、自前コンパイルの Vim 7.4a.017 を使って動作確認をしました。
使い方
インストール
- pyibus.vim をダウンロードする
 - pyibus.vim を 
~/.vim/plugin/へコピーする 
動作確認
- gvim を起動する
 :set imaf? imas?してそれぞれにPyIbusSetとPyIbusGetが設定されていればインストール成功- 挿入モードに入る
 - 日本語入力モードに切り替え日本語を入力する
 - そのまま ESC を押しノーマルモードに戻る
 - 日本語入力モードが自動で解除されていることを確認する。Exコマンドとか実行してみるのが良いかも
 - 再度挿入モードに入る
 - 自動的に日本語入力モードに切り替わったことを確認する
 
解説
VimにはもともとIMEを制御するための次のようなメタな仕組みが組み込まれていました。
- 挿入モードを抜ける時に現在のIMEのON/OFFを覚える
 - 覚えておいたON/OFFを挿入モードに入るときにIMEへ設定する
 
ですから「IMEからON/OFFの状態を取得する」「IMEにON/OFFの状態を設定する」この2つの機能を実装すれば、どのようなIMEにも対応できるようにはなっていたのです。ところがLinux (正確にはX11) のさまざまな制約により、これらをしっかりと実装することはできていませんでした。日本だけでなく世界各国で、ともするとユーザ毎に異なる可能性のあるIMEとそれを取り巻く環境、ユースケースを満たす実装ができなかったのです。
7.3.1248 は発想の転換でして「実装できないならしなきゃ良い」ということで、Vim自身ではIME制御機能の実装は提供せず、Vimスクリプトで実装できる仕組みにするものでした。「ユーザ毎に最適な実装が違うなら、実装自体をユーザに任せりゃええやん」ってわけですね。
pyibus.vim はその仕組みを使って、Pythonのibusモジュール経由でibusを制御しています。つまり「ibus使ってんなら上手くIME制御できるんだぜ」ということです。私は動作確認を Xubuntu でしか行っていませんが、条件さえ満たせば他の環境でも動くでしょう。
まとめ
Linuxでもgvimを使って快適な日本語入力をお楽しみください。
