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自体にvi協調モードがある場合
  • IM自体にvi協調モードが無い場合

IMの制御がトグルしか行えない場合は以下を参考にしてください。