LoginSignup
5
5

More than 5 years have passed since last update.

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

Posted at

概要

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
    • 定番っぽい
    • 環境に合わせて良きに計らってくれる
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5