im_control.vim - 外部コマンドによるIM制御の準備
外部コマンドによってIM制御を行う場合は適切な IMCtrl()を設定して利用します。
今回はIMの機能にほとんど依存しない方法としてIMに適当なホットキーを設定してやり、Vimから 仮想キーコマンド(xvkbd)を呼び出して仮想的にホットキーを入力することで IMを制御するという方法を使用します。
このページにあるのは im_control.vimのデフォルトである Unixの xvkbd を使う場合の設定ですが、他の外部コマンドを使用したい場合は適切に読み替えてください。
xvkbdによるIM制御の準備
1. xvkbdのインストール
まず xvkbdを synapticや apt-getなどでインストールします。
$ apt-get install xvkbd
2. ホットキーの設定
次にIMのホットキーを以下のように設定します。
開始/終了
開始
終了
[Control] + [space]
[Control] + [Shift] + [Insert]
[Control] + [Shift] + [Delete]
「開始」と「終了」が個別に設定できない場合は「開始/終了」だけ設定して下さい。
キーは好みで変更してかまいませんが、後述するスクリプトの設定も変更する必要があります。
3. IM制御の確認
設定が済んだらコマンドラインから以下を実行して IM制御可能か確認してください。
$ xvkbd -text "\[Control]\[space]" > /dev/null 2>&1
実行の度に IMの状態が切り替わるはずです。
「開始」と「終了」を個別設定している場合はそちらも確認してみて下さい。
IMCtrl (制御用関数)の設定
IM制御にxvkbd以外を使用したい場合やホットキーを設定例以外に変更した場合は IMCtrl()も設定に合わせて変更してやる必要があります。
.vimrcへ IMCtrl(cmd)を追加して適切な設定を行なってください。
""""""""""""""""""""""""""""""
" 日本語入力固定モードの制御関数(デフォルト)
""""""""""""""""""""""""""""""
function! IMCtrl(cmd)
let cmd = a:cmd
if cmd == 'On'
let res = system('xvkbd -text "\[Control]\[Shift]\[Insert]" > /dev/null 2>&1')
elseif cmd == 'Off'
let res = system('xvkbd -text "\[Control]\[Shift]\[Delete]" > /dev/null 2>&1')
elseif cmd == 'Toggle'
let res = system('xvkbd -text "\[Control]\[space]" > /dev/null 2>&1')
endif
return ''
endfunction
適切なコマンドを設定していれば Vimから IMCtrl()を呼び出してIM制御を行うことができるはずです。
次のようにトグルコマンドを呼び出して確認してみてください。
:call IMCtrl('Toggle')
動作がおかしいときは imactivatekeyや $GTK_IM_MODULE などIM関係オプションは設定しないで無効にしてみてください。
トグルや切替でおかしくなる場合は ttimeoutlenを設定してみたり、 xvkbdの呼び出し部分の最後に & を付加して非同期で呼び出してみるのも良いかもしれません。
let res = system('xvkbd -text "\[Control]\[Shift]\[Insert]" > /dev/null 2>&1 &')
一部のIMのように制御用のコマンドが用意されていたり、Python等の外部スクリプトで切り替えたい場合は xvkbdの呼び出し部分を書き換えて下さい。
なお xvkbd以外のコマンドを呼び出す場合は system()での呼び出しコマンドの最後に & をつけて非同期で呼び出す方が問題は起きにくいようです。
オプション設定
設定が終わったら uim, SCIMの設定例を参考にオプション設定を行います。
IMの制御がトグルしか行えない場合は以下を参考にしてください。