diff options
author | Matthew Sotoudeh <masotoudeh@ucdavis.edu> | 2021-09-05 20:58:16 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-05 20:58:16 -0700 |
commit | 1fb9bb4de0bd38bd6a3870fa102b8f2da3c995bd (patch) | |
tree | 9afe1a805ff21174c8849f335ac2388adcd13248 | |
parent | 0f965d0a7f53908eb55cf33cde0a8aef585b6c31 (diff) | |
parent | 2fd506c131fc62171a144ead94785f2a36e42e93 (diff) |
Add A,I,$,0,o,O bindings. All thanks to @r2dev2 !
-rw-r--r-- | docs-vim.js | 89 |
1 files changed, 40 insertions, 49 deletions
diff --git a/docs-vim.js b/docs-vim.js index 26bf0fd..a09282b 100644 --- a/docs-vim.js +++ b/docs-vim.js @@ -1,19 +1,34 @@ +const useQWERTY = false; +const directionalKeys = useQWERTY ? "hjkl" : "dhtn"; + vim = { "mode": "insert", // Keep track of current mode "num": "", // Keep track of number keys pressed by the user "currentSequence": "", // Keep track of key sequences - "keys": { - "move": "dhtn", // QWERTY: hjkl - "escapeSequence": "hn", // QWERTY: jk or jl - }, - "multiMaps" : { + "escapeSequence": useQWERTY ? "jk" : "hn", + "keyMaps" : { + "Backspace": [["ArrowLeft"]], + "x": [["Delete"]], "b": [["ArrowLeft", true]], // ctrl + <- "e": [["ArrowRight", true]], // ctrl + -> // w is same behavior as eeb - "w": [["ArrowRight", true], ["ArrowRight", true], ["ArrowLeft", true]] - } + "w": [["ArrowRight", true], ["ArrowRight", true], ["ArrowLeft", true]], + "a": [["ArrowRight"]], + "A": [["ArrowDown", true]], + "I": [["ArrowUp", true]], + "$": [["ArrowDown", true]], + "0": [["ArrowUp", true]], + "o": [["ArrowDown", true], ["Enter"]], + "O": [["ArrowUp", true], ["ArrowLeft"], ["Enter"]] + }, + "needsInsert": ["a", "A", "I", "o", "O"] }; +vim.keyMaps[directionalKeys[0]] = [["ArrowLeft"]]; +vim.keyMaps[directionalKeys[1]] = [["ArrowDown"]]; +vim.keyMaps[directionalKeys[2]] = [["ArrowUp"]]; +vim.keyMaps[directionalKeys[3]] = [["ArrowRight"]]; + vim.addKeyMappings = function (baseMap) { baseMap[vim.keys.move[0]] = "ArrowLeft"; baseMap[vim.keys.move[1]] = "ArrowDown"; @@ -52,11 +67,6 @@ vim.normal_keydown = function (e) { e.preventDefault(); e.stopPropagation(); - if (e.key == "a") { - docs.pressKey(docs.codeFromKey("ArrowRight")); - e.key = "i"; - } - if (e.key == "i") { vim.switchToInsertMode(); return true; @@ -67,18 +77,11 @@ vim.normal_keydown = function (e) { return true; } - var keyMap = { "Backspace": "ArrowLeft", "x": "Delete" }; - vim.addKeyMappings(keyMap); - if (e.key.match(/\d+/)) { vim.num += e.key.toString(); } - if (e.key in keyMap) { - e.key = keyMap[e.key]; - } - - vim.multiMaps[e.key]?.forEach(([key, ...args]) => { + vim.keyMaps[e.key]?.forEach(([key, ...args]) => { const numRepeats = parseInt(vim.num) || 1; for (let i = 0; i < numRepeats; i++) { docs.pressKey(docs.codeFromKey(key), ...args); @@ -86,14 +89,9 @@ vim.normal_keydown = function (e) { vim.num = ""; }); - if (e.key.indexOf("Arrow") == 0 || e.key == "Delete") { - if (vim.num.length == 0 || isNaN(vim.num)) { - vim.num = "1"; - } - for (var i = 0; i < Number(vim.num); i++) { - docs.pressKey(docs.codeFromKey(e.key)); - } - vim.num = ""; + if (vim.needsInsert.includes(e.key)) { + vim.switchToInsertMode(); + return true; } return false; @@ -112,46 +110,39 @@ vim.visual_keydown = function (e) { } vim.currentSequence += e.key; - if (vim.currentSequence == vim.keys.escapeSequence) { + if (vim.currentSequence == vim.escapeSequence) { e.preventDefault(); e.stopPropagation(); vim.switchToNormalMode(); return false; } - if (vim.keys.escapeSequence.indexOf(vim.currentSequence) != 0) { + if (vim.escapeSequence.indexOf(vim.currentSequence) != 0) { vim.currentSequence = e.key; } e.preventDefault(); e.stopPropagation(); - var keyMap = { "Backspace": "ArrowLeft", "x": "Delete" }; - vim.addKeyMappings(keyMap); - if (e.key.match(/\d+/)) { vim.num += e.key.toString(); } - if (e.key in keyMap) { - e.key = keyMap[e.key]; - } - - if (e.key.indexOf("Arrow") == 0 || e.key == "Delete") { - if (vim.num.length == 0 || isNaN(vim.num)) { - vim.num = "1"; - } - for (var i = 0; i < Number(vim.num); i++) { - if (e.key.indexOf("Arrow") == 0) { - docs.pressKey(docs.codeFromKey(e.key), false, true); + vim.keyMaps[e.key]?.forEach(([key, ...args]) => { + const numRepeats = parseInt(vim.num) || 1; + for (let i = 0; i < numRepeats; i++) { + if (key.indexOf("Arrow") == 0) { + // get the special keys pressed and default to false + const keyArgs = [...args, false, false].slice(0, 2); + keyArgs[1] = true; + docs.pressKey(docs.codeFromKey(key), ...keyArgs); } else { - docs.pressKey(docs.codeFromKey(e.key)); - // Switch to normal mode when 'x' pressed + docs.pressKey(docs.codeFromKey(key), ...args); vim.switchToNormalMode(); } } vim.num = ""; - } + }); return false; }; @@ -163,7 +154,7 @@ vim.insert_keydown = function (e) { } vim.currentSequence += e.key; - if (vim.currentSequence == vim.keys.escapeSequence) { + if (vim.currentSequence == vim.escapeSequence) { e.preventDefault(); e.stopPropagation(); @@ -176,7 +167,7 @@ vim.insert_keydown = function (e) { vim.switchToNormalMode(); return false; } - if (vim.keys.escapeSequence.indexOf(vim.currentSequence) != 0) { + if (vim.escapeSequence.indexOf(vim.currentSequence) != 0) { vim.currentSequence = e.key; } }; |