ではVim
、 を押しgg
てドキュメントの先頭に移動するか、go を押しdd
て現在の行を削除します。Web ページで同様の動作を実装するには? つまり、Web ページ環境で、2 つのキーを連続して押すイベントをキャプチャしてイベントをトリガーするにはどうすればよいでしょうか?
ありがとう。
ではVim
、 を押しgg
てドキュメントの先頭に移動するか、go を押しdd
て現在の行を削除します。Web ページで同様の動作を実装するには? つまり、Web ページ環境で、2 つのキーを連続して押すイベントをキャプチャしてイベントをトリガーするにはどうすればよいでしょうか?
ありがとう。
すべてのキー プレス イベントを監視する必要があり、マルチプレス コンボの最初のキーを見つけたら、タイマーを開始します。タイマーがアクティブな間にコンボの 2 番目のキーが押された場合、何かを行います。
例 (疑似コード)
//for gg
var inCombo = false;
function KeyPress(Key) {
if(Key=='g') {
if(!inCombo) {
inCombo = true;
setTimeout('inCombo=false;', 100);
} else {
//Do the action here
}
}
}
,は100ms 以内に 2 回押された//Do the action here
場合にのみ発火しますg
できません。通常のキー イベントを登録し、キーを配列にプッシュするだけです。
これで、コマンドをチェックする関数を呼び出すことができます:
// More or less pseudo code
function deleteLine(){};
function copyLine(){};
var commands = {'dd': deleteLine, 'yy': copyLine};
function onKeyPress(e) {
keyList.push(e.key);
// in this example keyList = ['d', 'y', 'i', 'd', 'd']
var result = handleEvent();
}
function handleEvent(keyList) {
// more pseudo code follows
var cmds = commands.keyValue.sortByLengthDescending();
for(var c in cmds) {
// match the keys
var ckey = c.split('');
for(var i = keyList.length; i >= 0; i--) {
if (keyList[i] !== ckey.shift()) {
break;
}
if (ckey.length === 0) {
return commands[c]();
}
}
}
}
これはシンプルでクリーン (正確に記述する方法によって異なります) でスケーラブルです。さらにコマンドを追加するのは非常に簡単です。もちろん、コマンド関数などにパラメーターを渡すことができるように変更します。