#vimperator@IRCNet で id:trapezoid と id:otsune から ex_autocmd.js が無くてもLocationChangeで出来るよ。と教わったので関連部分を直しました。Thx!!
どうも feedSomeKeys.js を使っている人がいないようなので書く。
Vimperatorを使っていると、ウェブアプリケーションやUserscriptのショートカットキーがVimperotarとバッティングして使えない。ということがよくある。
こういう場合、基本的にはC-qでPATH THROUGHモード(Vimperatorのキーバインドを無効化する)にすることで一応解決するんだけど、はっきり言ってめんどくさいし、今どっちのモードだったか忘れててギャー!ってなるし、関係ないキーまで無効化されるのはやだ(tabopenやタブ切り替えのキーは常に使いたい!)。
ということで、feedSomeKeys.js の登場です。
feedSomeKeys.js は、任意のURLで任意のキーをスルーする(Vimperatorで処理せずにブラウザに渡す)ためのPlugin(URLの指定には ex_autocmd.js を併用する必要がある) 。
具体的には、以下のようなことができる。
- Gmailのショートカットキーを使いつつ、Vimperatorも使う
- livedoor Readerで j,k,a,s,v,p を使いつつ、Vimperatorも使う
- Tumblr + LDRize + ReblogCommand 環境で t (Reblogキー) を i に置き替えて使う(Vimperatorの t も使いたいから)
autoIgnoreKey.js などで自動的にPATH THROUGHモードに切り替えるのと違って、その他のVimperatorのキーバインドは生かしたまま、指定したキーだけをスルーできるのが特徴。
.vimperatorrc の設定方法
詳しくはソースコード上のコメントでしっかり解説されているのでそれを読んでもらうとして、簡単に言うとコマンドは2つだけ。:fmap でスルーするキーを指定する。:fmapc で全ての指定を削除して元に戻す。
:f[eed]map lhs -> lhsのキーマップをそのままWebコンテンツへ
:f[eed]map lhs [num]rhs -> lhsのキーマップをrhsへ変換してWebコンテンツへ
[num]はフレームの番号(省略時はトップウィンドウへイベントが送られる)
:fmapc
:feedmapclear -> 全てを無に帰して元に戻す
URLごとに指定するには、ex_autocmd.jsを併用して以下のように記述する。
autocmd LocationChange .* :fmapc
autocmd LocationChange http://reader\.livedoor\.com/reader/ :fmap j
:fmapc を先に書かないと端からクリアされて正しく動作しないので注意。
実例
retlet-vimperatorrcから抜粋。
以下を ~/.vimperator/plugin/ にインストールしておくこと。
:fmap 関連よりも手前に autocmd LocationChange .* :fmapc を記述すること。
上の記法はVimperator 1.2preからの対応なので、stable版である1.1使ってる人は使えません。
だそうで、1.1を使いたい人はex_autocmd.jsと併用するのがいいです。その場合.vimperatorrcの記述が多少変わるのでDiffを参考に。
Gmail
- :fmap の部分はjavascriptを使って一括指定できる
- フレームに分けられているので、何番目のフレームにキーを渡すか指定する("4"の部分)
- 正規表現が使えるので、GoogleAppsのURLにも対応させる
js <<EOF
autocommands.add('LocationChange',/mail\.google\.com\/(mail|a)\//,[
'js plugins.feedKey.setup(',
'"c / y j k n p o u e x s r a # [ ] z ? gi gs gt gd ga gc".split(/ +/).map(function(i) [i, "4" + i])',
');'
].join(''));
EOF
livedoor Reader
- ldrのレートを++/--できるようにするgreasemonkeyスクリプト用に q,w もスルー対象に指定している
js <<EOF
autocommands.add('LocationChange',/reader\.livedoor\.com\/reader\//,
'js plugins.feedKey.setup("j k s a p v c <Space> <S-Space> z Z < > q w b i".split(/ +/));');
EOF
- LDRize と同じ感覚で使いたいので、o で現在のitemを開く&次のitemに移動させる
- J,K を Space,S-Space 互換にする
autocmd LocationChange http://reader\.livedoor\.com/reader/ :fmap o vj
autocmd LocationChange http://reader\.livedoor\.com/reader/ :fmap J <Space>
autocmd LocationChange http://reader\.livedoor\.com/reader/ :fmap K <S-Space>
- feedSomeKeys.js と関係ないけど、LDR表示中のみリンクをバックグラウンドで開くようにする。o連打でバックグラウンドにタブを開いておいて後から見る。みたいな使い方。
- jsじゃなくてset!でpref設定できるらしいので直した。
autocmd LocationChange (?!http://reader\.livedoor\.com/reader/) set! browser.tabs.loadDivertedInBackground=false
autocmd LocationChange http://reader\.livedoor\.com/reader/ set! browser.tabs.loadDivertedInBackground=true
Tumblr (Minibuffer + LDRize + ReblogCommand)
- ldrize_cooperation.js 使っていればjavascript部分の指定は不要
- ReblogCommand のtキーはVimperatorでも使用頻度が高いので、iキーに置き替える
js <<EOF
autocommands.add('LocationChange',/.*\.tumblr\.com\//,
'js plugins.feedKey.setup("j k p o".split(/ +/));');
EOF
autocmd LocationChange http://.*\.tumblr\.com/ :fmap i tj
以上。
PATH THROUGHモードとか使っていいのは小学生までだよねー。
- Newer: RSSのdescriptionがmarkdown記法のままだ
- Older: HDD交換してホームディレクトリを別パーティションに移動