Surfingkeys
インストール
https://chrome.google.com/webstore/detail/surfingkeys/gfbliohnnapiefjpjlpjnehglfpaknnc
GitHub
https://github.com/brookhong/Surfingkeys
設定
;e で設定画面を開く
Advanced mode にチェック。Insertモードになっている場合は i キーで解除
? で変更後キーマップ表示
Vim同様、キーストロークが数値始まりの場合はリピートする
map('g0', ':feedkeys 99E', 0, "#3Go to the first tab");
99回 左にタブを移動するという意味
キーストロークの続く候補があるものに対して、途中のキーストロークを unmap すると以降のキーマップが無効になる
例えば unmap("gx") を実行すると他のタブクローズ系キーマップがすべて消える
キーストロークをツリーで管理しているが、ノードの unmap があると枝葉は切り落とされる
逆に、登録済みのキーストロークに被せて map しても動作しない
登録済みのノードが既にあるので、到達しない
例えば map("gxtt", "t") を実行すると gxt ・ gxtt の両方が候補に出てくる
かと言ってこの後に unmap("gxt") を実行すると gxt ・ gxtt の両方が消える
同様に、登録済みのキーストロークの途中を map すると以降のキーマップが動作しない
登録したキーマップで以降のものを遮ることになるため
addSearchAlias で s と o に紐付いたキーマップは改めて map / unmap できる
設定で利用できるAPI
map
ノーマルモードにて、既存のキーを別のキーに割り当てる。
別のキーに割り当てた後で既存のキーを unmap しても動作する。(既存のキーを先に unmap してしまうと動作しない)
mapkey
設定でできることの限界
キーマッピングは設定で編集できるものの、提供されているAPIから操作できることには限界がある。例えば e キーで「半ページ上スクロール」する機能は、settings の scrollStepSize や smoothScroll、スクロール対象要素、キーストロークのリピートなどを考慮し実現されているが、設定からその処理を指定することができない。
ソースコード読解
デフォルトキーマップの定義 (src/content_scripts/common/default.js)
ノーマルモードの定義 createNormal (src/content_scripts/common/normal.js)
addSearchAlias (src/content_scripts/common/api.js)
第4引数 search_leader_key が未指定のとき、暗黙で s が割り当たる
Omnibar 向けの o 始まり + alias も自動的に登録される
mapkey 第2引数の '#3zoom reset' にあるシャープは何?
第2引数はソースコード内で annotation と名付けられている
parseAnnotation (src/content_scripts/common/utils.js)
annotation.match(/#(\d+)(.*)/)
数値部分: feature_group 以降: annotation
buildUsage (src/content_scripts/ui/frontend.js)
code:js
var feature_groups = [
'Help', // 0
'Mouse Click', // 1
'Scroll Page / Element', // 2
'Tabs', // 3
'Page Navigation', // 4
'Sessions', // 5
'Search selected with', // 6
'Clipboard', // 7
'Omnibar', // 8
'Visual Mode', // 9
'vim-like marks', // 10
'Settings', // 11
'Chrome URLs', // 12
'Proxy', // 13
'Misc', // 14
'Insert Mode', // 15
];
未解決の問題
oh for [Open Search with alias h] is overridden by #8Open URL from history.
Search alias "h" とは GitHub 検索のことである。 ソースコード
addSearchAlias を呼ぶと自動的に先頭に "o" が付けられたキーストローク "oh" が登録される。 ソースコード
"oh" はデフォルトのキーストローク「Open URL from history」として定義されている。 ソースコード
同じ関数内で addSearchAlias → mapkey('oh', ...) の順で呼んでいるため、このような警告が出ている。
後で呼ばれたほうが優先され上書きされる仕様のため、キーストローク "oh" は「Open URL from history」となる。
デフォルトキーストロークを構築してからカスタムスクリプトを読む、という流れなので、回避できない。
参考
https://github.com/brookhong/Surfingkeys/wiki/Migrate-your-settings-from-0.9.74-to-1.0
Surfingkeys 1.0 に向けてAPIが変更になった。
map mapkey などの関数は api 変数の中にある。
src/content_scripts/common/api.js の最後に列挙あり
過去のカスタマイズ事例をコピペするには、スクリプト冒頭で宣言が必要。
公式FAQがある
https://github.com/brookhong/Surfingkeys/wiki/FAQ
https://qiita.com/hush_in/items/653624cf5c516d3143a3
https://qiita.com/hush_in/items/09b549ca8e533340d834