Posted at

vimperator で既存のキーマッピングをラップしたい

More than 5 years have passed since last update.


概要

Linux 環境下の vimperator にて、コマンドモードやヒントモード時に IME の ON/OFF を制御したかった。

方法は色々あるようだが、どうせ Linux 環境下では結論が同じ(外部コマンドの利用)なので自作することに。


こんな感じ

(例えば t キーの場合)



  1. t キーを押す

  2. 外部コマンドを io.run() で呼び、IME を切る

  3. 普通に 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 が使えない



  • 外部コマンドを呼ぶ



    • io.system(): PATH が通っていない場合


    • io.run(): PATH が通っている場合




  • ime_controller.js


    • 未確認。Windows XP のみ?




  • imekeys.js


    • 定番っぽい

    • 環境に合わせて良きに計らってくれる