概要
Linux 環境下の vimperator にて、コマンドモードやヒントモード時に IME の ON/OFF を制御したかった。
方法は色々あるようだが、どうせ Linux 環境下では結論が同じ(外部コマンドの利用)なので自作することに。
こんな感じ
(例えば t
キーの場合)
-
t
キーを押す - 外部コマンドを
io.run()
で呼び、IME を切る - 普通に
t
キーを押した際のイベントへ
こんな感じで IME の OFF 処理さえぶち込めれば、後は通常通りで構わない。
で
下記の様になった。
(ibus-disable コマンドについてはまた別の機会に)
nnoremap t :<C-u>js<Space>io.run('ibus-disable')<CR>t
しかし、上手くいったりいかなかったりと不安定。
おそらく、IME が OFF になる前に入力欄(コマンドライン)のフォーカスが外れてしまっているのだろう。
手抜きをしない
ググった。あっているか不安。
js <<EOM
mappings.addUserMap(
[modes.NORMAL], ['t'], ':tabopen',
function() {
events.feedkeys('t', true);
io.run('ibus-disable');
},
{ rhs: ':tabopen', noremap: true }
);
EOM
やっている事は先ほどと同じ。
-
mappings.addUserMap()
はmap コマンド
相当- 引数で
nnoremap
相当に
- 引数で
-
events.feedkeys()
で通常のキーイベントを発生させる - 入力欄にフォーカスが当たっている事を確実にするため、IME の OFF は後回しに
一応、期待どおりに動いている。
おまけ: IME を制御する方法いろいろ
- CSS の
ime-mode
プロパティを使う- Linux 環境では肝心の
inactive
が使えない
- Linux 環境では肝心の
- 外部コマンドを呼ぶ
-
io.system()
: PATH が通っていない場合 -
io.run()
: PATH が通っている場合
-
-
ime_controller.js
- 未確認。Windows XP のみ?
-
imekeys.js
- 定番っぽい
- 環境に合わせて良きに計らってくれる