2012-02-05 日本語入力(ibus)を制御するVimプラグイン「vim-ibus」を公開した
導入
以前からぼくはVimでの日本語入力にイライラしていた。ぼくはUbuntu 11.10でapt-get vimしてそのまま使うだけのライトユーザーだ。そんなぼくでも設定を見直したくなる点が日本語入力だ。
Vimはモードを持つエディタである。慣れれば自然にできるが、モードを意識する必要がある。Normal mode/Visual mode/Select mode/Insert mode/Command-line mode/Ex mode。どのモードで処理しているのかを意識する必要がある。通常これらは大した問題にならない。なぜならどのモードからでもEscキーを押せばNormal modeに戻れるし、どのモードに居るか分かるような画面表示だからである。
それに対して日本語入力は違う。有効・無効が切り替わるトグル動作が基本だ。おまけに画面表示がされない。いま有効なのか無効なのかが分からない。それにキー入力を奪ってしまうので、「:」でCommand-line modeに入りたいのに未確定の全角:が表示されたりする。
もううんざりだ。
im_control.vimによる問題解決
以前のようにskk.vimをインストールしようかとも思った。しかしいまぼくの手元には『Vimテクニックバイブル』がある。そこには「日本語入力固定モード」として『im_control.vim』というプラグインが紹介されている。そこで今日はこのプラグインを試すことにした。
プラグインをインストールする前に自身の環境について調べることにした。思えばぼくがUbuntuを使いはじめて2ヶ月ちかく日が経っている。しかし今日まで日本語入力に自分が何を使わされているのか知らずに居た。調べたところUbuntu 11.10では既定でibusが使われているようだ。Vimは+pythonでコンパイルされており、python自体もインストールされている。環境に問題はないようだった。
im_control.vimのインストールおよび動作確認は無事できた。グローバル変数の設定を忘れると妙な動作をするが環境にあわせて設定すれば動作する。許容範囲の問題だろう。詳細なインストール方法についてはここでは割愛する。im_control.vimのサイトに詳しく書いているため、そちらを参照してほしい。
こうして日本語入力の問題は解決した。
vim-ibusの公開
問題が解決したので、ついでにim_control.vimの中身を読んでみることにした。ibusをPythonで制御している部分のコードを読んでみたところ、Pythonさえ使えればibusは意外と簡単に操作できることが分かった。
そこでぼくの環境に必要十分でもっとシンプルな制御をかけるプラグインを作成してみることにした。
その結果が『vim-ibus』である。
せっかく書いたのでGitHubで公開した。はじめてのVimスクリプトの公開である。
https://github.com/bouzuya/vim-ibus
vim-ibusの機能
vim-ibusの機能を説明する。
vim-ibusはVimの:pythonを使いibusの制御をかけるスクリプトである。ibusの有効無効の切り替えおよび状態取得をできるようにしている。逆に言うと他の機能は何もない。シンプルなVimスクリプトである。
メソッドは次の4つである。
ibus#is_enabled() " 有効なら1そうでなければ0を返す。
ibus#enable() " 有効にする。
ibus#disable() " 無効にする。
ibus#toggle() " 有効無効をトグルする。
vim-ibusの使用例
使い方の例を挙げておく。
インストールについては『neobundle.vim』あたりを使うと良い。'runtimepath'にフォルダを追加しても良い。
.vimrc に次のような記述を追加する。
:inoremap <silent> <Esc> <Esc>:<C-u>call ibus#disable()<CR> :inoremap <silent> <C-j> <C-\><C-o>:<C-u>call ibus#toggle()<CR> :set statusline=[%{ibus#is_enabled()?'あ':'aA'}]
ぼくの.vimrcでは上記のmapには続けてibus#is_enabled()を使用して:hi StatusLine ...する関数を呼んでいる。簡単な例にするために割愛している。その他:set statuslineは実際には+=で既存の設定の前に足すといいと思う。割愛割愛。
まとめ
Vimから日本語入力(ibus)を制御したい人は使うと幸せになれるかもしれない。どうぞ。
80 min.