From a5c3e7dbcf07d805e007eb81ded6dfa8c90e72d5 Mon Sep 17 00:00:00 2001 From: Strackeror Date: Tue, 2 Jul 2024 13:55:29 +0200 Subject: [PATCH 01/16] Behavior choice: Basic helix keymap --- meta.ts | 3 + package.build.ts | 50 +- package.json | 1061 +++++++++++++++++++++-------- src/api/data/commands.yaml | 456 ++++++++----- src/commands/README.md | 640 ++++++++--------- src/commands/edit.ts | 44 +- src/commands/history.ts | 14 +- src/commands/layouts/azerty.fr.md | 640 ++++++++--------- src/commands/layouts/qwerty.md | 640 ++++++++--------- src/commands/misc.ts | 2 +- src/commands/modes.ts | 22 +- src/commands/search.ts | 32 +- src/commands/seek.ts | 20 +- src/commands/select.ts | 59 +- src/commands/selections.rotate.ts | 16 +- src/commands/selections.ts | 54 +- src/commands/view.ts | 8 +- src/state/extension.ts | 14 + 18 files changed, 2233 insertions(+), 1542 deletions(-) diff --git a/meta.ts b/meta.ts index 5b0dfbbc..c6db3888 100644 --- a/meta.ts +++ b/meta.ts @@ -519,6 +519,9 @@ export function parseKeys(keys: string) { const remainingKeybinding = keybinding.replace(/[csa]-/g, ""), whenClauses = ["editorTextFocus"]; + if (category !== "core") { + whenClauses.push(`dance.behavior == '${category}'`); + } for (let tag of tags.split(", ")) { const negate = tag.startsWith("!"); if (negate) { diff --git a/package.build.ts b/package.build.ts index 1bb2577c..76489367 100644 --- a/package.build.ts +++ b/package.build.ts @@ -206,6 +206,12 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ description: "Controls which mode is set by default when an editor is opened.", ...modeNamePattern, }, + "dance.behavior": { + enum: ["kakoune", "helix"], + enumItemLabels: ["Kakoune", "Helix"], + description: "Controls which base set of editor keybinds to use", + default: "kakoune", + }, "dance.modes": { type: "object", scope: "language-overridable", @@ -765,32 +771,28 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ ...symbols.map((x) => `Shift+${x}`), ]); - const keysToAssignForNormal = new Set(keysToAssign); - const keysToAssignForVisual = new Set(keysToAssign); - - for (const keybinding of keybindings) { - if (keybinding.when.includes("dance.mode == 'normal'")) { - keysToAssignForNormal.delete(keybinding.key); + for (const [category, mode] of [ + ["kakoune", "normal"], + ["helix", "normal"], + ["helix", "select"], + ]) { + const unassignedKeys = new Set(keysToAssign); + for (const keybinding of keybindings) { + const isInCategory = + keybinding.when.includes(`dance.behavior == '${category}'`) || !keybinding.when.includes("dance.behavior"); + const isMode = keybinding.when.includes(`dance.mode == '${mode}'`); + if (isMode && isInCategory) { + unassignedKeys.delete(keybinding.key); + } } - if (keybinding.when.includes("dance.mode == 'select'")) { - keysToAssignForVisual.delete(keybinding.key); - } - } - for (const keyToAssign of keysToAssignForNormal) { - keybindings.push({ - command: "dance.ignore", - key: keyToAssign, - when: "editorTextFocus && dance.mode == 'normal'", - }); - } - - for (const keyToAssign of keysToAssignForVisual) { - keybindings.push({ - command: "dance.ignore", - key: keyToAssign, - when: "editorTextFocus && dance.mode == 'select'", - }); + for (const unassignedKey of unassignedKeys) { + keybindings.push({ + key: unassignedKey, + command: "dance.ignore", + when: `dance.mode == '${mode}' && dance.behavior == '${category}'`, + }); + } } return keybindings; diff --git a/package.json b/package.json index e705a67b..c6debb29 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,18 @@ "pattern": "^[a-zA-Z]\\w*$", "patternErrorMessage": "" }, + "dance.behavior": { + "enum": [ + "kakoune", + "helix" + ], + "enumItemLabels": [ + "Kakoune", + "Helix" + ], + "description": "Controls which base set of editor keybinds to use", + "default": "kakoune" + }, "dance.modes": { "type": "object", "scope": "language-overridable", @@ -2783,7 +2795,19 @@ }, { "key": "Alt+`", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Swap case", + "command": "dance.edit.case.swap" + }, + { + "key": "Shift+`", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Swap case", + "command": "dance.edit.case.swap" + }, + { + "key": "Shift+`", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Swap case", "command": "dance.edit.case.swap" }, @@ -2793,21 +2817,39 @@ "title": "Transform to lower case", "command": "dance.edit.case.toLower" }, + { + "key": "`", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Transform to lower case", + "command": "dance.edit.case.toLower" + }, { "key": "Shift+`", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Transform to upper case", + "command": "dance.edit.case.toUpper" + }, + { + "key": "Alt+`", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Transform to upper case", + "command": "dance.edit.case.toUpper" + }, + { + "key": "Alt+`", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Transform to upper case", "command": "dance.edit.case.toUpper" }, { "key": "Shift+Alt+7", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Copy indentation", "command": "dance.edit.copyIndentation" }, { "key": "Shift+Alt+,", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Deindent selected lines", "command": "dance.edit.deindent" }, @@ -2817,15 +2859,27 @@ "title": "Deindent selected lines (including incomplete indent)", "command": "dance.edit.deindent.withIncomplete" }, + { + "key": "Shift+,", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Deindent selected lines (including incomplete indent)", + "command": "dance.edit.deindent.withIncomplete" + }, { "key": "Alt+D", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Delete", "command": "dance.edit.delete" }, + { + "key": "Alt+D", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Delete", + "command": "dance.edit.delete" + }, { "key": "Alt+C", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Delete and switch to Insert", "command": "dance.edit.delete-insert" }, @@ -2835,15 +2889,21 @@ "title": "Indent selected lines", "command": "dance.edit.indent" }, + { + "key": "Shift+.", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Indent selected lines", + "command": "dance.edit.indent" + }, { "key": "Shift+Alt+.", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Indent selected lines (including empty lines)", "command": "dance.edit.indent.withEmpty" }, { "key": "Shift+Alt+R", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Insert contents of register", "command": "dance.edit.insert" }, @@ -2853,15 +2913,27 @@ "title": "Join lines", "command": "dance.edit.join" }, + { + "key": "Shift+J", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Join lines", + "command": "dance.edit.join" + }, { "key": "Shift+Alt+J", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Join lines and select inserted separators", "command": "dance.edit.join.select" }, + { + "key": "Shift+Alt+J", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Join lines and select inserted separators", + "command": "dance.edit.join.select" + }, { "key": "Shift+Alt+O", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Insert new line above each selection", "command": "dance.edit.newLine.above" }, @@ -2871,9 +2943,15 @@ "title": "Insert new line above and switch to insert", "command": "dance.edit.newLine.above.insert" }, + { + "key": "Shift+O", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Insert new line above and switch to insert", + "command": "dance.edit.newLine.above.insert" + }, { "key": "Alt+O", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Insert new line below each selection", "command": "dance.edit.newLine.below" }, @@ -2883,12 +2961,30 @@ "title": "Insert new line below and switch to insert", "command": "dance.edit.newLine.below.insert" }, + { + "key": "O", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Insert new line below and switch to insert", + "command": "dance.edit.newLine.below.insert" + }, + { + "key": "P", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Paste after", + "command": "dance.edit.paste.after" + }, { "key": "P", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Paste after and select", "command": "dance.edit.paste.after.select" }, + { + "key": "Shift+P", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Paste before", + "command": "dance.edit.paste.before" + }, { "key": "Shift+P", "when": "editorTextFocus && dance.mode == 'normal'", @@ -2897,13 +2993,13 @@ }, { "key": "Alt+P", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Paste all after and select", "command": "dance.edit.pasteAll.after.select" }, { "key": "Shift+Alt+P", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Paste all before and select", "command": "dance.edit.pasteAll.before.select" }, @@ -2915,13 +3011,13 @@ }, { "key": "Ctrl+R", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Pick register and replace", "command": "dance.edit.selectRegister-insert" }, { "key": "Ctrl+R", - "when": "editorTextFocus && dance.mode == 'insert'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert'", "title": "Pick register and replace", "command": "dance.edit.selectRegister-insert" }, @@ -2933,7 +3029,7 @@ }, { "key": "D", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Copy and delete", "command": "dance.edit.yank-delete" }, @@ -2945,37 +3041,37 @@ }, { "key": "C", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Copy, delete and switch to Insert", "command": "dance.edit.yank-delete-insert" }, { "key": "Shift+R", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Copy and replace", "command": "dance.edit.yank-replace" }, { "key": "Q", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Replay recording", "command": "dance.history.recording.play" }, { "key": "Shift+Q", - "when": "editorTextFocus && dance.mode == 'normal' && !dance.isRecording", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && !dance.isRecording", "title": "Start recording", "command": "dance.history.recording.start" }, { "key": "Escape", - "when": "editorTextFocus && dance.mode == 'normal' && dance.isRecording", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording", "title": "Stop recording", "command": "dance.history.recording.stop" }, { "key": "Shift+Q", - "when": "editorTextFocus && dance.mode == 'normal' && dance.isRecording", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording", "title": "Stop recording", "command": "dance.history.recording.stop" }, @@ -2987,13 +3083,13 @@ }, { "key": "Shift+U", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Redo", "command": "dance.history.redo" }, { "key": "Shift+Alt+U", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Redo a change of selections", "command": "dance.history.redo.selections" }, @@ -3015,6 +3111,12 @@ "title": "Repeat last seek", "command": "dance.history.repeat.seek" }, + { + "key": "Alt+.", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Repeat last seek", + "command": "dance.history.repeat.seek" + }, { "key": "U", "when": "editorTextFocus && dance.mode == 'normal'", @@ -3023,13 +3125,13 @@ }, { "key": "U", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Undo", "command": "dance.history.undo" }, { "key": "Alt+U", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Undo a change of selections", "command": "dance.history.undo.selections" }, @@ -3261,24 +3363,48 @@ "title": "Insert after", "command": "dance.modes.insert.after" }, + { + "key": "A", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Insert after", + "command": "dance.modes.insert.after" + }, { "key": "I", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert before", "command": "dance.modes.insert.before" }, + { + "key": "I", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Insert before", + "command": "dance.modes.insert.before" + }, { "key": "Shift+A", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert at line end", "command": "dance.modes.insert.lineEnd" }, + { + "key": "Shift+A", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Insert at line end", + "command": "dance.modes.insert.lineEnd" + }, { "key": "Shift+I", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert at line start", "command": "dance.modes.insert.lineStart" }, + { + "key": "Shift+I", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Insert at line start", + "command": "dance.modes.insert.lineStart" + }, { "key": "Escape", "when": "editorTextFocus && dance.mode == 'insert'", @@ -3287,19 +3413,31 @@ }, { "key": "Escape", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Set mode to Normal", + "command": "dance.modes.set.normal" + }, + { + "key": "V", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Set mode to Normal", "command": "dance.modes.set.normal" }, + { + "key": "V", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Set mode to Select", + "command": "dance.modes.set.select" + }, { "key": "Ctrl+V", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Temporary Insert mode", "command": "dance.modes.set.temporarily.insert" }, { "key": "Ctrl+V", - "when": "editorTextFocus && dance.mode == 'insert'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert'", "title": "Temporary Normal mode", "command": "dance.modes.set.temporarily.normal" }, @@ -3317,19 +3455,37 @@ }, { "key": "Alt+/", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Search backward", + "command": "dance.search.backward" + }, + { + "key": "Shift+/", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", "title": "Search backward", "command": "dance.search.backward" }, { "key": "Shift+Alt+/", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Search backward (extend)", "command": "dance.search.backward.extend" }, { "key": "Shift+/", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Search backward (extend)", + "command": "dance.search.backward.extend" + }, + { + "key": "Shift+/", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Search (extend)", + "command": "dance.search.extend" + }, + { + "key": "/", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Search (extend)", "command": "dance.search.extend" }, @@ -3341,19 +3497,37 @@ }, { "key": "Shift+N", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Add next match", + "command": "dance.search.next.add" + }, + { + "key": "N", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Add next match", "command": "dance.search.next.add" }, { "key": "Alt+N", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Select previous match", + "command": "dance.search.previous" + }, + { + "key": "Shift+N", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", "title": "Select previous match", "command": "dance.search.previous" }, { "key": "Shift+Alt+N", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Add previous match", + "command": "dance.search.previous.add" + }, + { + "key": "Shift+N", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Add previous match", "command": "dance.search.previous.add" }, @@ -3389,127 +3563,133 @@ }, { "key": "Alt+A", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select whole object", "command": "dance.seek.askObject" }, { "key": "Alt+A", - "when": "editorTextFocus && dance.mode == 'insert'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert'", "title": "Select whole object", "command": "dance.seek.askObject" }, { "key": "]", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select to whole object end", "command": "dance.seek.askObject.end" }, { "key": "Shift+]", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to whole object end", "command": "dance.seek.askObject.end.extend" }, { "key": "Alt+I", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select inner object", "command": "dance.seek.askObject.inner" }, { "key": "Alt+I", - "when": "editorTextFocus && dance.mode == 'insert'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert'", "title": "Select inner object", "command": "dance.seek.askObject.inner" }, { "key": "Alt+]", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select to inner object end", "command": "dance.seek.askObject.inner.end" }, { "key": "Shift+Alt+]", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to inner object end", "command": "dance.seek.askObject.inner.end.extend" }, { "key": "Alt+[", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select to inner object start", "command": "dance.seek.askObject.inner.start" }, { "key": "Shift+Alt+[", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to inner object start", "command": "dance.seek.askObject.inner.start.extend" }, { "key": "[", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select to whole object start", "command": "dance.seek.askObject.start" }, { "key": "Shift+[", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to whole object start", "command": "dance.seek.askObject.start.extend" }, { "key": "Alt+T", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Select to character (excluded, backward)", + "command": "dance.seek.backward" + }, + { + "key": "Shift+T", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", "title": "Select to character (excluded, backward)", "command": "dance.seek.backward" }, { "key": "M", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select to next enclosing character", "command": "dance.seek.enclosing" }, { "key": "Alt+M", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select to previous enclosing character", "command": "dance.seek.enclosing.backward" }, { "key": "Shift+M", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to next enclosing character", "command": "dance.seek.enclosing.extend" }, { "key": "Shift+Alt+M", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to previous enclosing character", "command": "dance.seek.enclosing.extend.backward" }, { "key": "Shift+T", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to character (excluded)", "command": "dance.seek.extend" }, { "key": "T", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to character (excluded)", "command": "dance.seek.extend" }, { "key": "Shift+Alt+T", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to character (excluded, backward)", "command": "dance.seek.extend.backward" }, { "key": "Shift+T", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to character (excluded, backward)", "command": "dance.seek.extend.backward" }, @@ -3521,31 +3701,37 @@ }, { "key": "Alt+F", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select to character (included, backward)", "command": "dance.seek.included.backward" }, { "key": "Shift+F", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Select to character (included, backward)", + "command": "dance.seek.included.backward" + }, + { + "key": "Shift+F", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to character (included)", "command": "dance.seek.included.extend" }, { "key": "F", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to character (included)", "command": "dance.seek.included.extend" }, { "key": "Shift+Alt+F", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to character (included, backward)", "command": "dance.seek.included.extend.backward" }, { "key": "Shift+F", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to character (included, backward)", "command": "dance.seek.included.extend.backward" }, @@ -3563,61 +3749,73 @@ }, { "key": "Shift+W", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to next word start", "command": "dance.seek.word.extend" }, { "key": "W", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to next word start", "command": "dance.seek.word.extend" }, { "key": "Shift+B", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to previous word start", "command": "dance.seek.word.extend.backward" }, { "key": "B", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to previous word start", "command": "dance.seek.word.extend.backward" }, { "key": "Alt+W", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Select to next non-whitespace word start", + "command": "dance.seek.word.ws" + }, + { + "key": "Shift+W", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", "title": "Select to next non-whitespace word start", "command": "dance.seek.word.ws" }, { "key": "Alt+B", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Select to previous non-whitespace word start", + "command": "dance.seek.word.ws.backward" + }, + { + "key": "Shift+B", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", "title": "Select to previous non-whitespace word start", "command": "dance.seek.word.ws.backward" }, { "key": "Shift+Alt+W", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to next non-whitespace word start", "command": "dance.seek.word.ws.extend" }, { "key": "Shift+W", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to next non-whitespace word start", "command": "dance.seek.word.ws.extend" }, { "key": "Shift+Alt+B", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to previous non-whitespace word start", "command": "dance.seek.word.ws.extend.backward" }, { "key": "Shift+B", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to previous non-whitespace word start", "command": "dance.seek.word.ws.extend.backward" }, @@ -3629,61 +3827,67 @@ }, { "key": "Shift+E", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to next word end", "command": "dance.seek.wordEnd.extend" }, { "key": "E", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to next word end", "command": "dance.seek.wordEnd.extend" }, { "key": "Alt+E", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Select to next non-whitespace word end", + "command": "dance.seek.wordEnd.ws" + }, + { + "key": "Shift+E", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", "title": "Select to next non-whitespace word end", "command": "dance.seek.wordEnd.ws" }, { "key": "Shift+Alt+E", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to next non-whitespace word end", "command": "dance.seek.wordEnd.ws.extend" }, { "key": "Shift+E", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to next non-whitespace word end", "command": "dance.seek.wordEnd.ws.extend" }, { "key": "Shift+5", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select whole buffer", "command": "dance.select.buffer" }, { "key": "Shift+J", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend down", "command": "dance.select.down.extend" }, { "key": "Shift+Down", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend down", "command": "dance.select.down.extend" }, { "key": "J", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend down", "command": "dance.select.down.extend" }, { "key": "Down", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend down", "command": "dance.select.down.extend" }, @@ -3701,25 +3905,25 @@ }, { "key": "Shift+H", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend left", "command": "dance.select.left.extend" }, { "key": "Shift+Left", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend left", "command": "dance.select.left.extend" }, { "key": "H", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend left", "command": "dance.select.left.extend" }, { "key": "Left", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend left", "command": "dance.select.left.extend" }, @@ -3735,9 +3939,21 @@ "title": "Jump left", "command": "dance.select.left.jump" }, + { + "key": "X", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Extend to line below", + "command": "dance.select.line.below.extend" + }, + { + "key": "X", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Extend to line below", + "command": "dance.select.line.below.extend" + }, { "key": "Alt+L", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select to line end", "command": "dance.select.lineEnd" }, @@ -3749,19 +3965,25 @@ }, { "key": "Shift+Alt+L", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to line end", "command": "dance.select.lineEnd.extend" }, { "key": "Shift+End", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Extend to line end", + "command": "dance.select.lineEnd.extend" + }, + { + "key": "End", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to line end", "command": "dance.select.lineEnd.extend" }, { "key": "Alt+H", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Select to line start", "command": "dance.select.lineStart" }, @@ -3773,37 +3995,43 @@ }, { "key": "Shift+Alt+H", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to line start", "command": "dance.select.lineStart.extend" }, { "key": "Shift+Home", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Extend to line start", + "command": "dance.select.lineStart.extend" + }, + { + "key": "Home", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to line start", "command": "dance.select.lineStart.extend" }, { "key": "Shift+L", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend right", "command": "dance.select.right.extend" }, { "key": "Shift+Right", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend right", "command": "dance.select.right.extend" }, { "key": "L", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend right", "command": "dance.select.right.extend" }, { "key": "Right", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend right", "command": "dance.select.right.extend" }, @@ -3821,13 +4049,13 @@ }, { "key": "Shift+G", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend to", "command": "dance.select.to.extend" }, { "key": "G", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend to", "command": "dance.select.to.extend" }, @@ -3839,25 +4067,25 @@ }, { "key": "Shift+K", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend up", "command": "dance.select.up.extend" }, { "key": "Shift+Up", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Extend up", "command": "dance.select.up.extend" }, { "key": "K", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend up", "command": "dance.select.up.extend" }, { "key": "Up", - "when": "editorTextFocus && dance.mode == 'select'", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Extend up", "command": "dance.select.up.extend" }, @@ -3954,10 +4182,56 @@ } }, { - "key": "Alt+;", - "when": "editorTextFocus && dance.mode == 'normal'", - "title": "Change direction of selections", - "command": "dance.selections.changeDirection" + "key": "Ctrl+F", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "command": "dance.select.vertically", + "args": { + "direction": 1, + "by": "page", + "shift": "extend" + } + }, + { + "key": "Ctrl+D", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "command": "dance.select.vertically", + "args": { + "direction": 1, + "by": "halfPage", + "shift": "extend" + } + }, + { + "key": "Ctrl+B", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "command": "dance.select.vertically", + "args": { + "direction": -1, + "by": "page", + "shift": "extend" + } + }, + { + "key": "Ctrl+U", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "command": "dance.select.vertically", + "args": { + "direction": -1, + "by": "halfPage", + "shift": "extend" + } + }, + { + "key": "Alt+;", + "when": "editorTextFocus && dance.mode == 'normal'", + "title": "Change direction of selections", + "command": "dance.selections.changeDirection" + }, + { + "key": "Alt+;", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Change direction of selections", + "command": "dance.selections.changeDirection" }, { "key": "Alt+,", @@ -3965,33 +4239,57 @@ "title": "Clear main selections", "command": "dance.selections.clear.main" }, + { + "key": "Alt+,", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Clear main selections", + "command": "dance.selections.clear.main" + }, { "key": ",", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Clear secondary selections", "command": "dance.selections.clear.secondary" }, + { + "key": ",", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Clear secondary selections", + "command": "dance.selections.clear.secondary" + }, { "key": "Shift+C", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Copy selections below", "command": "dance.selections.copy" }, { "key": "Shift+Alt+C", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Copy selections above", "command": "dance.selections.copy.above" }, { "key": "X", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Expand to lines", + "command": "dance.selections.expandToLines" + }, + { + "key": "Shift+X", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Expand to lines", + "command": "dance.selections.expandToLines" + }, + { + "key": "Shift+X", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Expand to lines", "command": "dance.selections.expandToLines" }, { "key": "Shift+Alt+;", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Forward selections", "command": "dance.selections.faceForward" }, @@ -4001,21 +4299,39 @@ "title": "Filter selections", "command": "dance.selections.filter" }, + { + "key": "Shift+4", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Filter selections", + "command": "dance.selections.filter" + }, { "key": "Alt+K", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Keep matching selections", "command": "dance.selections.filter.regexp" }, + { + "key": "Alt+K", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Keep matching selections", + "command": "dance.selections.filter.regexp" + }, { "key": "Shift+Alt+K", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Clear matching selections", "command": "dance.selections.filter.regexp.inverse" }, + { + "key": "Shift+Alt+K", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Clear matching selections", + "command": "dance.selections.filter.regexp.inverse" + }, { "key": "Shift+Alt+-", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Merge contiguous selections", "command": "dance.selections.merge" }, @@ -4025,51 +4341,81 @@ "title": "Pipe selections", "command": "dance.selections.pipe" }, + { + "key": "Shift+Alt+\\", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Pipe selections", + "command": "dance.selections.pipe" + }, { "key": "Shift+1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe and append", "command": "dance.selections.pipe.append" }, + { + "key": "Shift+1", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Pipe and append", + "command": "dance.selections.pipe.append" + }, { "key": "Shift+Alt+1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe and prepend", "command": "dance.selections.pipe.prepend" }, + { + "key": "Shift+Alt+1", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Pipe and prepend", + "command": "dance.selections.pipe.prepend" + }, { "key": "Shift+\\", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe and replace", "command": "dance.selections.pipe.replace" }, + { + "key": "Shift+\\", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Pipe and replace", + "command": "dance.selections.pipe.replace" + }, { "key": ";", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Reduce selections to their cursor", "command": "dance.selections.reduce" }, + { + "key": ";", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Reduce selections to their cursor", + "command": "dance.selections.reduce" + }, { "key": "Shift+Alt+S", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Reduce selections to their ends", "command": "dance.selections.reduce.edges" }, { "key": "Z", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Restore selections", "command": "dance.selections.restore" }, { "key": "Alt+Z", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Combine register selections with current ones", "command": "dance.selections.restore.withCurrent" }, { "key": "Shift+Alt+Z", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "command": "dance.selections.restore.withCurrent", "args": { "reverse": true, @@ -4078,7 +4424,7 @@ }, { "key": "Shift+Z", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Save selections", "command": "dance.selections.save" }, @@ -4088,27 +4434,51 @@ "title": "Copy selections text", "command": "dance.selections.saveText" }, + { + "key": "Y", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Copy selections text", + "command": "dance.selections.saveText" + }, { "key": "S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Leap or select", "command": "dance.selections.select.orLeap" }, + { + "key": "S", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Leap or select", + "command": "dance.selections.select.orLeap" + }, { "key": "Shift+S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Split selections", "command": "dance.selections.split" }, + { + "key": "Shift+S", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Split selections", + "command": "dance.selections.split" + }, { "key": "Alt+S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Leap or select backward", "command": "dance.selections.splitLines.orLeap.backward" }, + { + "key": "Alt+S", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Leap or select backward", + "command": "dance.selections.splitLines.orLeap.backward" + }, { "key": "Enter", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'dance' && dance.mode == 'normal'", "title": "Toggle selection indices", "command": "dance.selections.toggleIndices" }, @@ -4118,24 +4488,60 @@ "title": "Trim lines", "command": "dance.selections.trimLines" }, + { + "key": "Alt+X", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Trim lines", + "command": "dance.selections.trimLines" + }, { "key": "Shift+-", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Trim whitespace", "command": "dance.selections.trimWhitespace" }, + { + "key": "Shift+-", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Trim whitespace", + "command": "dance.selections.trimWhitespace" + }, { "key": "Shift+Alt+0", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Rotate selections clockwise", "command": "dance.selections.rotate.both" }, { "key": "Shift+Alt+9", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Rotate selections counter-clockwise", "command": "dance.selections.rotate.both.reverse" }, + { + "key": "Shift+Alt+0", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Rotate selections clockwise (contents only)", + "command": "dance.selections.rotate.contents" + }, + { + "key": "Shift+Alt+0", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Rotate selections clockwise (contents only)", + "command": "dance.selections.rotate.contents" + }, + { + "key": "Shift+Alt+9", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Rotate selections counter-clockwise (contents only)", + "command": "dance.selections.rotate.contents.reverse" + }, + { + "key": "Shift+Alt+9", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Rotate selections counter-clockwise (contents only)", + "command": "dance.selections.rotate.contents.reverse" + }, { "key": "Shift+0", "when": "editorTextFocus && dance.mode == 'normal'", @@ -4148,9 +4554,35 @@ "title": "Rotate selections counter-clockwise (selections only)", "command": "dance.selections.rotate.selections.reverse" }, + { + "key": "Shift+9", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Rotate selections counter-clockwise (selections only)", + "command": "dance.selections.rotate.selections.reverse" + }, { "key": "V", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "title": "Show view menu", + "command": "dance.openMenu", + "args": { + "menu": "view", + "$exclude": [] + } + }, + { + "key": "Z", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Show view menu", + "command": "dance.openMenu", + "args": { + "menu": "view", + "$exclude": [] + } + }, + { + "key": "Z", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", "title": "Show view menu", "command": "dance.openMenu", "args": { @@ -4160,7 +4592,7 @@ }, { "key": "Shift+V", - "when": "editorTextFocus && dance.mode == 'normal'", + "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", "title": "Show view menu (locked)", "command": "dance.openMenu", "args": { @@ -4170,439 +4602,486 @@ } }, { - "command": "dance.ignore", - "key": "Shift+D", - "when": "editorTextFocus && dance.mode == 'normal'" + "key": "Shift+Z", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "title": "Show view menu (locked)", + "command": "dance.openMenu", + "args": { + "menu": "view", + "locked": true, + "$exclude": [] + } }, { + "key": "Shift+Z", + "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "title": "Show view menu (locked)", + "command": "dance.openMenu", + "args": { + "menu": "view", + "locked": true, + "$exclude": [] + } + }, + { + "key": "Shift+D", "command": "dance.ignore", - "key": "Shift+X", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Shift+X", "command": "dance.ignore", - "key": "Shift+Y", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Shift+Y", "command": "dance.ignore", - "key": "Shift+2", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Shift+2", "command": "dance.ignore", - "key": "Shift+3", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Shift+3", "command": "dance.ignore", - "key": "Shift+6", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Shift+6", "command": "dance.ignore", - "key": "'", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "'", "command": "dance.ignore", - "key": "-", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "-", "command": "dance.ignore", - "key": "=", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "=", "command": "dance.ignore", - "key": "Tab", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Tab", "command": "dance.ignore", - "key": "Space", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Space", "command": "dance.ignore", - "key": "NumPad_Add", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "NumPad_Add", "command": "dance.ignore", - "key": "NumPad_Subtract", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "NumPad_Subtract", "command": "dance.ignore", - "key": "Shift+=", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Shift+=", "command": "dance.ignore", - "key": "Shift+Tab", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Shift+Tab", "command": "dance.ignore", - "key": "Shift+Space", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Shift+Space", "command": "dance.ignore", - "key": "Shift+NumPad_Add", - "when": "editorTextFocus && dance.mode == 'normal'" + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "Shift+NumPad_Add", "command": "dance.ignore", + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + }, + { "key": "Shift+NumPad_Subtract", - "when": "editorTextFocus && dance.mode == 'normal'" + "command": "dance.ignore", + "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" }, { + "key": "M", "command": "dance.ignore", - "key": "A", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Q", "command": "dance.ignore", - "key": "I", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+C", "command": "dance.ignore", - "key": "M", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+D", "command": "dance.ignore", - "key": "N", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+G", "command": "dance.ignore", - "key": "O", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+H", "command": "dance.ignore", - "key": "P", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+J", "command": "dance.ignore", - "key": "Q", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+K", "command": "dance.ignore", - "key": "R", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+L", "command": "dance.ignore", - "key": "S", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+M", "command": "dance.ignore", - "key": "V", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+Q", "command": "dance.ignore", - "key": "X", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+R", "command": "dance.ignore", - "key": "Y", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+V", "command": "dance.ignore", - "key": "Z", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+Y", "command": "dance.ignore", - "key": "0", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+2", "command": "dance.ignore", - "key": "1", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+3", "command": "dance.ignore", - "key": "2", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+5", "command": "dance.ignore", - "key": "3", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+6", "command": "dance.ignore", - "key": "4", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "'", "command": "dance.ignore", - "key": "5", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "-", "command": "dance.ignore", - "key": "6", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "=", "command": "dance.ignore", - "key": "7", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Tab", "command": "dance.ignore", - "key": "8", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Space", "command": "dance.ignore", - "key": "9", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "NumPad_Add", "command": "dance.ignore", - "key": "Shift+A", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "NumPad_Subtract", "command": "dance.ignore", - "key": "Shift+C", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+=", "command": "dance.ignore", - "key": "Shift+D", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+Tab", "command": "dance.ignore", - "key": "Shift+G", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+Space", "command": "dance.ignore", - "key": "Shift+H", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" + }, + { + "key": "Shift+NumPad_Add", + "command": "dance.ignore", + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "Shift+NumPad_Subtract", "command": "dance.ignore", - "key": "Shift+I", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'normal' && dance.behavior == 'helix'" }, { + "key": "M", "command": "dance.ignore", - "key": "Shift+J", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Q", "command": "dance.ignore", - "key": "Shift+K", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "R", "command": "dance.ignore", - "key": "Shift+L", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "0", "command": "dance.ignore", - "key": "Shift+M", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "1", "command": "dance.ignore", - "key": "Shift+N", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "2", "command": "dance.ignore", - "key": "Shift+O", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "3", "command": "dance.ignore", - "key": "Shift+P", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "4", "command": "dance.ignore", - "key": "Shift+Q", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "5", "command": "dance.ignore", - "key": "Shift+R", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "6", "command": "dance.ignore", - "key": "Shift+S", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "7", "command": "dance.ignore", - "key": "Shift+V", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "8", "command": "dance.ignore", - "key": "Shift+X", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "9", "command": "dance.ignore", - "key": "Shift+Y", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+C", "command": "dance.ignore", - "key": "Shift+Z", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+D", "command": "dance.ignore", - "key": "Shift+0", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+G", "command": "dance.ignore", - "key": "Shift+1", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+H", "command": "dance.ignore", - "key": "Shift+2", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+K", "command": "dance.ignore", - "key": "Shift+3", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+L", "command": "dance.ignore", - "key": "Shift+4", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+M", "command": "dance.ignore", - "key": "Shift+5", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+Q", "command": "dance.ignore", - "key": "Shift+6", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+R", "command": "dance.ignore", - "key": "Shift+7", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+V", "command": "dance.ignore", - "key": "Shift+8", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+Y", "command": "dance.ignore", - "key": "Shift+9", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+0", "command": "dance.ignore", - "key": ",", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+2", "command": "dance.ignore", - "key": "'", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+3", "command": "dance.ignore", - "key": "-", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+5", "command": "dance.ignore", - "key": "=", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+6", "command": "dance.ignore", - "key": "Tab", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+7", "command": "dance.ignore", - "key": "Space", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+8", "command": "dance.ignore", - "key": "NumPad_Add", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "'", "command": "dance.ignore", - "key": "NumPad_Subtract", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "-", "command": "dance.ignore", - "key": "Shift+,", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "=", "command": "dance.ignore", - "key": "Shift+'", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Tab", "command": "dance.ignore", - "key": "Shift+-", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Space", "command": "dance.ignore", - "key": "Shift+=", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "NumPad_Add", "command": "dance.ignore", - "key": "Shift+Tab", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "NumPad_Subtract", "command": "dance.ignore", - "key": "Shift+Space", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+'", "command": "dance.ignore", - "key": "Shift+NumPad_Add", - "when": "editorTextFocus && dance.mode == 'select'" + "when": "dance.mode == 'select' && dance.behavior == 'helix'" + }, + { + "key": "Shift+=", + "command": "dance.ignore", + "when": "dance.mode == 'select' && dance.behavior == 'helix'" }, { + "key": "Shift+Tab", + "command": "dance.ignore", + "when": "dance.mode == 'select' && dance.behavior == 'helix'" + }, + { + "key": "Shift+Space", + "command": "dance.ignore", + "when": "dance.mode == 'select' && dance.behavior == 'helix'" + }, + { + "key": "Shift+NumPad_Add", "command": "dance.ignore", + "when": "dance.mode == 'select' && dance.behavior == 'helix'" + }, + { "key": "Shift+NumPad_Subtract", - "when": "editorTextFocus && dance.mode == 'select'" + "command": "dance.ignore", + "when": "dance.mode == 'select' && dance.behavior == 'helix'" } ] } diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index 17f6d0f1..141edaaf 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -48,7 +48,7 @@ edit.align: keys: qwerty: |- - `&` (kakoune: normal) + `&` (core: normal) doc: en: |+ @@ -64,6 +64,8 @@ edit.case.swap: keys: qwerty: |- `` a-` `` (kakoune: normal) + `` s-` `` (helix: normal) + `` s-` `` (helix: select) doc: en: |+ @@ -75,7 +77,8 @@ edit.case.toLower: keys: qwerty: |- - `` ` `` (kakoune: normal) + `` ` `` (core: normal) + `` ` `` (helix: select) doc: en: |+ @@ -88,6 +91,8 @@ edit.case.toUpper: keys: qwerty: |- `` s-` `` (kakoune: normal) + `` a-` `` (helix: normal) + `` a-` `` (helix: select) doc: en: |+ @@ -126,7 +131,8 @@ edit.deindent.withIncomplete: keys: qwerty: |- - `<` (kakoune: normal) + `<` (core: normal) + `<` (helix: select) doc: en: |+ @@ -141,7 +147,8 @@ edit.delete: keys: qwerty: |- - `a-d` (kakoune: normal) + `a-d` (core: normal) + `a-d` (helix: select) edit.delete-insert: title: @@ -160,7 +167,8 @@ edit.indent: keys: qwerty: |- - `>` (kakoune: normal) + `>` (core: normal) + `>` (helix: select) doc: en: |+ @@ -206,18 +214,18 @@ edit.insert: | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | - | Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | - | Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | - | Paste before and select | `paste.before.select` | `s-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | - | Paste after and select | `paste.after.select` | `p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | + | Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | + | Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | + | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | + | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | - | Delete | `delete` | `a-d` (kakoune: normal) | `[".edit.insert", { register: "_", ... }]` | + | Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | - | Copy and delete | `yank-delete` | `d` (kakoune: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | - | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (kakoune: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | + | Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | + | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | edit.join: @@ -226,7 +234,8 @@ edit.join: keys: qwerty: |- - `a-j` (kakoune: normal) + `a-j` (core: normal) + `s-j` (helix: select) doc: en: |+ @@ -238,7 +247,8 @@ edit.join.select: keys: qwerty: |- - `s-a-j` (kakoune: normal) + `s-a-j` (core: normal) + `s-a-j` (helix: select) doc: en: |+ @@ -262,9 +272,9 @@ edit.newLine.above: #### Additional keybindings - | Title | Identifier | Keybinding | Commands | - | ------------------------------------------ | ---------------------- | ----------------------- | --------------------------------------------------------------------------------- | - | Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (kakoune: normal) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | + | Title | Identifier | Keybinding | Commands | + | ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | + | Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | edit.newLine.above.insert: title: @@ -275,7 +285,8 @@ edit.newLine.above.insert: keys: qwerty: |- - `s-o` (kakoune: normal) + `s-o` (core: normal) + `s-o` (helix: select) edit.newLine.below: title: @@ -295,9 +306,9 @@ edit.newLine.below: #### Additional keybindings - | Title | Identifier | Keybinding | Commands | - | ------------------------------------------ | ---------------------- | --------------------- | --------------------------------------------------------------------------------- | - | Insert new line below and switch to insert | `newLine.below.insert` | `o` (kakoune: normal) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | + | Title | Identifier | Keybinding | Commands | + | ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | + | Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | edit.newLine.below.insert: title: @@ -308,7 +319,8 @@ edit.newLine.below.insert: keys: qwerty: |- - `o` (kakoune: normal) + `o` (core: normal) + `o` (helix: select) edit.paste.after: title: @@ -318,7 +330,8 @@ edit.paste.after: [".edit.insert", { handleNewLine: true, where: "end" , $exclude: [] }] keys: - qwerty: "" + qwerty: |- + `p` (helix: select) edit.paste.after.select: title: @@ -329,7 +342,7 @@ edit.paste.after.select: keys: qwerty: |- - `p` (kakoune: normal) + `p` (core: normal) edit.paste.before: title: @@ -339,7 +352,8 @@ edit.paste.before: [".edit.insert", { handleNewLine: true, where: "start", $exclude: [] }] keys: - qwerty: "" + qwerty: |- + `s-p` (helix: select) edit.paste.before.select: title: @@ -350,7 +364,7 @@ edit.paste.before.select: keys: qwerty: |- - `s-p` (kakoune: normal) + `s-p` (core: normal) edit.pasteAll.after: title: @@ -400,7 +414,7 @@ edit.replaceCharacters: keys: qwerty: |- - `r` (kakoune: normal) + `r` (core: normal) doc: en: |+ @@ -427,7 +441,7 @@ edit.yank-delete: keys: qwerty: |- - `d` (kakoune: normal) + `d` (core: normal) `d` (helix: select) edit.yank-delete-insert: @@ -439,7 +453,7 @@ edit.yank-delete-insert: keys: qwerty: |- - `c` (kakoune: normal) + `c` (core: normal) `c` (helix: select) edit.yank-replace: @@ -496,7 +510,7 @@ history.redo: keys: qwerty: |- - `s-u` (kakoune: normal) + `s-u` (core: normal) `s-u` (helix: select) doc: @@ -524,10 +538,10 @@ history.repeat: Repeat last change. - | Title | Identifier | Keybinding | Commands | - | ---------------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------- | - | Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek|select|selections)", +count }]` | - | Repeat last seek | `repeat.seek` | `a-.` (kakoune: normal) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | + | Title | Identifier | Keybinding | Commands | + | ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | + | Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek|select|selections)", +count }]` | + | Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | history.repeat.edit: title: @@ -535,8 +549,8 @@ history.repeat.edit: keys: qwerty: |- - `.` (kakoune: normal) - `NumPad_Decimal` (kakoune: normal) + `.` (core: normal) + `NumPad_Decimal` (core: normal) doc: en: |+ @@ -551,7 +565,8 @@ history.repeat.seek: keys: qwerty: |- - `a-.` (kakoune: normal) + `a-.` (core: normal) + `a-.` (helix: select) history.repeat.selection: title: @@ -569,7 +584,7 @@ history.undo: keys: qwerty: |- - `u` (kakoune: normal) + `u` (core: normal) `u` (helix: select) doc: @@ -624,7 +639,8 @@ modes.insert.after: keys: qwerty: |- - `a` (kakoune: normal) + `a` (core: normal) + `a` (helix: select) modes.insert.before: title: @@ -635,7 +651,8 @@ modes.insert.before: keys: qwerty: |- - `i` (kakoune: normal) + `i` (core: normal) + `i` (helix: select) modes.insert.lineEnd: title: @@ -646,7 +663,8 @@ modes.insert.lineEnd: keys: qwerty: |- - `s-a` (kakoune: normal) + `s-a` (core: normal) + `s-a` (helix: select) modes.insert.lineStart: title: @@ -657,7 +675,8 @@ modes.insert.lineStart: keys: qwerty: |- - `s-i` (kakoune: normal) + `s-i` (core: normal) + `s-i` (helix: select) modes.set: title: @@ -669,20 +688,20 @@ modes.set: #### Variants - | Title | Identifier | Keybinding | Command | - | ------------------ | ------------ | ---------------------------------------------------- | ----------------------------------------------------------- | - | Set mode to Normal | `set.normal` | `escape` (kakoune: insert), `escape` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | - | Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | - | Set mode to Select | `set.select` | | `[".modes.set", { mode: "select" }]` | + | Title | Identifier | Keybinding | Command | + | ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | + | Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | + | Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | + | Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | Other variants are provided to switch to insert mode: - | Title | Identifier | Keybinding | Commands | - | -------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | Insert before | `insert.before` | `i` (kakoune: normal) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | - | Insert after | `insert.after` | `a` (kakoune: normal) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | - | Insert at line start | `insert.lineStart` | `s-i` (kakoune: normal) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | - | Insert at line end | `insert.lineEnd` | `s-a` (kakoune: normal) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | + | Title | Identifier | Keybinding | Commands | + | -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | + | Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | + | Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | + | Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | modes.set.insert: title: @@ -703,8 +722,9 @@ modes.set.normal: keys: qwerty: |- - `escape` (kakoune: insert) + `escape` (core: insert) `escape` (helix: select) + `v` (helix: select) modes.set.select: title: @@ -714,7 +734,8 @@ modes.set.select: [".modes.set", { mode: "select" }] keys: - qwerty: "" + qwerty: |- + `v` (helix: normal) modes.set.temporarily: title: @@ -879,19 +900,19 @@ search: keys: qwerty: |- - `/` (kakoune: normal) - `NumPad_Divide` (kakoune: normal) + `/` (core: normal) + `NumPad_Divide` (core: normal) doc: en: | Search. - | Title | Identifier | Keybinding | Command | - | ------------------------ | ----------------- | ----------------------- | ------------------------------------------------------ | - | Search (extend) | `extend` | `?` (kakoune: normal) | `[".search", { shift: "extend", ... }]` | - | Search backward | `backward` | `a-/` (kakoune: normal) | `[".search", { direction: -1 , ... }]` | - | Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal) | `[".search", { direction: -1, shift: "extend", ... }]` | + | Title | Identifier | Keybinding | Command | + | ------------------------ | ----------------- | -------------------------------------------- | ------------------------------------------------------ | + | Search (extend) | `extend` | `?` (kakoune: normal), `/` (helix: select) | `[".search", { shift: "extend", ... }]` | + | Search backward | `backward` | `a-/` (kakoune: normal), `?` (helix: normal) | `[".search", { direction: -1 , ... }]` | + | Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal), `?` (helix: select) | `[".search", { direction: -1, shift: "extend", ... }]` | search.backward: title: @@ -903,6 +924,7 @@ search.backward: keys: qwerty: |- `a-/` (kakoune: normal) + `?` (helix: normal) search.backward.extend: title: @@ -914,6 +936,7 @@ search.backward.extend: keys: qwerty: |- `a-?` (kakoune: normal) + `?` (helix: select) search.extend: title: @@ -925,6 +948,7 @@ search.extend: keys: qwerty: |- `?` (kakoune: normal) + `/` (helix: select) search.next: title: @@ -932,18 +956,18 @@ search.next: keys: qwerty: |- - `n` (kakoune: normal) + `n` (core: normal) doc: en: | Select next match. - | Title | Identifier | Keybinding | Command | - | --------------------- | -------------- | ------------------------- | ----------------------------------------------------- | - | Add next match | `next.add` | `s-n` (kakoune: normal) | `[".search.next", { add: true, ... }]` | - | Select previous match | `previous` | `a-n` (kakoune: normal) | `[".search.next", { direction: -1 , ... }]` | - | Add previous match | `previous.add` | `s-a-n` (kakoune: normal) | `[".search.next", { direction: -1, add: true, ... }]` | + | Title | Identifier | Keybinding | Command | + | --------------------- | -------------- | ------------------------------------------------ | ----------------------------------------------------- | + | Add next match | `next.add` | `s-n` (kakoune: normal), `n` (helix: select) | `[".search.next", { add: true, ... }]` | + | Select previous match | `previous` | `a-n` (kakoune: normal), `s-n` (helix: normal) | `[".search.next", { direction: -1 , ... }]` | + | Add previous match | `previous.add` | `s-a-n` (kakoune: normal), `s-n` (helix: select) | `[".search.next", { direction: -1, add: true, ... }]` | search.next.add: title: @@ -955,6 +979,7 @@ search.next.add: keys: qwerty: |- `s-n` (kakoune: normal) + `n` (helix: select) search.previous: title: @@ -966,6 +991,7 @@ search.previous: keys: qwerty: |- `a-n` (kakoune: normal) + `s-n` (helix: normal) search.previous.add: title: @@ -977,6 +1003,7 @@ search.previous.add: keys: qwerty: |- `s-a-n` (kakoune: normal) + `s-n` (helix: select) search.selection: title: @@ -984,17 +1011,17 @@ search.selection: keys: qwerty: |- - `a-*` (kakoune: normal) - `a-NumPad_Multiply` (kakoune: normal) + `a-*` (core: normal) + `a-NumPad_Multiply` (core: normal) doc: en: | Search current selection. - | Title | Identifier | Keybinding | Command | - | -------------------------------- | ----------------- | ---------------------------------------------------------- | --------------------------------------------------- | - | Search current selection (smart) | `selection.smart` | `*` (kakoune: normal), `NumPad_Multiply` (kakoune: normal) | `[".search.selection", { smart: true, +register }]` | + | Title | Identifier | Keybinding | Command | + | -------------------------------- | ----------------- | ---------------------------------------------------- | --------------------------------------------------- | + | Search current selection (smart) | `selection.smart` | `*` (core: normal), `NumPad_Multiply` (core: normal) | `[".search.selection", { smart: true, +register }]` | search.selection.smart: title: @@ -1005,8 +1032,8 @@ search.selection.smart: keys: qwerty: |- - `*` (kakoune: normal) - `NumPad_Multiply` (kakoune: normal) + `*` (core: normal) + `NumPad_Multiply` (core: normal) seek: title: @@ -1014,7 +1041,7 @@ seek: keys: qwerty: |- - `t` (kakoune: normal) + `t` (core: normal) doc: en: | @@ -1026,11 +1053,11 @@ seek: | Title | Identifier | Keybinding | Command | | ---------------------------------------- | -------------------------- | ------------------------------------------------ | ------------------------------------------------------------------- | | Extend to character (excluded) | `extend` | `s-t` (kakoune: normal), `t` (helix: select) | `[".seek", { shift: "extend" , ... }]` | - | Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal) | `[".seek", { direction: -1, ... }]` | + | Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal), `s-t` (helix: normal) | `[".seek", { direction: -1, ... }]` | | Extend to character (excluded, backward) | `extend.backward` | `s-a-t` (kakoune: normal), `s-t` (helix: select) | `[".seek", { shift: "extend", direction: -1, ... }]` | - | Select to character (included) | `included` | `f` (kakoune: normal) | `[".seek", { include: true , ... }]` | + | Select to character (included) | `included` | `f` (core: normal) | `[".seek", { include: true , ... }]` | | Extend to character (included) | `included.extend` | `s-f` (kakoune: normal), `f` (helix: select) | `[".seek", { include: true, shift: "extend" , ... }]` | - | Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal) | `[".seek", { include: true, direction: -1, ... }]` | + | Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal), `s-f` (helix: normal) | `[".seek", { include: true, direction: -1, ... }]` | | Extend to character (included, backward) | `included.extend.backward` | `s-a-f` (kakoune: normal), `s-f` (helix: select) | `[".seek", { include: true, shift: "extend", direction: -1, ... }]` | seek.askObject: @@ -1155,6 +1182,7 @@ seek.backward: keys: qwerty: |- `a-t` (kakoune: normal) + `s-t` (helix: normal) seek.enclosing: title: @@ -1243,7 +1271,7 @@ seek.included: keys: qwerty: |- - `f` (kakoune: normal) + `f` (core: normal) seek.included.backward: title: @@ -1255,6 +1283,7 @@ seek.included.backward: keys: qwerty: |- `a-f` (kakoune: normal) + `s-f` (helix: normal) seek.included.extend: title: @@ -1391,7 +1420,7 @@ seek.word: keys: qwerty: |- - `w` (kakoune: normal) + `w` (core: normal) doc: en: | @@ -1405,15 +1434,15 @@ seek.word: | Title | Identifier | Keybinding | Command | | -------------------------------------------- | ------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------- | | Extend to next word start | `word.extend` | `s-w` (kakoune: normal), `w` (helix: select) | `[".seek.word", { shift: "extend" , ... }]` | - | Select to previous word start | `word.backward` | `b` (kakoune: normal) | `[".seek.word", { direction: -1, ... }]` | + | Select to previous word start | `word.backward` | `b` (core: normal) | `[".seek.word", { direction: -1, ... }]` | | Extend to previous word start | `word.extend.backward` | `s-b` (kakoune: normal), `b` (helix: select) | `[".seek.word", { shift: "extend", direction: -1, ... }]` | - | Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal) | `[".seek.word", { ws: true , ... }]` | + | Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal), `s-w` (helix: normal) | `[".seek.word", { ws: true , ... }]` | | Extend to next non-whitespace word start | `word.ws.extend` | `s-a-w` (kakoune: normal), `s-w` (helix: select) | `[".seek.word", { ws: true, shift: "extend" , ... }]` | - | Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | + | Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal), `s-b` (helix: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | | Extend to previous non-whitespace word start | `word.ws.extend.backward` | `s-a-b` (kakoune: normal), `s-b` (helix: select) | `[".seek.word", { ws: true, shift: "extend", direction: -1, ... }]` | - | Select to next word end | `wordEnd` | `e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | + | Select to next word end | `wordEnd` | `e` (core: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | | Extend to next word end | `wordEnd.extend` | `s-e` (kakoune: normal), `e` (helix: select) | `[".seek.word", { stopAtEnd: true , shift: "extend" , ... }]` | - | Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | + | Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal), `s-e` (helix: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | | Extend to next non-whitespace word end | `wordEnd.ws.extend` | `s-a-e` (kakoune: normal), `s-e` (helix: select) | `[".seek.word", { stopAtEnd: true , ws: true, shift: "extend" , ... }]` | seek.word.backward: @@ -1425,7 +1454,7 @@ seek.word.backward: keys: qwerty: |- - `b` (kakoune: normal) + `b` (core: normal) seek.word.extend: title: @@ -1461,6 +1490,7 @@ seek.word.ws: keys: qwerty: |- `a-w` (kakoune: normal) + `s-w` (helix: normal) seek.word.ws.backward: title: @@ -1472,6 +1502,7 @@ seek.word.ws.backward: keys: qwerty: |- `a-b` (kakoune: normal) + `s-b` (helix: normal) seek.word.ws.extend: title: @@ -1506,7 +1537,7 @@ seek.wordEnd: keys: qwerty: |- - `e` (kakoune: normal) + `e` (core: normal) seek.wordEnd.extend: title: @@ -1530,6 +1561,7 @@ seek.wordEnd.ws: keys: qwerty: |- `a-e` (kakoune: normal) + `s-e` (helix: normal) seek.wordEnd.ws.extend: title: @@ -1598,7 +1630,7 @@ select.down.jump: keys: qwerty: |- - `j` (kakoune: normal) , `down` (kakoune: normal) + `j` (core: normal) , `down` (core: normal) select.firstLine.extend: title: @@ -1662,9 +1694,9 @@ select.horizontally: | Title | Identifier | Keybinding | Command | | ------------ | -------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | - | Jump right | `right.jump` | `l` (kakoune: normal) , `right` (kakoune: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | + | Jump right | `right.jump` | `l` (core: normal) , `right` (core: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | | Extend right | `right.extend` | `s-l` (kakoune: normal), `s-right` (kakoune: normal), `l` (helix: select), `right` (helix: select) | `[".select.horizontally", { direction: 1, shift: "extend", ... }]` | - | Jump left | `left.jump` | `h` (kakoune: normal) , `left` (kakoune: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | + | Jump left | `left.jump` | `h` (core: normal) , `left` (core: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | | Extend left | `left.extend` | `s-h` (kakoune: normal), `s-left` (kakoune: normal), `h` (helix: select), `left` (helix: select) | `[".select.horizontally", { direction: -1, shift: "extend", ... }]` | select.lastLine: @@ -1748,7 +1780,7 @@ select.left.jump: keys: qwerty: |- - `h` (kakoune: normal) , `left` (kakoune: normal) + `h` (core: normal) , `left` (core: normal) select.line.above: title: @@ -1782,6 +1814,11 @@ select.line.below.extend: en: | Extend to line below. + keys: + qwerty: |- + `x` (helix: normal) + `x` (helix: select) + select.lineEnd: title: en: Select to line end @@ -1789,7 +1826,7 @@ select.lineEnd: keys: qwerty: |- `a-l` (kakoune: normal) - `end` (kakoune: normal) + `end` (core: normal) doc: en: | @@ -1799,11 +1836,11 @@ select.lineEnd: #### Variants - | Title | Identifier | Keybinding | Command | - | ------------------------ | -------------------- | ---------------------------------------------------- | --------------------------------------------------------------- | - | Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal) | `[".select.lineEnd", { shift: "extend", ... }]` | - | Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | - | Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | + | Title | Identifier | Keybinding | Command | + | ------------------------ | -------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------- | + | Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal), `end` (helix: select) | `[".select.lineEnd", { shift: "extend", ... }]` | + | Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | + | Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | select.lineEnd.extend: title: @@ -1816,6 +1853,7 @@ select.lineEnd.extend: qwerty: |- `s-a-l` (kakoune: normal) `s-end` (kakoune: normal) + `end` (helix: select) select.lineStart: title: @@ -1824,7 +1862,7 @@ select.lineStart: keys: qwerty: |- `a-h` (kakoune: normal) - `home` (kakoune: normal) + `home` (core: normal) doc: en: | @@ -1833,14 +1871,14 @@ select.lineStart: #### Variants - | Title | Identifier | Keybinding | Command | - | -------------------- | ------------------ | ----------------------------------------------------- | ------------------------------------------------------------------ | - | Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | - | Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal) | `[".select.lineStart", { shift: "extend", ... }]` | - | Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | - | Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | - | Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | - | Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | + | Title | Identifier | Keybinding | Command | + | -------------------- | ------------------ | ----------------------------------------------------------------------------- | ------------------------------------------------------------------ | + | Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | + | Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal), `home` (helix: select) | `[".select.lineStart", { shift: "extend", ... }]` | + | Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | + | Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | + | Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | + | Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | select.lineStart.extend: title: @@ -1853,6 +1891,7 @@ select.lineStart.extend: qwerty: |- `s-a-h` (kakoune: normal) `s-home` (kakoune: normal) + `home` (helix: select) select.lineStart.jump: title: @@ -1936,7 +1975,7 @@ select.right.jump: keys: qwerty: |- - `l` (kakoune: normal) , `right` (kakoune: normal) + `l` (core: normal) , `right` (core: normal) select.to: title: @@ -1953,7 +1992,7 @@ select.to: | Title | Identifier | Keybinding | Command | | --------- | ----------- | -------------------------------------------- | ------------------------------------------ | - | Go to | `to.jump` | `g` (kakoune: normal) | `[".select.to", { shift: "jump" , ... }]` | + | Go to | `to.jump` | `g` (core: normal) | `[".select.to", { shift: "jump" , ... }]` | | Extend to | `to.extend` | `s-g` (kakoune: normal), `g` (helix: select) | `[".select.to", { shift: "extend", ... }]` | select.to.extend: @@ -1977,7 +2016,7 @@ select.to.jump: keys: qwerty: |- - `g` (kakoune: normal) + `g` (core: normal) select.up.extend: title: @@ -2001,7 +2040,7 @@ select.up.jump: keys: qwerty: |- - `k` (kakoune: normal) , `up` (kakoune: normal) + `k` (core: normal) , `up` (core: normal) select.vertically: title: @@ -2014,21 +2053,25 @@ select.vertically: #### Variants - | Title | Identifier | Keybinding | Command | + | Title | Identifier | Keybinding | Command | | ----------- | ------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | - | Jump down | `down.jump` | `j` (kakoune: normal) , `down` (kakoune: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | + | Jump down | `down.jump` | `j` (core: normal) , `down` (core: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | | Extend down | `down.extend` | `s-j` (kakoune: normal), `s-down` (kakoune: normal), `j` (helix: select), `down` (helix: select) | `[".select.vertically", { direction: 1, shift: "extend", ... }]` | - | Jump up | `up.jump` | `k` (kakoune: normal) , `up` (kakoune: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | + | Jump up | `up.jump` | `k` (core: normal) , `up` (core: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | | Extend up | `up.extend` | `s-k` (kakoune: normal), `s-up` (kakoune: normal) , `k` (helix: select), `up` (helix: select) | `[".select.vertically", { direction: -1, shift: "extend", ... }]` | The following keybindings are also defined: - | Keybinding | Command | - | ------------------------------------------------ | -------------------------------------------------------------------------- | - | `c-f` (kakoune: normal), `c-f` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | - | `c-d` (kakoune: normal), `c-d` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | - | `c-b` (kakoune: normal), `c-b` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | - | `c-u` (kakoune: normal), `c-u` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | + | Keybinding | Command | + | -------------------------------------------| ---------------------------------------------------------------------------- | + | `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | + | `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | + | `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | + | `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | + | `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | + | `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | + | `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | + | `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | selections.changeDirection: title: @@ -2036,7 +2079,8 @@ selections.changeDirection: keys: qwerty: |- - `a-;` (kakoune: normal) + `a-;` (core: normal) + `a-;` (helix: select) doc: en: | @@ -2076,7 +2120,8 @@ selections.clear.main: keys: qwerty: |- - `a-,` (kakoune: normal) + `a-,` (core: normal) + `a-,` (helix: select) selections.clear.secondary: title: @@ -2087,7 +2132,8 @@ selections.clear.secondary: keys: qwerty: |- - `,` (kakoune: normal) + `,` (core: normal) + `,` (helix: select) selections.copy: title: @@ -2126,6 +2172,8 @@ selections.expandToLines: keys: qwerty: |- `x` (kakoune: normal) + `s-x` (helix: normal) + `s-x` (helix: select) doc: en: |+ @@ -2160,21 +2208,21 @@ selections.filter: keys: qwerty: |- - `$` (kakoune: normal) + `$` (core: normal) + `$` (helix: select) doc: en: | Filter selections. - #### Variants - | Title | Identifier | Keybinding | Commands | - | -------------------------- | ----------------------- | --------------------------| ------------------------------------------------------------------------ | - | Keep matching selections | `filter.regexp` | `a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/" , ... }]` | - | Clear matching selections | `filter.regexp.inverse` | `s-a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | - | Clear secondary selections | `clear.secondary` | `,` (kakoune: normal) | `[".selections.filter", { expression: "i === count" , ... }]` | - | Clear main selections | `clear.main` | `a-,` (kakoune: normal) | `[".selections.filter", { expression: "i !== count" , ... }]` | + | Title | Identifier | Keybinding | Commands | + | -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | + | Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | + | Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | + | Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | + | Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | selections.filter.regexp: title: @@ -2185,18 +2233,20 @@ selections.filter.regexp: keys: qwerty: |- - `a-k` (kakoune: normal) + `a-k` (core: normal) + `a-k` (helix: select) selections.filter.regexp.inverse: title: en: Clear matching selections - commands: |- - [".selections.filter", { defaultExpression: "/", inverse: true, $exclude: [] }] - keys: qwerty: |- - `s-a-k` (kakoune: normal) + `s-a-k` (core: normal) + `s-a-k` (helix: select) + + commands: |- + [".selections.filter", { defaultExpression: "/", inverse: true, $exclude: [] }] selections.hideIndices: title: @@ -2245,7 +2295,8 @@ selections.pipe: keys: qwerty: |- - `a-|` (kakoune: normal) + `a-|` (core: normal) + `a-|` (helix: select) doc: en: | @@ -2254,16 +2305,15 @@ selections.pipe: Run the specified command or code with the contents of each selection, and save the result to a register. - See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes-through-external-programs #### Additional commands - | Title | Identifier | Keybinding | Commands | - | ------------------- | -------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------- | - | Pipe and replace | `pipe.replace` | `|` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", ... }]` | - | Pipe and append | `pipe.append` | `!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "end" , shift: "select", ... }]` | - | Pipe and prepend | `pipe.prepend` | `a-!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "start", shift: "select", ... }]` | + | Title | Identifier | Keybinding | Commands | + | ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | + | Pipe and replace | `pipe.replace` | `|` (core: normal), `|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", ... }]` | + | Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "end" , shift: "select", ... }]` | + | Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "start", shift: "select", ... }]` | selections.pipe.append: title: @@ -2274,7 +2324,8 @@ selections.pipe.append: keys: qwerty: |- - `!` (kakoune: normal) + `!` (core: normal) + `!` (helix: select) selections.pipe.prepend: title: @@ -2285,7 +2336,8 @@ selections.pipe.prepend: keys: qwerty: |- - `a-!` (kakoune: normal) + `a-!` (core: normal) + `a-!` (helix: select) selections.pipe.replace: title: @@ -2296,7 +2348,8 @@ selections.pipe.replace: keys: qwerty: |- - `|` (kakoune: normal) + `|` (core: normal) + `|` (helix: select) selections.reduce: title: @@ -2304,7 +2357,8 @@ selections.reduce: keys: qwerty: |- - `;` (kakoune: normal) + `;` (core: normal) + `;` (helix: select) doc: en: | @@ -2400,16 +2454,27 @@ selections.rotate.contents: en: | Rotate selections clockwise (contents only). + The following command is also available: - | Title | Identifier | Command | - | --------------------------------------------------- | ------------------ | ---------------------------------------------------- | - | Rotate selections counter-clockwise (contents only) | `contents.reverse` | `[".selections.rotate.contents", { reverse: true }]` | + | Title | Identifier | Keybinding | Command | + | --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | + | Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | + + keys: + qwerty: |- + `a-)` (helix: normal) + `a-)` (helix: select) selections.rotate.contents.reverse: title: en: Rotate selections counter-clockwise (contents only) + keys: + qwerty: |- + `a-(` (helix: normal) + `a-(` (helix: select) + commands: |- [".selections.rotate.contents", { reverse: true }] @@ -2419,7 +2484,7 @@ selections.rotate.selections: keys: qwerty: |- - `)` (kakoune: normal) + `)` (core: normal) doc: en: | @@ -2428,9 +2493,9 @@ selections.rotate.selections: The following keybinding is also available: - | Title | Identifier | Keybinding | Command | - | ----------------------------------------------------- | -------------------- | --------------------- | ------------------------------------------------------ | - | Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (kakoune: normal) | `[".selections.rotate.selections", { reverse: true }]` | + | Title | Identifier | Keybinding | Command | + | ----------------------------------------------------- | -------------------- | --------------------------------------- | ------------------------------------------------------ | + | Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal), `(` (helix: select) | `[".selections.rotate.selections", { reverse: true }]` | selections.rotate.selections.reverse: title: @@ -2441,7 +2506,8 @@ selections.rotate.selections.reverse: keys: qwerty: |- - `(` (kakoune: normal) + `(` (core: normal) + `(` (helix: select) selections.save: title: @@ -2461,7 +2527,8 @@ selections.saveText: keys: qwerty: |- - `y` (kakoune: normal) + `y` (core: normal) + `y` (helix: select) doc: en: |+ @@ -2477,9 +2544,9 @@ selections.select: #### Variants - | Title | Identifier | Keybinding | Command | - | -------------- | --------------- | --------------------- | ------------------------------------------------------------------------------------------------- | - | Leap or select | `select.orLeap` | `s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | + | Title | Identifier | Keybinding | Command | + | -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | + | Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | selections.select.orLeap: title: @@ -2490,7 +2557,8 @@ selections.select.orLeap: keys: qwerty: |- - `s` (kakoune: normal) + `s` (core: normal) + `s` (helix: select) selections.showIndices: title: @@ -2514,7 +2582,8 @@ selections.split: keys: qwerty: |- - `s-s` (kakoune: normal) + `s-s` (core: normal) + `s-s` (helix: select) doc: en: |+ @@ -2530,9 +2599,9 @@ selections.splitLines: #### Variants - | Title | Identifier | Keybinding | Command | - | ----------------------- | ---------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------- | - | Leap or select backward | `splitLines.orLeap.backward` | `a-s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | + | Title | Identifier | Keybinding | Command | + | ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | + | Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | selections.splitLines.orLeap.backward: title: @@ -2543,7 +2612,8 @@ selections.splitLines.orLeap.backward: keys: qwerty: |- - `a-s` (kakoune: normal) + `a-s` (core: normal) + `a-s` (helix: select) selections.toggleIndices: title: @@ -2571,7 +2641,8 @@ selections.trimLines: keys: qwerty: |- - `a-x` (kakoune: normal) + `a-x` (core: normal) + `a-x` (helix: select) doc: en: |+ @@ -2585,7 +2656,8 @@ selections.trimWhitespace: keys: qwerty: |- - `_` (kakoune: normal) + `_` (core: normal) + `_` (helix: select) doc: en: |+ @@ -2599,7 +2671,7 @@ selectRegister: keys: qwerty: |- - `"` (kakoune: normal) + `"` (core: normal) doc: en: |+ @@ -2676,6 +2748,8 @@ anonymous: keys: qwerty: |- `v` (kakoune: normal) + `z` (helix: normal) + `z` (helix: select) - title: en: Show view menu (locked) @@ -2686,38 +2760,68 @@ anonymous: keys: qwerty: |- `s-v` (kakoune: normal) + `s-z` (helix: normal) + `s-z` (helix: select) + + - commands: |- + [".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }] + + keys: + qwerty: |- + `c-u` (helix: select) - commands: |- [".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }] keys: qwerty: |- - `c-u` (kakoune: normal) - `c-u` (kakoune: insert) + `c-u` (core: normal) + `c-u` (core: insert) + + - commands: |- + [".select.vertically", { direction: -1, by: "page" , shift: "extend" }] + + keys: + qwerty: |- + `c-b` (helix: select) - commands: |- [".select.vertically", { direction: -1, by: "page" , shift: "jump" }] keys: qwerty: |- - `c-b` (kakoune: normal) - `c-b` (kakoune: insert) + `c-b` (core: normal) + `c-b` (core: insert) + + - commands: |- + [".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }] + + keys: + qwerty: |- + `c-d` (helix: select) - commands: |- [".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }] keys: qwerty: |- - `c-d` (kakoune: normal) - `c-d` (kakoune: insert) + `c-d` (core: normal) + `c-d` (core: insert) + + - commands: |- + [".select.vertically", { direction: 1, by: "page" , shift: "extend" }] + + keys: + qwerty: |- + `c-f` (helix: select) - commands: |- [".select.vertically", { direction: 1, by: "page" , shift: "jump" }] keys: qwerty: |- - `c-f` (kakoune: normal) - `c-f` (kakoune: insert) + `c-f` (core: normal) + `c-f` (core: insert) - commands: |- [".selections.restore.withCurrent", { reverse: true, $exclude: [] }] diff --git a/src/commands/README.md b/src/commands/README.md index 823a062c..ab733b6a 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -27,47 +27,47 @@ depending on the keyboard layout. The following layouts _will be_\* supported: devdev.copyLastErrorMessageCopies the last encountered error message dev.setSelectionBehaviorSet the selection behavior of the specified mode editedit.alignAlign selectionsShift+7 (editorTextFocus && dance.mode == 'normal') -edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal') -edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal') -edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal') -edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.mode == 'normal') -edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.mode == 'normal') -edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal') -edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal') -edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.mode == 'normal') -edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal') -edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal') -edit.paste.afterPaste after +edit.case.swapSwap caseAlt+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.paste.afterPaste afterP (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') edit.paste.after.selectPaste after and selectP (editorTextFocus && dance.mode == 'normal') -edit.paste.beforePaste before +edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') edit.paste.before.selectPaste before and selectShift+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.afterPaste all after -edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.mode == 'normal') +edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') edit.pasteAll.beforePaste all before -edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.mode == 'normal') -edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.mode == 'insert') -edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.mode == 'select') -edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.mode == 'select') -edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') -edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal') -edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal') -edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal') -edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal') -edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') -edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.mode == 'normal') +edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') edit.replaceCharactersReplace charactersR (editorTextFocus && dance.mode == 'normal') -historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal') +historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal')Alt+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') history.repeat.selectionRepeat last selection change -history.recording.playReplay recordingQ (editorTextFocus && dance.mode == 'normal') -history.recording.startStart recordingShift+Q (editorTextFocus && dance.mode == 'normal' && !dance.isRecording) -history.recording.stopStop recordingEscape (editorTextFocus && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.mode == 'normal' && dance.isRecording) -history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.mode == 'select') -history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.mode == 'normal') +history.recording.playReplay recordingQ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +history.recording.startStart recordingShift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && !dance.isRecording) +history.recording.stopStop recordingEscape (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording) +history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') history.repeatRepeat last change history.repeat.editRepeat last edit without a command. (editorTextFocus && dance.mode == 'normal')NumPad_Decimal (editorTextFocus && dance.mode == 'normal') -history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.mode == 'select') -history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.mode == 'normal') +history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') keybindingskeybindings.setupSet up Dance keybindings misccancelCancel Dance operationEscape (editorTextFocus && dance.mode == 'normal' && !dance.isRecording && !markersNavigationVisible)Escape (editorTextFocus && dance.mode == 'input') changeInputChange current input @@ -79,70 +79,70 @@ selections are empty selectRegisterSelect register for next commandShift+' (editorTextFocus && dance.mode == 'normal') updateCountUpdate Dance count updateRegisterUpdate the contents of a register -modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal') -modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal') -modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal') -modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal') +modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal')A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal')I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal')Shift+A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal')Shift+I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') modes.set.insertSet mode to Insert -modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.mode == 'select') -modes.set.selectSet mode to Select -modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.mode == 'normal') -modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.mode == 'insert') +modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')V (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.set.selectSet mode to SelectV (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') modes.setSet Dance mode modes.set.temporarilySet Dance mode temporarily searchsearch.nextSelect next matchN (editorTextFocus && dance.mode == 'normal') search.searchSearch/ (editorTextFocus && dance.mode == 'normal')NumPad_Divide (editorTextFocus && dance.mode == 'normal') -search.backwardSearch backwardAlt+/ (editorTextFocus && dance.mode == 'normal') -search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.mode == 'normal') -search.extendSearch (extend)Shift+/ (editorTextFocus && dance.mode == 'normal') -search.next.addAdd next matchShift+N (editorTextFocus && dance.mode == 'normal') -search.previousSelect previous matchAlt+N (editorTextFocus && dance.mode == 'normal') -search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.mode == 'normal') +search.backwardSearch backwardAlt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.extendSearch (extend)Shift+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.next.addAdd next matchShift+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.previousSelect previous matchAlt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') search.selection.smartSearch current selection (smart)Shift+8 (editorTextFocus && dance.mode == 'normal')NumPad_Multiply (editorTextFocus && dance.mode == 'normal') search.selectionSearch current selectionShift+Alt+8 (editorTextFocus && dance.mode == 'normal')Alt+NumPad_Multiply (editorTextFocus && dance.mode == 'normal') -seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.mode == 'normal') +seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') seek.leapLeap forward seek.objectSelect object seek.seekSelect to character (excluded)T (editorTextFocus && dance.mode == 'normal') -seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.mode == 'normal')Alt+A (editorTextFocus && dance.mode == 'insert') -seek.askObject.endSelect to whole object end] (editorTextFocus && dance.mode == 'normal') -seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.mode == 'normal') -seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.mode == 'normal')Alt+I (editorTextFocus && dance.mode == 'insert') -seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.mode == 'normal') -seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.mode == 'normal') -seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.mode == 'normal') -seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.mode == 'normal') -seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.mode == 'normal') -seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.mode == 'normal') -seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.mode == 'normal') -seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.mode == 'normal') -seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.mode == 'normal') -seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.mode == 'normal') -seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.mode == 'normal')T (editorTextFocus && dance.mode == 'select') -seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.mode == 'normal')Shift+T (editorTextFocus && dance.mode == 'select') +seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +seek.askObject.endSelect to whole object end] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.includedSelect to character (included)F (editorTextFocus && dance.mode == 'normal') -seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.mode == 'normal') -seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.mode == 'normal')F (editorTextFocus && dance.mode == 'select') -seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.mode == 'normal')Shift+F (editorTextFocus && dance.mode == 'select') +seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.leap.backwardLeap backward seek.syntax.child.experimentalSelect child syntax object seek.syntax.next.experimentalSelect next syntax object seek.syntax.parent.experimentalSelect parent syntax object seek.syntax.previous.experimentalSelect previous syntax object seek.word.backwardSelect to previous word startB (editorTextFocus && dance.mode == 'normal') -seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.mode == 'normal')W (editorTextFocus && dance.mode == 'select') -seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.mode == 'normal')B (editorTextFocus && dance.mode == 'select') -seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.mode == 'normal') -seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.mode == 'normal') -seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.mode == 'normal')Shift+W (editorTextFocus && dance.mode == 'select') -seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.mode == 'normal')Shift+B (editorTextFocus && dance.mode == 'select') +seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.wordEndSelect to next word endE (editorTextFocus && dance.mode == 'normal') -seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.mode == 'normal')E (editorTextFocus && dance.mode == 'select') -seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.mode == 'normal') -seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'select') +seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.syntax.experimentalSelect syntax object seek.wordSelect to next word startW (editorTextFocus && dance.mode == 'normal') -selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal') +selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') select.firstVisibleLineSelect to first visible line select.horizontallySelect horizontally select.lastLineSelect to last line @@ -150,82 +150,82 @@ selections are empty select.line.aboveSelect line above select.line.above.extendExtend to line above select.line.belowSelect line below -select.line.below.extendExtend to line below -select.lineEndSelect to line endAlt+L (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') -select.lineStartSelect to line startAlt+H (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') +select.line.below.extendExtend to line belowX (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineEndSelect to line endAlt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') +select.lineStartSelect to line startAlt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') select.middleVisibleLineSelect to middle visible line -select.documentEnd.extendExtend to last character -select.documentEnd.jumpJump to last character -select.down.extendExtend downShift+J (editorTextFocus && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.mode == 'normal')J (editorTextFocus && dance.mode == 'select')Down (editorTextFocus && dance.mode == 'select') +select.documentEnd.extendExtend to last character +select.documentEnd.jumpJump to last character +select.down.extendExtend downShift+J (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Down (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') select.down.jumpJump downJ (editorTextFocus && dance.mode == 'normal')Down (editorTextFocus && dance.mode == 'normal') -select.firstLine.extendExtend to first line -select.firstLine.jumpJump to first line -select.firstVisibleLine.extendExtend to first visible line -select.firstVisibleLine.jumpJump to first visible line -select.lastLine.extendExtend to last line -select.lastLine.jumpJump to last line -select.lastVisibleLine.extendExtend to last visible line -select.lastVisibleLine.jumpJump to last visible line -select.left.extendExtend leftShift+H (editorTextFocus && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.mode == 'normal')H (editorTextFocus && dance.mode == 'select')Left (editorTextFocus && dance.mode == 'select') -select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') -select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal') -select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal') -select.lineStart.jumpJump to line start -select.lineStart.skipBlank.extendExtend to line start (skip blank) -select.lineStart.skipBlank.jumpJump to line start (skip blank) -select.middleVisibleLine.extendExtend to middle visible line -select.middleVisibleLine.jumpJump to middle visible line -select.right.extendExtend rightShift+L (editorTextFocus && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.mode == 'normal')L (editorTextFocus && dance.mode == 'select')Right (editorTextFocus && dance.mode == 'select') -select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') -select.to.extendExtend toShift+G (editorTextFocus && dance.mode == 'normal')G (editorTextFocus && dance.mode == 'select') -select.to.jumpGo toG (editorTextFocus && dance.mode == 'normal') -select.up.extendExtend upShift+K (editorTextFocus && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.mode == 'normal')K (editorTextFocus && dance.mode == 'select')Up (editorTextFocus && dance.mode == 'select') +select.firstLine.extendExtend to first line +select.firstLine.jumpJump to first line +select.firstVisibleLine.extendExtend to first visible line +select.firstVisibleLine.jumpJump to first visible line +select.lastLine.extendExtend to last line +select.lastLine.jumpJump to last line +select.lastVisibleLine.extendExtend to last visible line +select.lastVisibleLine.jumpJump to last visible line +select.left.extendExtend leftShift+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')H (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Left (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') +select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+End (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineStart.jumpJump to line start +select.lineStart.skipBlank.extendExtend to line start (skip blank) +select.lineStart.skipBlank.jumpJump to line start (skip blank) +select.middleVisibleLine.extendExtend to middle visible line +select.middleVisibleLine.jumpJump to middle visible line +select.right.extendExtend rightShift+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')L (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Right (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') +select.to.extendExtend toShift+G (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')G (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.to.jumpGo toG (editorTextFocus && dance.mode == 'normal') +select.up.extendExtend upShift+K (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Up (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') select.up.jumpJump upK (editorTextFocus && dance.mode == 'normal')Up (editorTextFocus && dance.mode == 'normal') select.toSelect to select.verticallySelect vertically -selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal') +selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.changeOrderReverse selections -selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal') -selections.expandToLinesExpand to linesX (editorTextFocus && dance.mode == 'normal') -selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal') -selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.mode == 'normal') +selections.copyCopy selections belowShift+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.expandToLinesExpand to linesX (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') selections.openOpen selected file -selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal') -selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal') -selections.restoreRestore selectionsZ (editorTextFocus && dance.mode == 'normal') -selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.mode == 'normal') -selections.saveSave selectionsShift+Z (editorTextFocus && dance.mode == 'normal') -selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal') +selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal')Shift+Alt+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal'); (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.restoreRestore selectionsZ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.saveSave selectionsShift+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.selectSelect within selections -selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal') -selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal') -selections.faceBackwardBackward selections -selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') -selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal') -selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal') -selections.hideIndicesHide selection indices -selections.orderAscendingOrder selections ascending -selections.orderDescendingOrder selections descending -selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal') -selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal') -selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal') -selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') -selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal') -selections.showIndicesShow selection indices -selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal') +selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.faceBackwardBackward selections +selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.hideIndicesHide selection indices +selections.orderAscendingOrder selections ascending +selections.orderDescendingOrder selections descending +selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.showIndicesShow selection indices +selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.sortSort selections -selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal') +selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries -selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal') -selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal') -selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal') -selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') -selections.rotate.contentsRotate selections clockwise (contents only) +selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.behavior == 'dance' && dance.mode == 'normal') +selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal') -selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.mode == 'normal') -selections.rotate.contents.reverseRotate selections counter-clockwise (contents only) -selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal') +selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') viewview.lineReveals a position based on the main cursor @@ -283,18 +283,18 @@ Specify `all` to paste all contents next to each selection. | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | -| Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | -| Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | -| Paste before and select | `paste.before.select` | `s-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | -| Paste after and select | `paste.after.select` | `p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | +| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | +| Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | +| Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | +| Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | -| Delete | `delete` | `a-d` (kakoune: normal) | `[".edit.insert", { register: "_", ... }]` | +| Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | -| Copy and delete | `yank-delete` | `d` (kakoune: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | -| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (kakoune: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | +| Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | +| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | This command: @@ -319,7 +319,8 @@ Join lines. This command: - takes an argument `separator` of type `string`. -Default keybinding: `a-j` (kakoune: normal) +Default keybinding: `a-j` (core: normal) +`s-j` (helix: select) @@ -331,7 +332,8 @@ Join lines and select inserted separators. This command: - takes an argument `separator` of type `string`. -Default keybinding: `s-a-j` (kakoune: normal) +Default keybinding: `s-a-j` (core: normal) +`s-a-j` (helix: select) @@ -343,7 +345,8 @@ Indent selected lines. This command: - may be repeated with a given number of repetitions. -Default keybinding: `>` (kakoune: normal) +Default keybinding: `>` (core: normal) +`>` (helix: select) @@ -379,7 +382,8 @@ Deindent selected lines (including incomplete indent). This command: - may be repeated with a given number of repetitions. -Default keybinding: `<` (kakoune: normal) +Default keybinding: `<` (core: normal) +`<` (helix: select) @@ -389,7 +393,8 @@ Transform to lower case. -Default keybinding: `` ` `` (kakoune: normal) +Default keybinding: `` ` `` (core: normal) +`` ` `` (helix: select) @@ -400,6 +405,8 @@ Transform to upper case. Default keybinding: `` s-` `` (kakoune: normal) +`` a-` `` (helix: normal) +`` a-` `` (helix: select) @@ -410,6 +417,8 @@ Swap case. Default keybinding: `` a-` `` (kakoune: normal) +`` s-` `` (helix: normal) +`` s-` `` (helix: select) @@ -422,7 +431,7 @@ This command: - may be repeated with a given number of repetitions. - takes an input `input` of type `string`. -Default keybinding: `r` (kakoune: normal) +Default keybinding: `r` (core: normal) @@ -437,7 +446,7 @@ before the first character of each selection. This command: - takes an argument `fill` of type `string`. -Default keybinding: `&` (kakoune: normal) +Default keybinding: `&` (core: normal) @@ -466,9 +475,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | ----------------------- | --------------------------------------------------------------------------------- | -| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (kakoune: normal) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | +| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -488,9 +497,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | --------------------- | --------------------------------------------------------------------------------- | -| Insert new line below and switch to insert | `newLine.below.insert` | `o` (kakoune: normal) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | +| Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -512,7 +521,7 @@ Undo. This command: - does not require an active text editor. -Default keybinding: `u` (kakoune: normal) +Default keybinding: `u` (core: normal) `u` (helix: select) @@ -525,7 +534,7 @@ Redo. This command: - does not require an active text editor. -Default keybinding: `s-u` (kakoune: normal) +Default keybinding: `s-u` (core: normal) `s-u` (helix: select) @@ -559,10 +568,10 @@ Default keybinding: `s-a-u` (kakoune: normal) Repeat last change. -| Title | Identifier | Keybinding | Commands | -| ---------------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------- | -| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | -| Repeat last seek | `repeat.seek` | `a-.` (kakoune: normal) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | +| Title | Identifier | Keybinding | Commands | +| ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | +| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | +| Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | This command: - may be repeated with a given number of repetitions. @@ -578,8 +587,8 @@ Repeat last edit without a command. This command: - may be repeated with a given number of repetitions. -Default keybinding: `.` (kakoune: normal) -`NumPad_Decimal` (kakoune: normal) +Default keybinding: `.` (core: normal) +`NumPad_Decimal` (core: normal) @@ -791,7 +800,7 @@ current document. This command: - takes an input `register` of type `string | Register`. -Default keybinding: `"` (kakoune: normal) +Default keybinding: `"` (core: normal) @@ -898,20 +907,20 @@ Set Dance mode. #### Variants -| Title | Identifier | Keybinding | Command | -| ------------------ | ------------ | ---------------------------------------------------- | ----------------------------------------------------------- | -| Set mode to Normal | `set.normal` | `escape` (kakoune: insert), `escape` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | -| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | -| Set mode to Select | `set.select` | | `[".modes.set", { mode: "select" }]` | +| Title | Identifier | Keybinding | Command | +| ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | +| Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | +| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | +| Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | Other variants are provided to switch to insert mode: -| Title | Identifier | Keybinding | Commands | -| -------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Insert before | `insert.before` | `i` (kakoune: normal) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert after | `insert.after` | `a` (kakoune: normal) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | -| Insert at line start | `insert.lineStart` | `s-i` (kakoune: normal) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert at line end | `insert.lineEnd` | `s-a` (kakoune: normal) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | This command: @@ -946,11 +955,11 @@ Search for patterns and replace or add selections. Search. -| Title | Identifier | Keybinding | Command | -| ------------------------ | ----------------- | ----------------------- | ------------------------------------------------------ | -| Search (extend) | `extend` | `?` (kakoune: normal) | `[".search", { shift: "extend", ... }]` | -| Search backward | `backward` | `a-/` (kakoune: normal) | `[".search", { direction: -1 , ... }]` | -| Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal) | `[".search", { direction: -1, shift: "extend", ... }]` | +| Title | Identifier | Keybinding | Command | +| ------------------------ | ----------------- | -------------------------------------------- | ------------------------------------------------------ | +| Search (extend) | `extend` | `?` (kakoune: normal), `/` (helix: select) | `[".search", { shift: "extend", ... }]` | +| Search backward | `backward` | `a-/` (kakoune: normal), `?` (helix: normal) | `[".search", { direction: -1 , ... }]` | +| Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal), `?` (helix: select) | `[".search", { direction: -1, shift: "extend", ... }]` | This command: - accepts a register (by default, it uses `slash`). @@ -959,8 +968,8 @@ This command: - takes an argument `add` of type `boolean`. - takes an argument `interactive` of type `boolean`. -Default keybinding: `/` (kakoune: normal) -`NumPad_Divide` (kakoune: normal) +Default keybinding: `/` (core: normal) +`NumPad_Divide` (core: normal) @@ -969,16 +978,16 @@ Default keybinding: `/` (kakoune: normal) Search current selection. -| Title | Identifier | Keybinding | Command | -| -------------------------------- | ----------------- | ---------------------------------------------------------- | --------------------------------------------------- | -| Search current selection (smart) | `selection.smart` | `*` (kakoune: normal), `NumPad_Multiply` (kakoune: normal) | `[".search.selection", { smart: true, +register }]` | +| Title | Identifier | Keybinding | Command | +| -------------------------------- | ----------------- | ---------------------------------------------------- | --------------------------------------------------- | +| Search current selection (smart) | `selection.smart` | `*` (core: normal), `NumPad_Multiply` (core: normal) | `[".search.selection", { smart: true, +register }]` | This command: - accepts a register (by default, it uses `slash`). - takes an argument `smart` of type `boolean`. -Default keybinding: `a-*` (kakoune: normal) -`a-NumPad_Multiply` (kakoune: normal) +Default keybinding: `a-*` (core: normal) +`a-NumPad_Multiply` (core: normal) @@ -987,18 +996,18 @@ Default keybinding: `a-*` (kakoune: normal) Select next match. -| Title | Identifier | Keybinding | Command | -| --------------------- | -------------- | ------------------------- | ----------------------------------------------------- | -| Add next match | `next.add` | `s-n` (kakoune: normal) | `[".search.next", { add: true, ... }]` | -| Select previous match | `previous` | `a-n` (kakoune: normal) | `[".search.next", { direction: -1 , ... }]` | -| Add previous match | `previous.add` | `s-a-n` (kakoune: normal) | `[".search.next", { direction: -1, add: true, ... }]` | +| Title | Identifier | Keybinding | Command | +| --------------------- | -------------- | ------------------------------------------------ | ----------------------------------------------------- | +| Add next match | `next.add` | `s-n` (kakoune: normal), `n` (helix: select) | `[".search.next", { add: true, ... }]` | +| Select previous match | `previous` | `a-n` (kakoune: normal), `s-n` (helix: normal) | `[".search.next", { direction: -1 , ... }]` | +| Add previous match | `previous.add` | `s-a-n` (kakoune: normal), `s-n` (helix: select) | `[".search.next", { direction: -1, add: true, ... }]` | This command: - accepts a register (by default, it uses `slash`). - may be repeated with a given number of repetitions. - takes an argument `add` of type `boolean`. -Default keybinding: `n` (kakoune: normal) +Default keybinding: `n` (core: normal) ## [`seek`](./seek.ts) @@ -1016,11 +1025,11 @@ Select to character (excluded). | Title | Identifier | Keybinding | Command | | ---------------------------------------- | -------------------------- | ------------------------------------------------ | ------------------------------------------------------------------- | | Extend to character (excluded) | `extend` | `s-t` (kakoune: normal), `t` (helix: select) | `[".seek", { shift: "extend" , ... }]` | -| Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal) | `[".seek", { direction: -1, ... }]` | +| Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal), `s-t` (helix: normal) | `[".seek", { direction: -1, ... }]` | | Extend to character (excluded, backward) | `extend.backward` | `s-a-t` (kakoune: normal), `s-t` (helix: select) | `[".seek", { shift: "extend", direction: -1, ... }]` | -| Select to character (included) | `included` | `f` (kakoune: normal) | `[".seek", { include: true , ... }]` | +| Select to character (included) | `included` | `f` (core: normal) | `[".seek", { include: true , ... }]` | | Extend to character (included) | `included.extend` | `s-f` (kakoune: normal), `f` (helix: select) | `[".seek", { include: true, shift: "extend" , ... }]` | -| Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal) | `[".seek", { include: true, direction: -1, ... }]` | +| Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal), `s-f` (helix: normal) | `[".seek", { include: true, direction: -1, ... }]` | | Extend to character (included, backward) | `included.extend.backward` | `s-a-f` (kakoune: normal), `s-f` (helix: select) | `[".seek", { include: true, shift: "extend", direction: -1, ... }]` | This command: @@ -1028,7 +1037,7 @@ This command: - takes an argument `include` of type `boolean`. - takes an input `input` of type `string`. -Default keybinding: `t` (kakoune: normal) +Default keybinding: `t` (core: normal) @@ -1065,15 +1074,15 @@ Select the word and following whitespaces on the right of the end of each select | Title | Identifier | Keybinding | Command | | -------------------------------------------- | ------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------- | | Extend to next word start | `word.extend` | `s-w` (kakoune: normal), `w` (helix: select) | `[".seek.word", { shift: "extend" , ... }]` | -| Select to previous word start | `word.backward` | `b` (kakoune: normal) | `[".seek.word", { direction: -1, ... }]` | +| Select to previous word start | `word.backward` | `b` (core: normal) | `[".seek.word", { direction: -1, ... }]` | | Extend to previous word start | `word.extend.backward` | `s-b` (kakoune: normal), `b` (helix: select) | `[".seek.word", { shift: "extend", direction: -1, ... }]` | -| Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal) | `[".seek.word", { ws: true , ... }]` | +| Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal), `s-w` (helix: normal) | `[".seek.word", { ws: true , ... }]` | | Extend to next non-whitespace word start | `word.ws.extend` | `s-a-w` (kakoune: normal), `s-w` (helix: select) | `[".seek.word", { ws: true, shift: "extend" , ... }]` | -| Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | +| Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal), `s-b` (helix: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | | Extend to previous non-whitespace word start | `word.ws.extend.backward` | `s-a-b` (kakoune: normal), `s-b` (helix: select) | `[".seek.word", { ws: true, shift: "extend", direction: -1, ... }]` | -| Select to next word end | `wordEnd` | `e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | +| Select to next word end | `wordEnd` | `e` (core: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | | Extend to next word end | `wordEnd.extend` | `s-e` (kakoune: normal), `e` (helix: select) | `[".seek.word", { stopAtEnd: true , shift: "extend" , ... }]` | -| Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | +| Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal), `s-e` (helix: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | | Extend to next non-whitespace word end | `wordEnd.ws.extend` | `s-a-e` (kakoune: normal), `s-e` (helix: select) | `[".seek.word", { stopAtEnd: true , ws: true, shift: "extend" , ... }]` | This command: @@ -1081,7 +1090,7 @@ This command: - takes an argument `stopAtEnd` of type `boolean`. - takes an argument `ws` of type `boolean`. -Default keybinding: `w` (kakoune: normal) +Default keybinding: `w` (core: normal) @@ -1174,28 +1183,32 @@ Default keybinding: `%` (kakoune: normal) -### [`select.vertically`](./select.ts#L31-L64) +### [`select.vertically`](./select.ts#L31-L68) Select vertically. #### Variants -| Title | Identifier | Keybinding | Command | +| Title | Identifier | Keybinding | Command | | ----------- | ------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | -| Jump down | `down.jump` | `j` (kakoune: normal) , `down` (kakoune: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | +| Jump down | `down.jump` | `j` (core: normal) , `down` (core: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | | Extend down | `down.extend` | `s-j` (kakoune: normal), `s-down` (kakoune: normal), `j` (helix: select), `down` (helix: select) | `[".select.vertically", { direction: 1, shift: "extend", ... }]` | -| Jump up | `up.jump` | `k` (kakoune: normal) , `up` (kakoune: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | +| Jump up | `up.jump` | `k` (core: normal) , `up` (core: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | | Extend up | `up.extend` | `s-k` (kakoune: normal), `s-up` (kakoune: normal) , `k` (helix: select), `up` (helix: select) | `[".select.vertically", { direction: -1, shift: "extend", ... }]` | The following keybindings are also defined: -| Keybinding | Command | -| ------------------------------------------------ | -------------------------------------------------------------------------- | -| `c-f` (kakoune: normal), `c-f` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | -| `c-d` (kakoune: normal), `c-d` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | -| `c-b` (kakoune: normal), `c-b` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | -| `c-u` (kakoune: normal), `c-u` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | +| Keybinding | Command | +| -------------------------------------------| ---------------------------------------------------------------------------- | +| `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | +| `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | +| `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | +| `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | +| `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | +| `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | +| `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | +| `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | This command: - may be repeated with a given number of repetitions. @@ -1204,7 +1217,7 @@ This command: -### [`select.horizontally`](./select.ts#L217-L239) +### [`select.horizontally`](./select.ts#L221-L243) Select horizontally. @@ -1213,9 +1226,9 @@ Select horizontally. | Title | Identifier | Keybinding | Command | | ------------ | -------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | -| Jump right | `right.jump` | `l` (kakoune: normal) , `right` (kakoune: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | +| Jump right | `right.jump` | `l` (core: normal) , `right` (core: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | | Extend right | `right.extend` | `s-l` (kakoune: normal), `s-right` (kakoune: normal), `l` (helix: select), `right` (helix: select) | `[".select.horizontally", { direction: 1, shift: "extend", ... }]` | -| Jump left | `left.jump` | `h` (kakoune: normal) , `left` (kakoune: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | +| Jump left | `left.jump` | `h` (core: normal) , `left` (core: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | | Extend left | `left.extend` | `s-h` (kakoune: normal), `s-left` (kakoune: normal), `h` (helix: select), `left` (helix: select) | `[".select.horizontally", { direction: -1, shift: "extend", ... }]` | This command: @@ -1224,7 +1237,7 @@ This command: -### [`select.to`](./select.ts#L286-L304) +### [`select.to`](./select.ts#L290-L308) Select to. @@ -1235,7 +1248,7 @@ line. If no count is specified, this command will shift open the `goto` menu. | Title | Identifier | Keybinding | Command | | --------- | ----------- | -------------------------------------------- | ------------------------------------------ | -| Go to | `to.jump` | `g` (kakoune: normal) | `[".select.to", { shift: "jump" , ... }]` | +| Go to | `to.jump` | `g` (core: normal) | `[".select.to", { shift: "jump" , ... }]` | | Extend to | `to.extend` | `s-g` (kakoune: normal), `g` (helix: select) | `[".select.to", { shift: "extend", ... }]` | This command: @@ -1244,7 +1257,7 @@ This command: -### [`select.line.below`](./select.ts#L314-L317) +### [`select.line.below`](./select.ts#L318-L321) Select line below. @@ -1253,16 +1266,19 @@ This command: -### [`select.line.below.extend`](./select.ts#L342-L345) +### [`select.line.below.extend`](./select.ts#L346-L350) Extend to line below. This command: - may be repeated with a given number of repetitions. +Default keybinding: `x` (helix: normal) +`x` (helix: select) + -### [`select.line.above`](./select.ts#L372-L375) +### [`select.line.above`](./select.ts#L377-L380) Select line above. @@ -1271,7 +1287,7 @@ This command: -### [`select.line.above.extend`](./select.ts#L399-L402) +### [`select.line.above.extend`](./select.ts#L404-L407) Extend to line above. @@ -1280,32 +1296,32 @@ This command: -### [`select.lineStart`](./select.ts#L448-L470) +### [`select.lineStart`](./select.ts#L453-L475) Select to line start. #### Variants -| Title | Identifier | Keybinding | Command | -| -------------------- | ------------------ | ----------------------------------------------------- | ------------------------------------------------------------------ | -| Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | -| Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal) | `[".select.lineStart", { shift: "extend", ... }]` | -| Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | -| Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | -| Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | -| Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | +| Title | Identifier | Keybinding | Command | +| -------------------- | ------------------ | ----------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | +| Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal), `home` (helix: select) | `[".select.lineStart", { shift: "extend", ... }]` | +| Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | +| Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | +| Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | +| Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `skipBlank` of type `boolean`. Default keybinding: `a-h` (kakoune: normal) -`home` (kakoune: normal) +`home` (core: normal) -### [`select.lineEnd`](./select.ts#L495-L517) +### [`select.lineEnd`](./select.ts#L500-L522) Select to line end. @@ -1313,22 +1329,22 @@ Select to line end. #### Variants -| Title | Identifier | Keybinding | Command | -| ------------------------ | -------------------- | ---------------------------------------------------- | --------------------------------------------------------------- | -| Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal) | `[".select.lineEnd", { shift: "extend", ... }]` | -| Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | -| Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | +| Title | Identifier | Keybinding | Command | +| ------------------------ | -------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------- | +| Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal), `end` (helix: select) | `[".select.lineEnd", { shift: "extend", ... }]` | +| Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | +| Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `lineBreak` of type `boolean`. Default keybinding: `a-l` (kakoune: normal) -`end` (kakoune: normal) +`end` (core: normal) -### [`select.lastLine`](./select.ts#L545-L555) +### [`select.lastLine`](./select.ts#L550-L560) Select to last line. @@ -1341,7 +1357,7 @@ Select to last line. -### [`select.firstVisibleLine`](./select.ts#L566-L576) +### [`select.firstVisibleLine`](./select.ts#L571-L581) Select to first visible line. @@ -1354,7 +1370,7 @@ Select to first visible line. -### [`select.middleVisibleLine`](./select.ts#L583-L593) +### [`select.middleVisibleLine`](./select.ts#L588-L598) Select to middle visible line. @@ -1367,7 +1383,7 @@ Select to middle visible line. -### [`select.lastVisibleLine`](./select.ts#L600-L610) +### [`select.lastVisibleLine`](./select.ts#L605-L615) Select to last visible line. @@ -1392,7 +1408,8 @@ Copy selections text. This command: - accepts a register (by default, it uses `dquote`). -Default keybinding: `y` (kakoune: normal) +Default keybinding: `y` (core: normal) +`y` (helix: select) @@ -1445,45 +1462,44 @@ Default keybinding: `a-z` (kakoune: normal) -### [`selections.pipe`](./selections.ts#L241-L263) +### [`selections.pipe`](./selections.ts#L241-L262) Pipe selections. Run the specified command or code with the contents of each selection, and save the result to a register. - See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes-through-external-programs #### Additional commands -| Title | Identifier | Keybinding | Commands | -| ------------------- | -------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| Pipe and replace | `pipe.replace` | `\|` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | -| Pipe and append | `pipe.append` | `!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | -| Pipe and prepend | `pipe.prepend` | `a-!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Pipe and replace | `pipe.replace` | `\|` (core: normal), `\|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | +| Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | +| Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | This command: - accepts a register (by default, it uses `pipe`). - takes an input `expression` of type `string`. -Default keybinding: `a-|` (kakoune: normal) +Default keybinding: `a-|` (core: normal) +`a-|` (helix: select) -### [`selections.filter`](./selections.ts#L291-L313) +### [`selections.filter`](./selections.ts#L290-L311) Filter selections. - #### Variants -| Title | Identifier | Keybinding | Commands | -| -------------------------- | ----------------------- | --------------------------| ------------------------------------------------------------------------ | -| Keep matching selections | `filter.regexp` | `a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/" , ... }]` | -| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | -| Clear secondary selections | `clear.secondary` | `,` (kakoune: normal) | `[".selections.filter", { expression: "i === count" , ... }]` | -| Clear main selections | `clear.main` | `a-,` (kakoune: normal) | `[".selections.filter", { expression: "i !== count" , ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | +| Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | +| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | +| Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | +| Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | This command: - accepts an argument of type `{ expression?: string }`. @@ -1492,19 +1508,20 @@ This command: - takes an argument `interactive` of type `boolean`. - takes an argument `inverse` of type `boolean`. -Default keybinding: `$` (kakoune: normal) +Default keybinding: `$` (core: normal) +`$` (helix: select) -### [`selections.select`](./selections.ts#L346-L360) +### [`selections.select`](./selections.ts#L344-L358) Select within selections. #### Variants -| Title | Identifier | Keybinding | Command | -| -------------- | --------------- | --------------------- | ------------------------------------------------------------------------------------------------- | -| Leap or select | `select.orLeap` | `s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | +| Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | This command: - accepts an argument of type `{ re?: string | RegExp }`. @@ -1512,7 +1529,7 @@ This command: -### [`selections.split`](./selections.ts#L379-L390) +### [`selections.split`](./selections.ts#L377-L388) Split selections. @@ -1522,19 +1539,20 @@ This command: - takes an argument `excludeEmpty` of type `boolean`. - takes an argument `interactive` of type `boolean`. -Default keybinding: `s-s` (kakoune: normal) +Default keybinding: `s-s` (core: normal) +`s-s` (helix: select) -### [`selections.splitLines`](./selections.ts#L415-L431) +### [`selections.splitLines`](./selections.ts#L413-L429) Split selections at line boundaries. #### Variants -| Title | Identifier | Keybinding | Command | -| ----------------------- | ---------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------- | -| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | This command: - may be repeated with a given number of repetitions. @@ -1542,7 +1560,7 @@ This command: -### [`selections.expandToLines`](./selections.ts#L474-L481) +### [`selections.expandToLines`](./selections.ts#L472-L479) Expand to lines. @@ -1551,10 +1569,12 @@ Expand selections to contain full lines (including end-of-line characters). Default keybinding: `x` (kakoune: normal) +`s-x` (helix: normal) +`s-x` (helix: select) -### [`selections.trimLines`](./selections.ts#L508-L515) +### [`selections.trimLines`](./selections.ts#L506-L513) Trim lines. @@ -1562,11 +1582,12 @@ Trim selections to only contain full lines (from start to line break). -Default keybinding: `a-x` (kakoune: normal) +Default keybinding: `a-x` (core: normal) +`a-x` (helix: select) -### [`selections.trimWhitespace`](./selections.ts#L540-L547) +### [`selections.trimWhitespace`](./selections.ts#L538-L545) Trim whitespace. @@ -1574,11 +1595,12 @@ Trim whitespace at beginning and end of selections. -Default keybinding: `_` (kakoune: normal) +Default keybinding: `_` (core: normal) +`_` (helix: select) -### [`selections.reduce`](./selections.ts#L566-L585) +### [`selections.reduce`](./selections.ts#L564-L583) Reduce selections to their cursor. @@ -1594,11 +1616,12 @@ This command: - takes an argument `empty` of type `boolean`. - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | "both"`. -Default keybinding: `;` (kakoune: normal) +Default keybinding: `;` (core: normal) +`;` (helix: select) -### [`selections.changeDirection`](./selections.ts#L647-L662) +### [`selections.changeDirection`](./selections.ts#L645-L660) Change direction of selections. @@ -1612,11 +1635,12 @@ Change direction of selections. | Backward selections | `faceBackward` | | `[".selections.changeDirection", { direction: -1 }]` | -Default keybinding: `a-;` (kakoune: normal) +Default keybinding: `a-;` (core: normal) +`a-;` (helix: select) -### [`selections.changeOrder`](./selections.ts#L687-L701) +### [`selections.changeOrder`](./selections.ts#L685-L699) Reverse selections. @@ -1630,7 +1654,7 @@ Reverse selections. -### [`selections.sort`](./selections.ts#L714-L726) +### [`selections.sort`](./selections.ts#L712-L724) Sort selections. @@ -1641,7 +1665,7 @@ This command: -### [`selections.copy`](./selections.ts#L799-L817) +### [`selections.copy`](./selections.ts#L797-L815) Copy selections below. @@ -1659,7 +1683,7 @@ Default keybinding: `s-c` (kakoune: normal) -### [`selections.merge`](./selections.ts#L851-L856) +### [`selections.merge`](./selections.ts#L849-L854) Merge contiguous selections. @@ -1669,13 +1693,13 @@ Default keybinding: `a-_` (kakoune: normal) -### [`selections.open`](./selections.ts#L860-L863) +### [`selections.open`](./selections.ts#L858-L861) Open selected file. -### [`selections.toggleIndices`](./selections.ts#L876-L893) +### [`selections.toggleIndices`](./selections.ts#L874-L891) Toggle selection indices. @@ -1718,38 +1742,42 @@ Default keybinding: `a-)` (kakoune: normal) -### [`selections.rotate.contents`](./selections.rotate.ts#L28-L37) +### [`selections.rotate.contents`](./selections.rotate.ts#L28-L39) Rotate selections clockwise (contents only). + The following command is also available: -| Title | Identifier | Command | -| --------------------------------------------------- | ------------------ | ---------------------------------------------------- | -| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `[".selections.rotate.contents", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | +| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. +Default keybinding: `a-)` (helix: normal) +`a-)` (helix: select) + -### [`selections.rotate.selections`](./selections.rotate.ts#L45-L56) +### [`selections.rotate.selections`](./selections.rotate.ts#L47-L58) Rotate selections clockwise (selections only). The following keybinding is also available: -| Title | Identifier | Keybinding | Command | -| ----------------------------------------------------- | -------------------- | --------------------- | ------------------------------------------------------ | -| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (kakoune: normal) | `[".selections.rotate.selections", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------------------------------------- | -------------------- | --------------------------------------- | ------------------------------------------------------ | +| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal), `(` (helix: select) | `[".selections.rotate.selections", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. -Default keybinding: `)` (kakoune: normal) +Default keybinding: `)` (core: normal) ## [`view`](./view.ts) @@ -1757,10 +1785,10 @@ Moving the editor view. #### Predefined keybindings -| Title | Keybinding | Command | -| ----------------------- | ----------------------- | ---------------------------------------------------- | -| Show view menu | `v` (kakoune: normal) | `[".openMenu", { menu: "view", ... }]` | -| Show view menu (locked) | `s-v` (kakoune: normal) | `[".openMenu", { menu: "view", locked: true, ... }]` | +| Title | Keybinding | Command | +| ----------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- | +| Show view menu | `v` (kakoune: normal), `z` (helix: normal), `z` (helix: select) | `[".openMenu", { menu: "view", ... }]` | +| Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal), `s-z` (helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | diff --git a/src/commands/edit.ts b/src/commands/edit.ts index 8e76a36f..24db4a16 100644 --- a/src/commands/edit.ts +++ b/src/commands/edit.ts @@ -32,18 +32,18 @@ declare module "./edit"; * | Title | Identifier | Keybinding | Commands | * | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | * | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | - * | Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | - * | Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | - * | Paste before and select | `paste.before.select` | `s-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | - * | Paste after and select | `paste.after.select` | `p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | + * | Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | + * | Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | + * | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | + * | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | * | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | * | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | * | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | * | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | - * | Delete | `delete` | `a-d` (kakoune: normal) | `[".edit.insert", { register: "_", ... }]` | + * | Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | * | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | - * | Copy and delete | `yank-delete` | `d` (kakoune: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | - * | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (kakoune: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | + * | Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | + * | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | * | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | */ export async function insert( @@ -133,7 +133,7 @@ export async function insert( /** * Join lines. * - * @keys `a-j` (kakoune: normal) + * @keys `a-j` (core: normal), `s-j` (helix: select) */ export function join(_: Context, separator?: Argument) { return joinLines(Selections.lines(), separator); @@ -142,7 +142,7 @@ export function join(_: Context, separator?: Argument) { /** * Join lines and select inserted separators. * - * @keys `s-a-j` (kakoune: normal) + * @keys `s-a-j` (core: normal), `s-a-j` (helix: select) */ export async function join_select(_: Context, separator?: Argument) { Selections.set(await joinLines(Selections.lines(), separator)); @@ -151,7 +151,7 @@ export async function join_select(_: Context, separator?: Argument) { /** * Indent selected lines. * - * @keys `>` (kakoune: normal) + * @keys `>` (core: normal), `>` (helix: select) */ export function indent(_: Context, repetitions: number) { return indentLines(Selections.lines(), repetitions, /* indentEmpty= */ false); @@ -178,7 +178,7 @@ export function deindent(_: Context, repetitions: number) { /** * Deindent selected lines (including incomplete indent). * - * @keys `<` (kakoune: normal) + * @keys `<` (core: normal), `<` (helix: select) */ export function deindent_withIncomplete(_: Context, repetitions: number) { return deindentLines(Selections.lines(), repetitions, /* deindentIncomplete= */ true); @@ -187,7 +187,7 @@ export function deindent_withIncomplete(_: Context, repetitions: number) { /** * Transform to lower case. * - * @keys `` ` `` (kakoune: normal) + * @keys `` ` `` (core: normal), `` ` `` (helix: select) */ export function case_toLower(_: Context) { return replace((text) => text.toLocaleLowerCase()); @@ -196,7 +196,7 @@ export function case_toLower(_: Context) { /** * Transform to upper case. * - * @keys `` s-` `` (kakoune: normal) + * @keys `` s-` `` (kakoune: normal), `` a-` `` (helix: normal), `` a-` `` (helix: select) */ export function case_toUpper(_: Context) { return replace((text) => text.toLocaleUpperCase()); @@ -205,7 +205,7 @@ export function case_toUpper(_: Context) { /** * Swap case. * - * @keys `` a-` `` (kakoune: normal) + * @keys `` a-` `` (kakoune: normal), `` s-` `` (helix: normal), `` s-` `` (helix: select) */ export function case_swap(_: Context) { return replace((text) => { @@ -225,7 +225,7 @@ export function case_swap(_: Context) { /** * Replace characters. * - * @keys `r` (kakoune: normal) + * @keys `r` (core: normal) */ export async function replaceCharacters( _: Context, @@ -280,7 +280,7 @@ export async function replaceCharacters( * Align selections, aligning the cursor of each selection by inserting spaces * before the first character of each selection. * - * @keys `&` (kakoune: normal) + * @keys `&` (core: normal) */ export function align(_: Context, fill: Argument = " ") { return edit((builder, selections) => { @@ -384,9 +384,9 @@ export function copyIndentation( * * #### Additional keybindings * - * | Title | Identifier | Keybinding | Commands | - * | ------------------------------------------ | ---------------------- | ----------------------- | --------------------------------------------------------------------------------- | - * | Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (kakoune: normal) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | + * | Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | */ export function newLine_above( _: Context, @@ -422,9 +422,9 @@ export function newLine_above( * * #### Additional keybindings * - * | Title | Identifier | Keybinding | Commands | - * | ------------------------------------------ | ---------------------- | --------------------- | --------------------------------------------------------------------------------- | - * | Insert new line below and switch to insert | `newLine.below.insert` | `o` (kakoune: normal) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | + * | Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | */ export function newLine_below( _: Context, diff --git a/src/commands/history.ts b/src/commands/history.ts index 80a6742c..1a18670f 100644 --- a/src/commands/history.ts +++ b/src/commands/history.ts @@ -15,7 +15,7 @@ declare module "./history"; /** * Undo. * - * @keys `u` (kakoune: normal), `u` (helix: select) + * @keys `u` (core: normal), `u` (helix: select) */ export function undo() { return vscode.commands.executeCommand("undo"); @@ -24,7 +24,7 @@ export function undo() { /** * Redo. * - * @keys `s-u` (kakoune: normal), `s-u` (helix: select) + * @keys `s-u` (core: normal), `s-u` (helix: select) */ export function redo() { return vscode.commands.executeCommand("redo"); @@ -53,10 +53,10 @@ export function redo_selections() { * * @noreplay * - * | Title | Identifier | Keybinding | Commands | - * | ---------------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------- | - * | Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek|select|selections)", +count }]` | - * | Repeat last seek | `repeat.seek` | `a-.` (kakoune: normal) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | + * | Title | Identifier | Keybinding | Commands | + * | ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | + * | Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek|select|selections)", +count }]` | + * | Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | */ export async function repeat( _: Context, @@ -98,7 +98,7 @@ export async function repeat( /** * Repeat last edit without a command. * - * @keys `.` (kakoune: normal), `NumPad_Decimal` (kakoune: normal) + * @keys `.` (core: normal), `NumPad_Decimal` (core: normal) * @noreplay */ export async function repeat_edit(_: Context, repetitions: number) { diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index c94c53ba..92fc138d 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -12,47 +12,47 @@ devdev.copyLastErrorMessageCopies the last encountered error message dev.setSelectionBehaviorSet the selection behavior of the specified mode editedit.alignAlign selectionsShift+7 (editorTextFocus && dance.mode == 'normal') -edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal') -edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal') -edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal') -edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.mode == 'normal') -edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.mode == 'normal') -edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal') -edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal') -edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.mode == 'normal') -edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal') -edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal') -edit.paste.afterPaste after +edit.case.swapSwap caseAlt+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.paste.afterPaste afterP (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') edit.paste.after.selectPaste after and selectP (editorTextFocus && dance.mode == 'normal') -edit.paste.beforePaste before +edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') edit.paste.before.selectPaste before and selectShift+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.afterPaste all after -edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.mode == 'normal') +edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') edit.pasteAll.beforePaste all before -edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.mode == 'normal') -edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.mode == 'insert') -edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.mode == 'select') -edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.mode == 'select') -edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') -edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal') -edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal') -edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal') -edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal') -edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') -edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.mode == 'normal') +edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') edit.replaceCharactersReplace charactersR (editorTextFocus && dance.mode == 'normal') -historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal') +historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal')Alt+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') history.repeat.selectionRepeat last selection change -history.recording.playReplay recordingQ (editorTextFocus && dance.mode == 'normal') -history.recording.startStart recordingShift+Q (editorTextFocus && dance.mode == 'normal' && !dance.isRecording) -history.recording.stopStop recordingEscape (editorTextFocus && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.mode == 'normal' && dance.isRecording) -history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.mode == 'select') -history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.mode == 'normal') +history.recording.playReplay recordingQ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +history.recording.startStart recordingShift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && !dance.isRecording) +history.recording.stopStop recordingEscape (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording) +history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') history.repeatRepeat last change history.repeat.editRepeat last edit without a command. (editorTextFocus && dance.mode == 'normal')NumPad_Decimal (editorTextFocus && dance.mode == 'normal') -history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.mode == 'select') -history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.mode == 'normal') +history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') keybindingskeybindings.setupSet up Dance keybindings misccancelCancel Dance operationEscape (editorTextFocus && dance.mode == 'normal' && !dance.isRecording && !markersNavigationVisible)Escape (editorTextFocus && dance.mode == 'input') changeInputChange current input @@ -64,70 +64,70 @@ selections are empty selectRegisterSelect register for next commandShift+' (editorTextFocus && dance.mode == 'normal') updateCountUpdate Dance count updateRegisterUpdate the contents of a register -modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal') -modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal') -modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal') -modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal') +modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal')A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal')I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal')Shift+A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal')Shift+I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') modes.set.insertSet mode to Insert -modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.mode == 'select') -modes.set.selectSet mode to Select -modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.mode == 'normal') -modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.mode == 'insert') +modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')V (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.set.selectSet mode to SelectV (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') modes.setSet Dance mode modes.set.temporarilySet Dance mode temporarily searchsearch.nextSelect next matchN (editorTextFocus && dance.mode == 'normal') search.searchSearch/ (editorTextFocus && dance.mode == 'normal')NumPad_Divide (editorTextFocus && dance.mode == 'normal') -search.backwardSearch backwardAlt+/ (editorTextFocus && dance.mode == 'normal') -search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.mode == 'normal') -search.extendSearch (extend)Shift+/ (editorTextFocus && dance.mode == 'normal') -search.next.addAdd next matchShift+N (editorTextFocus && dance.mode == 'normal') -search.previousSelect previous matchAlt+N (editorTextFocus && dance.mode == 'normal') -search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.mode == 'normal') +search.backwardSearch backwardAlt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.extendSearch (extend)Shift+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.next.addAdd next matchShift+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.previousSelect previous matchAlt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') search.selection.smartSearch current selection (smart)Shift+8 (editorTextFocus && dance.mode == 'normal')NumPad_Multiply (editorTextFocus && dance.mode == 'normal') search.selectionSearch current selectionShift+Alt+8 (editorTextFocus && dance.mode == 'normal')Alt+NumPad_Multiply (editorTextFocus && dance.mode == 'normal') -seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.mode == 'normal') +seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') seek.leapLeap forward seek.objectSelect object seek.seekSelect to character (excluded)T (editorTextFocus && dance.mode == 'normal') -seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.mode == 'normal')Alt+A (editorTextFocus && dance.mode == 'insert') -seek.askObject.endSelect to whole object end] (editorTextFocus && dance.mode == 'normal') -seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.mode == 'normal') -seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.mode == 'normal')Alt+I (editorTextFocus && dance.mode == 'insert') -seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.mode == 'normal') -seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.mode == 'normal') -seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.mode == 'normal') -seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.mode == 'normal') -seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.mode == 'normal') -seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.mode == 'normal') -seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.mode == 'normal') -seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.mode == 'normal') -seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.mode == 'normal') -seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.mode == 'normal') -seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.mode == 'normal')T (editorTextFocus && dance.mode == 'select') -seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.mode == 'normal')Shift+T (editorTextFocus && dance.mode == 'select') +seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +seek.askObject.endSelect to whole object end] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.includedSelect to character (included)F (editorTextFocus && dance.mode == 'normal') -seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.mode == 'normal') -seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.mode == 'normal')F (editorTextFocus && dance.mode == 'select') -seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.mode == 'normal')Shift+F (editorTextFocus && dance.mode == 'select') +seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.leap.backwardLeap backward seek.syntax.child.experimentalSelect child syntax object seek.syntax.next.experimentalSelect next syntax object seek.syntax.parent.experimentalSelect parent syntax object seek.syntax.previous.experimentalSelect previous syntax object seek.word.backwardSelect to previous word startB (editorTextFocus && dance.mode == 'normal') -seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.mode == 'normal')W (editorTextFocus && dance.mode == 'select') -seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.mode == 'normal')B (editorTextFocus && dance.mode == 'select') -seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.mode == 'normal') -seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.mode == 'normal') -seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.mode == 'normal')Shift+W (editorTextFocus && dance.mode == 'select') -seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.mode == 'normal')Shift+B (editorTextFocus && dance.mode == 'select') +seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.wordEndSelect to next word endE (editorTextFocus && dance.mode == 'normal') -seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.mode == 'normal')E (editorTextFocus && dance.mode == 'select') -seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.mode == 'normal') -seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'select') +seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.syntax.experimentalSelect syntax object seek.wordSelect to next word startW (editorTextFocus && dance.mode == 'normal') -selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal') +selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') select.firstVisibleLineSelect to first visible line select.horizontallySelect horizontally select.lastLineSelect to last line @@ -135,82 +135,82 @@ selections are empty select.line.aboveSelect line above select.line.above.extendExtend to line above select.line.belowSelect line below -select.line.below.extendExtend to line below -select.lineEndSelect to line endAlt+L (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') -select.lineStartSelect to line startAlt+H (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') +select.line.below.extendExtend to line belowX (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineEndSelect to line endAlt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') +select.lineStartSelect to line startAlt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') select.middleVisibleLineSelect to middle visible line -select.documentEnd.extendExtend to last character -select.documentEnd.jumpJump to last character -select.down.extendExtend downShift+J (editorTextFocus && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.mode == 'normal')J (editorTextFocus && dance.mode == 'select')Down (editorTextFocus && dance.mode == 'select') +select.documentEnd.extendExtend to last character +select.documentEnd.jumpJump to last character +select.down.extendExtend downShift+J (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Down (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') select.down.jumpJump downJ (editorTextFocus && dance.mode == 'normal')Down (editorTextFocus && dance.mode == 'normal') -select.firstLine.extendExtend to first line -select.firstLine.jumpJump to first line -select.firstVisibleLine.extendExtend to first visible line -select.firstVisibleLine.jumpJump to first visible line -select.lastLine.extendExtend to last line -select.lastLine.jumpJump to last line -select.lastVisibleLine.extendExtend to last visible line -select.lastVisibleLine.jumpJump to last visible line -select.left.extendExtend leftShift+H (editorTextFocus && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.mode == 'normal')H (editorTextFocus && dance.mode == 'select')Left (editorTextFocus && dance.mode == 'select') -select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') -select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal') -select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal') -select.lineStart.jumpJump to line start -select.lineStart.skipBlank.extendExtend to line start (skip blank) -select.lineStart.skipBlank.jumpJump to line start (skip blank) -select.middleVisibleLine.extendExtend to middle visible line -select.middleVisibleLine.jumpJump to middle visible line -select.right.extendExtend rightShift+L (editorTextFocus && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.mode == 'normal')L (editorTextFocus && dance.mode == 'select')Right (editorTextFocus && dance.mode == 'select') -select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') -select.to.extendExtend toShift+G (editorTextFocus && dance.mode == 'normal')G (editorTextFocus && dance.mode == 'select') -select.to.jumpGo toG (editorTextFocus && dance.mode == 'normal') -select.up.extendExtend upShift+K (editorTextFocus && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.mode == 'normal')K (editorTextFocus && dance.mode == 'select')Up (editorTextFocus && dance.mode == 'select') +select.firstLine.extendExtend to first line +select.firstLine.jumpJump to first line +select.firstVisibleLine.extendExtend to first visible line +select.firstVisibleLine.jumpJump to first visible line +select.lastLine.extendExtend to last line +select.lastLine.jumpJump to last line +select.lastVisibleLine.extendExtend to last visible line +select.lastVisibleLine.jumpJump to last visible line +select.left.extendExtend leftShift+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')H (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Left (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') +select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+End (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineStart.jumpJump to line start +select.lineStart.skipBlank.extendExtend to line start (skip blank) +select.lineStart.skipBlank.jumpJump to line start (skip blank) +select.middleVisibleLine.extendExtend to middle visible line +select.middleVisibleLine.jumpJump to middle visible line +select.right.extendExtend rightShift+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')L (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Right (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') +select.to.extendExtend toShift+G (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')G (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.to.jumpGo toG (editorTextFocus && dance.mode == 'normal') +select.up.extendExtend upShift+K (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Up (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') select.up.jumpJump upK (editorTextFocus && dance.mode == 'normal')Up (editorTextFocus && dance.mode == 'normal') select.toSelect to select.verticallySelect vertically -selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal') +selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.changeOrderReverse selections -selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal') -selections.expandToLinesExpand to linesX (editorTextFocus && dance.mode == 'normal') -selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal') -selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.mode == 'normal') +selections.copyCopy selections belowShift+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.expandToLinesExpand to linesX (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') selections.openOpen selected file -selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal') -selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal') -selections.restoreRestore selectionsZ (editorTextFocus && dance.mode == 'normal') -selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.mode == 'normal') -selections.saveSave selectionsShift+Z (editorTextFocus && dance.mode == 'normal') -selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal') +selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal')Shift+Alt+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal'); (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.restoreRestore selectionsZ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.saveSave selectionsShift+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.selectSelect within selections -selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal') -selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal') -selections.faceBackwardBackward selections -selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') -selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal') -selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal') -selections.hideIndicesHide selection indices -selections.orderAscendingOrder selections ascending -selections.orderDescendingOrder selections descending -selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal') -selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal') -selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal') -selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') -selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal') -selections.showIndicesShow selection indices -selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal') +selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.faceBackwardBackward selections +selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.hideIndicesHide selection indices +selections.orderAscendingOrder selections ascending +selections.orderDescendingOrder selections descending +selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.showIndicesShow selection indices +selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.sortSort selections -selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal') +selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries -selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal') -selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal') -selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal') -selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') -selections.rotate.contentsRotate selections clockwise (contents only) +selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.behavior == 'dance' && dance.mode == 'normal') +selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal') -selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.mode == 'normal') -selections.rotate.contents.reverseRotate selections counter-clockwise (contents only) -selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal') +selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') viewview.lineReveals a position based on the main cursor @@ -268,18 +268,18 @@ Specify `all` to paste all contents next to each selection. | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | -| Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | -| Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | -| Paste before and select | `paste.before.select` | `s-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | -| Paste after and select | `paste.after.select` | `p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | +| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | +| Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | +| Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | +| Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | -| Delete | `delete` | `a-d` (kakoune: normal) | `[".edit.insert", { register: "_", ... }]` | +| Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | -| Copy and delete | `yank-delete` | `d` (kakoune: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | -| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (kakoune: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | +| Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | +| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | This command: @@ -304,7 +304,8 @@ Join lines. This command: - takes an argument `separator` of type `string`. -Default keybinding: `a-j` (kakoune: normal) +Default keybinding: `a-j` (core: normal) +`s-j` (helix: select) @@ -316,7 +317,8 @@ Join lines and select inserted separators. This command: - takes an argument `separator` of type `string`. -Default keybinding: `s-a-j` (kakoune: normal) +Default keybinding: `s-a-j` (core: normal) +`s-a-j` (helix: select) @@ -328,7 +330,8 @@ Indent selected lines. This command: - may be repeated with a given number of repetitions. -Default keybinding: `>` (kakoune: normal) +Default keybinding: `>` (core: normal) +`>` (helix: select) @@ -364,7 +367,8 @@ Deindent selected lines (including incomplete indent). This command: - may be repeated with a given number of repetitions. -Default keybinding: `<` (kakoune: normal) +Default keybinding: `<` (core: normal) +`<` (helix: select) @@ -374,7 +378,8 @@ Transform to lower case. -Default keybinding: `` ` `` (kakoune: normal) +Default keybinding: `` ` `` (core: normal) +`` ` `` (helix: select) @@ -385,6 +390,8 @@ Transform to upper case. Default keybinding: `` s-` `` (kakoune: normal) +`` a-` `` (helix: normal) +`` a-` `` (helix: select) @@ -395,6 +402,8 @@ Swap case. Default keybinding: `` a-` `` (kakoune: normal) +`` s-` `` (helix: normal) +`` s-` `` (helix: select) @@ -407,7 +416,7 @@ This command: - may be repeated with a given number of repetitions. - takes an input `input` of type `string`. -Default keybinding: `r` (kakoune: normal) +Default keybinding: `r` (core: normal) @@ -422,7 +431,7 @@ before the first character of each selection. This command: - takes an argument `fill` of type `string`. -Default keybinding: `&` (kakoune: normal) +Default keybinding: `&` (core: normal) @@ -451,9 +460,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | ----------------------- | --------------------------------------------------------------------------------- | -| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (kakoune: normal) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | +| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -473,9 +482,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | --------------------- | --------------------------------------------------------------------------------- | -| Insert new line below and switch to insert | `newLine.below.insert` | `o` (kakoune: normal) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | +| Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -497,7 +506,7 @@ Undo. This command: - does not require an active text editor. -Default keybinding: `u` (kakoune: normal) +Default keybinding: `u` (core: normal) `u` (helix: select) @@ -510,7 +519,7 @@ Redo. This command: - does not require an active text editor. -Default keybinding: `s-u` (kakoune: normal) +Default keybinding: `s-u` (core: normal) `s-u` (helix: select) @@ -544,10 +553,10 @@ Default keybinding: `s-a-u` (kakoune: normal) Repeat last change. -| Title | Identifier | Keybinding | Commands | -| ---------------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------- | -| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | -| Repeat last seek | `repeat.seek` | `a-.` (kakoune: normal) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | +| Title | Identifier | Keybinding | Commands | +| ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | +| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | +| Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | This command: - may be repeated with a given number of repetitions. @@ -563,8 +572,8 @@ Repeat last edit without a command. This command: - may be repeated with a given number of repetitions. -Default keybinding: `.` (kakoune: normal) -`NumPad_Decimal` (kakoune: normal) +Default keybinding: `.` (core: normal) +`NumPad_Decimal` (core: normal) @@ -776,7 +785,7 @@ current document. This command: - takes an input `register` of type `string | Register`. -Default keybinding: `"` (kakoune: normal) +Default keybinding: `"` (core: normal) @@ -883,20 +892,20 @@ Set Dance mode. #### Variants -| Title | Identifier | Keybinding | Command | -| ------------------ | ------------ | ---------------------------------------------------- | ----------------------------------------------------------- | -| Set mode to Normal | `set.normal` | `escape` (kakoune: insert), `escape` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | -| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | -| Set mode to Select | `set.select` | | `[".modes.set", { mode: "select" }]` | +| Title | Identifier | Keybinding | Command | +| ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | +| Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | +| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | +| Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | Other variants are provided to switch to insert mode: -| Title | Identifier | Keybinding | Commands | -| -------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Insert before | `insert.before` | `i` (kakoune: normal) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert after | `insert.after` | `a` (kakoune: normal) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | -| Insert at line start | `insert.lineStart` | `s-i` (kakoune: normal) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert at line end | `insert.lineEnd` | `s-a` (kakoune: normal) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | This command: @@ -931,11 +940,11 @@ Search for patterns and replace or add selections. Search. -| Title | Identifier | Keybinding | Command | -| ------------------------ | ----------------- | ----------------------- | ------------------------------------------------------ | -| Search (extend) | `extend` | `?` (kakoune: normal) | `[".search", { shift: "extend", ... }]` | -| Search backward | `backward` | `a-/` (kakoune: normal) | `[".search", { direction: -1 , ... }]` | -| Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal) | `[".search", { direction: -1, shift: "extend", ... }]` | +| Title | Identifier | Keybinding | Command | +| ------------------------ | ----------------- | -------------------------------------------- | ------------------------------------------------------ | +| Search (extend) | `extend` | `?` (kakoune: normal), `/` (helix: select) | `[".search", { shift: "extend", ... }]` | +| Search backward | `backward` | `a-/` (kakoune: normal), `?` (helix: normal) | `[".search", { direction: -1 , ... }]` | +| Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal), `?` (helix: select) | `[".search", { direction: -1, shift: "extend", ... }]` | This command: - accepts a register (by default, it uses `slash`). @@ -944,8 +953,8 @@ This command: - takes an argument `add` of type `boolean`. - takes an argument `interactive` of type `boolean`. -Default keybinding: `/` (kakoune: normal) -`NumPad_Divide` (kakoune: normal) +Default keybinding: `/` (core: normal) +`NumPad_Divide` (core: normal) @@ -954,16 +963,16 @@ Default keybinding: `/` (kakoune: normal) Search current selection. -| Title | Identifier | Keybinding | Command | -| -------------------------------- | ----------------- | ---------------------------------------------------------- | --------------------------------------------------- | -| Search current selection (smart) | `selection.smart` | `*` (kakoune: normal), `NumPad_Multiply` (kakoune: normal) | `[".search.selection", { smart: true, +register }]` | +| Title | Identifier | Keybinding | Command | +| -------------------------------- | ----------------- | ---------------------------------------------------- | --------------------------------------------------- | +| Search current selection (smart) | `selection.smart` | `*` (core: normal), `NumPad_Multiply` (core: normal) | `[".search.selection", { smart: true, +register }]` | This command: - accepts a register (by default, it uses `slash`). - takes an argument `smart` of type `boolean`. -Default keybinding: `a-*` (kakoune: normal) -`a-NumPad_Multiply` (kakoune: normal) +Default keybinding: `a-*` (core: normal) +`a-NumPad_Multiply` (core: normal) @@ -972,18 +981,18 @@ Default keybinding: `a-*` (kakoune: normal) Select next match. -| Title | Identifier | Keybinding | Command | -| --------------------- | -------------- | ------------------------- | ----------------------------------------------------- | -| Add next match | `next.add` | `s-n` (kakoune: normal) | `[".search.next", { add: true, ... }]` | -| Select previous match | `previous` | `a-n` (kakoune: normal) | `[".search.next", { direction: -1 , ... }]` | -| Add previous match | `previous.add` | `s-a-n` (kakoune: normal) | `[".search.next", { direction: -1, add: true, ... }]` | +| Title | Identifier | Keybinding | Command | +| --------------------- | -------------- | ------------------------------------------------ | ----------------------------------------------------- | +| Add next match | `next.add` | `s-n` (kakoune: normal), `n` (helix: select) | `[".search.next", { add: true, ... }]` | +| Select previous match | `previous` | `a-n` (kakoune: normal), `s-n` (helix: normal) | `[".search.next", { direction: -1 , ... }]` | +| Add previous match | `previous.add` | `s-a-n` (kakoune: normal), `s-n` (helix: select) | `[".search.next", { direction: -1, add: true, ... }]` | This command: - accepts a register (by default, it uses `slash`). - may be repeated with a given number of repetitions. - takes an argument `add` of type `boolean`. -Default keybinding: `n` (kakoune: normal) +Default keybinding: `n` (core: normal) ## [`seek`](../seek.ts) @@ -1001,11 +1010,11 @@ Select to character (excluded). | Title | Identifier | Keybinding | Command | | ---------------------------------------- | -------------------------- | ------------------------------------------------ | ------------------------------------------------------------------- | | Extend to character (excluded) | `extend` | `s-t` (kakoune: normal), `t` (helix: select) | `[".seek", { shift: "extend" , ... }]` | -| Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal) | `[".seek", { direction: -1, ... }]` | +| Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal), `s-t` (helix: normal) | `[".seek", { direction: -1, ... }]` | | Extend to character (excluded, backward) | `extend.backward` | `s-a-t` (kakoune: normal), `s-t` (helix: select) | `[".seek", { shift: "extend", direction: -1, ... }]` | -| Select to character (included) | `included` | `f` (kakoune: normal) | `[".seek", { include: true , ... }]` | +| Select to character (included) | `included` | `f` (core: normal) | `[".seek", { include: true , ... }]` | | Extend to character (included) | `included.extend` | `s-f` (kakoune: normal), `f` (helix: select) | `[".seek", { include: true, shift: "extend" , ... }]` | -| Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal) | `[".seek", { include: true, direction: -1, ... }]` | +| Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal), `s-f` (helix: normal) | `[".seek", { include: true, direction: -1, ... }]` | | Extend to character (included, backward) | `included.extend.backward` | `s-a-f` (kakoune: normal), `s-f` (helix: select) | `[".seek", { include: true, shift: "extend", direction: -1, ... }]` | This command: @@ -1013,7 +1022,7 @@ This command: - takes an argument `include` of type `boolean`. - takes an input `input` of type `string`. -Default keybinding: `t` (kakoune: normal) +Default keybinding: `t` (core: normal) @@ -1050,15 +1059,15 @@ Select the word and following whitespaces on the right of the end of each select | Title | Identifier | Keybinding | Command | | -------------------------------------------- | ------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------- | | Extend to next word start | `word.extend` | `s-w` (kakoune: normal), `w` (helix: select) | `[".seek.word", { shift: "extend" , ... }]` | -| Select to previous word start | `word.backward` | `b` (kakoune: normal) | `[".seek.word", { direction: -1, ... }]` | +| Select to previous word start | `word.backward` | `b` (core: normal) | `[".seek.word", { direction: -1, ... }]` | | Extend to previous word start | `word.extend.backward` | `s-b` (kakoune: normal), `b` (helix: select) | `[".seek.word", { shift: "extend", direction: -1, ... }]` | -| Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal) | `[".seek.word", { ws: true , ... }]` | +| Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal), `s-w` (helix: normal) | `[".seek.word", { ws: true , ... }]` | | Extend to next non-whitespace word start | `word.ws.extend` | `s-a-w` (kakoune: normal), `s-w` (helix: select) | `[".seek.word", { ws: true, shift: "extend" , ... }]` | -| Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | +| Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal), `s-b` (helix: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | | Extend to previous non-whitespace word start | `word.ws.extend.backward` | `s-a-b` (kakoune: normal), `s-b` (helix: select) | `[".seek.word", { ws: true, shift: "extend", direction: -1, ... }]` | -| Select to next word end | `wordEnd` | `e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | +| Select to next word end | `wordEnd` | `e` (core: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | | Extend to next word end | `wordEnd.extend` | `s-e` (kakoune: normal), `e` (helix: select) | `[".seek.word", { stopAtEnd: true , shift: "extend" , ... }]` | -| Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | +| Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal), `s-e` (helix: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | | Extend to next non-whitespace word end | `wordEnd.ws.extend` | `s-a-e` (kakoune: normal), `s-e` (helix: select) | `[".seek.word", { stopAtEnd: true , ws: true, shift: "extend" , ... }]` | This command: @@ -1066,7 +1075,7 @@ This command: - takes an argument `stopAtEnd` of type `boolean`. - takes an argument `ws` of type `boolean`. -Default keybinding: `w` (kakoune: normal) +Default keybinding: `w` (core: normal) @@ -1159,28 +1168,32 @@ Default keybinding: `%` (kakoune: normal) -### [`select.vertically`](../select.ts#L31-L64) +### [`select.vertically`](../select.ts#L31-L68) Select vertically. #### Variants -| Title | Identifier | Keybinding | Command | +| Title | Identifier | Keybinding | Command | | ----------- | ------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | -| Jump down | `down.jump` | `j` (kakoune: normal) , `down` (kakoune: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | +| Jump down | `down.jump` | `j` (core: normal) , `down` (core: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | | Extend down | `down.extend` | `s-j` (kakoune: normal), `s-down` (kakoune: normal), `j` (helix: select), `down` (helix: select) | `[".select.vertically", { direction: 1, shift: "extend", ... }]` | -| Jump up | `up.jump` | `k` (kakoune: normal) , `up` (kakoune: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | +| Jump up | `up.jump` | `k` (core: normal) , `up` (core: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | | Extend up | `up.extend` | `s-k` (kakoune: normal), `s-up` (kakoune: normal) , `k` (helix: select), `up` (helix: select) | `[".select.vertically", { direction: -1, shift: "extend", ... }]` | The following keybindings are also defined: -| Keybinding | Command | -| ------------------------------------------------ | -------------------------------------------------------------------------- | -| `c-f` (kakoune: normal), `c-f` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | -| `c-d` (kakoune: normal), `c-d` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | -| `c-b` (kakoune: normal), `c-b` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | -| `c-u` (kakoune: normal), `c-u` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | +| Keybinding | Command | +| -------------------------------------------| ---------------------------------------------------------------------------- | +| `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | +| `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | +| `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | +| `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | +| `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | +| `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | +| `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | +| `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | This command: - may be repeated with a given number of repetitions. @@ -1189,7 +1202,7 @@ This command: -### [`select.horizontally`](../select.ts#L217-L239) +### [`select.horizontally`](../select.ts#L221-L243) Select horizontally. @@ -1198,9 +1211,9 @@ Select horizontally. | Title | Identifier | Keybinding | Command | | ------------ | -------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | -| Jump right | `right.jump` | `l` (kakoune: normal) , `right` (kakoune: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | +| Jump right | `right.jump` | `l` (core: normal) , `right` (core: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | | Extend right | `right.extend` | `s-l` (kakoune: normal), `s-right` (kakoune: normal), `l` (helix: select), `right` (helix: select) | `[".select.horizontally", { direction: 1, shift: "extend", ... }]` | -| Jump left | `left.jump` | `h` (kakoune: normal) , `left` (kakoune: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | +| Jump left | `left.jump` | `h` (core: normal) , `left` (core: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | | Extend left | `left.extend` | `s-h` (kakoune: normal), `s-left` (kakoune: normal), `h` (helix: select), `left` (helix: select) | `[".select.horizontally", { direction: -1, shift: "extend", ... }]` | This command: @@ -1209,7 +1222,7 @@ This command: -### [`select.to`](../select.ts#L286-L304) +### [`select.to`](../select.ts#L290-L308) Select to. @@ -1220,7 +1233,7 @@ line. If no count is specified, this command will shift open the `goto` menu. | Title | Identifier | Keybinding | Command | | --------- | ----------- | -------------------------------------------- | ------------------------------------------ | -| Go to | `to.jump` | `g` (kakoune: normal) | `[".select.to", { shift: "jump" , ... }]` | +| Go to | `to.jump` | `g` (core: normal) | `[".select.to", { shift: "jump" , ... }]` | | Extend to | `to.extend` | `s-g` (kakoune: normal), `g` (helix: select) | `[".select.to", { shift: "extend", ... }]` | This command: @@ -1229,7 +1242,7 @@ This command: -### [`select.line.below`](../select.ts#L314-L317) +### [`select.line.below`](../select.ts#L318-L321) Select line below. @@ -1238,16 +1251,19 @@ This command: -### [`select.line.below.extend`](../select.ts#L342-L345) +### [`select.line.below.extend`](../select.ts#L346-L350) Extend to line below. This command: - may be repeated with a given number of repetitions. +Default keybinding: `x` (helix: normal) +`x` (helix: select) + -### [`select.line.above`](../select.ts#L372-L375) +### [`select.line.above`](../select.ts#L377-L380) Select line above. @@ -1256,7 +1272,7 @@ This command: -### [`select.line.above.extend`](../select.ts#L399-L402) +### [`select.line.above.extend`](../select.ts#L404-L407) Extend to line above. @@ -1265,32 +1281,32 @@ This command: -### [`select.lineStart`](../select.ts#L448-L470) +### [`select.lineStart`](../select.ts#L453-L475) Select to line start. #### Variants -| Title | Identifier | Keybinding | Command | -| -------------------- | ------------------ | ----------------------------------------------------- | ------------------------------------------------------------------ | -| Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | -| Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal) | `[".select.lineStart", { shift: "extend", ... }]` | -| Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | -| Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | -| Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | -| Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | +| Title | Identifier | Keybinding | Command | +| -------------------- | ------------------ | ----------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | +| Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal), `home` (helix: select) | `[".select.lineStart", { shift: "extend", ... }]` | +| Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | +| Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | +| Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | +| Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `skipBlank` of type `boolean`. Default keybinding: `a-h` (kakoune: normal) -`home` (kakoune: normal) +`home` (core: normal) -### [`select.lineEnd`](../select.ts#L495-L517) +### [`select.lineEnd`](../select.ts#L500-L522) Select to line end. @@ -1298,22 +1314,22 @@ Select to line end. #### Variants -| Title | Identifier | Keybinding | Command | -| ------------------------ | -------------------- | ---------------------------------------------------- | --------------------------------------------------------------- | -| Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal) | `[".select.lineEnd", { shift: "extend", ... }]` | -| Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | -| Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | +| Title | Identifier | Keybinding | Command | +| ------------------------ | -------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------- | +| Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal), `end` (helix: select) | `[".select.lineEnd", { shift: "extend", ... }]` | +| Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | +| Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `lineBreak` of type `boolean`. Default keybinding: `a-l` (kakoune: normal) -`end` (kakoune: normal) +`end` (core: normal) -### [`select.lastLine`](../select.ts#L545-L555) +### [`select.lastLine`](../select.ts#L550-L560) Select to last line. @@ -1326,7 +1342,7 @@ Select to last line. -### [`select.firstVisibleLine`](../select.ts#L566-L576) +### [`select.firstVisibleLine`](../select.ts#L571-L581) Select to first visible line. @@ -1339,7 +1355,7 @@ Select to first visible line. -### [`select.middleVisibleLine`](../select.ts#L583-L593) +### [`select.middleVisibleLine`](../select.ts#L588-L598) Select to middle visible line. @@ -1352,7 +1368,7 @@ Select to middle visible line. -### [`select.lastVisibleLine`](../select.ts#L600-L610) +### [`select.lastVisibleLine`](../select.ts#L605-L615) Select to last visible line. @@ -1377,7 +1393,8 @@ Copy selections text. This command: - accepts a register (by default, it uses `dquote`). -Default keybinding: `y` (kakoune: normal) +Default keybinding: `y` (core: normal) +`y` (helix: select) @@ -1430,45 +1447,44 @@ Default keybinding: `a-z` (kakoune: normal) -### [`selections.pipe`](../selections.ts#L241-L263) +### [`selections.pipe`](../selections.ts#L241-L262) Pipe selections. Run the specified command or code with the contents of each selection, and save the result to a register. - See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes-through-external-programs #### Additional commands -| Title | Identifier | Keybinding | Commands | -| ------------------- | -------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| Pipe and replace | `pipe.replace` | `\|` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | -| Pipe and append | `pipe.append` | `!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | -| Pipe and prepend | `pipe.prepend` | `a-!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Pipe and replace | `pipe.replace` | `\|` (core: normal), `\|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | +| Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | +| Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | This command: - accepts a register (by default, it uses `pipe`). - takes an input `expression` of type `string`. -Default keybinding: `a-|` (kakoune: normal) +Default keybinding: `a-|` (core: normal) +`a-|` (helix: select) -### [`selections.filter`](../selections.ts#L291-L313) +### [`selections.filter`](../selections.ts#L290-L311) Filter selections. - #### Variants -| Title | Identifier | Keybinding | Commands | -| -------------------------- | ----------------------- | --------------------------| ------------------------------------------------------------------------ | -| Keep matching selections | `filter.regexp` | `a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/" , ... }]` | -| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | -| Clear secondary selections | `clear.secondary` | `,` (kakoune: normal) | `[".selections.filter", { expression: "i === count" , ... }]` | -| Clear main selections | `clear.main` | `a-,` (kakoune: normal) | `[".selections.filter", { expression: "i !== count" , ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | +| Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | +| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | +| Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | +| Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | This command: - accepts an argument of type `{ expression?: string }`. @@ -1477,19 +1493,20 @@ This command: - takes an argument `interactive` of type `boolean`. - takes an argument `inverse` of type `boolean`. -Default keybinding: `$` (kakoune: normal) +Default keybinding: `$` (core: normal) +`$` (helix: select) -### [`selections.select`](../selections.ts#L346-L360) +### [`selections.select`](../selections.ts#L344-L358) Select within selections. #### Variants -| Title | Identifier | Keybinding | Command | -| -------------- | --------------- | --------------------- | ------------------------------------------------------------------------------------------------- | -| Leap or select | `select.orLeap` | `s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | +| Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | This command: - accepts an argument of type `{ re?: string | RegExp }`. @@ -1497,7 +1514,7 @@ This command: -### [`selections.split`](../selections.ts#L379-L390) +### [`selections.split`](../selections.ts#L377-L388) Split selections. @@ -1507,19 +1524,20 @@ This command: - takes an argument `excludeEmpty` of type `boolean`. - takes an argument `interactive` of type `boolean`. -Default keybinding: `s-s` (kakoune: normal) +Default keybinding: `s-s` (core: normal) +`s-s` (helix: select) -### [`selections.splitLines`](../selections.ts#L415-L431) +### [`selections.splitLines`](../selections.ts#L413-L429) Split selections at line boundaries. #### Variants -| Title | Identifier | Keybinding | Command | -| ----------------------- | ---------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------- | -| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | This command: - may be repeated with a given number of repetitions. @@ -1527,7 +1545,7 @@ This command: -### [`selections.expandToLines`](../selections.ts#L474-L481) +### [`selections.expandToLines`](../selections.ts#L472-L479) Expand to lines. @@ -1536,10 +1554,12 @@ Expand selections to contain full lines (including end-of-line characters). Default keybinding: `x` (kakoune: normal) +`s-x` (helix: normal) +`s-x` (helix: select) -### [`selections.trimLines`](../selections.ts#L508-L515) +### [`selections.trimLines`](../selections.ts#L506-L513) Trim lines. @@ -1547,11 +1567,12 @@ Trim selections to only contain full lines (from start to line break). -Default keybinding: `a-x` (kakoune: normal) +Default keybinding: `a-x` (core: normal) +`a-x` (helix: select) -### [`selections.trimWhitespace`](../selections.ts#L540-L547) +### [`selections.trimWhitespace`](../selections.ts#L538-L545) Trim whitespace. @@ -1559,11 +1580,12 @@ Trim whitespace at beginning and end of selections. -Default keybinding: `_` (kakoune: normal) +Default keybinding: `_` (core: normal) +`_` (helix: select) -### [`selections.reduce`](../selections.ts#L566-L585) +### [`selections.reduce`](../selections.ts#L564-L583) Reduce selections to their cursor. @@ -1579,11 +1601,12 @@ This command: - takes an argument `empty` of type `boolean`. - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | "both"`. -Default keybinding: `;` (kakoune: normal) +Default keybinding: `;` (core: normal) +`;` (helix: select) -### [`selections.changeDirection`](../selections.ts#L647-L662) +### [`selections.changeDirection`](../selections.ts#L645-L660) Change direction of selections. @@ -1597,11 +1620,12 @@ Change direction of selections. | Backward selections | `faceBackward` | | `[".selections.changeDirection", { direction: -1 }]` | -Default keybinding: `a-;` (kakoune: normal) +Default keybinding: `a-;` (core: normal) +`a-;` (helix: select) -### [`selections.changeOrder`](../selections.ts#L687-L701) +### [`selections.changeOrder`](../selections.ts#L685-L699) Reverse selections. @@ -1615,7 +1639,7 @@ Reverse selections. -### [`selections.sort`](../selections.ts#L714-L726) +### [`selections.sort`](../selections.ts#L712-L724) Sort selections. @@ -1626,7 +1650,7 @@ This command: -### [`selections.copy`](../selections.ts#L799-L817) +### [`selections.copy`](../selections.ts#L797-L815) Copy selections below. @@ -1644,7 +1668,7 @@ Default keybinding: `s-c` (kakoune: normal) -### [`selections.merge`](../selections.ts#L851-L856) +### [`selections.merge`](../selections.ts#L849-L854) Merge contiguous selections. @@ -1654,13 +1678,13 @@ Default keybinding: `a-_` (kakoune: normal) -### [`selections.open`](../selections.ts#L860-L863) +### [`selections.open`](../selections.ts#L858-L861) Open selected file. -### [`selections.toggleIndices`](../selections.ts#L876-L893) +### [`selections.toggleIndices`](../selections.ts#L874-L891) Toggle selection indices. @@ -1703,38 +1727,42 @@ Default keybinding: `a-)` (kakoune: normal) -### [`selections.rotate.contents`](../selections.rotate.ts#L28-L37) +### [`selections.rotate.contents`](../selections.rotate.ts#L28-L39) Rotate selections clockwise (contents only). + The following command is also available: -| Title | Identifier | Command | -| --------------------------------------------------- | ------------------ | ---------------------------------------------------- | -| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `[".selections.rotate.contents", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | +| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. +Default keybinding: `a-)` (helix: normal) +`a-)` (helix: select) + -### [`selections.rotate.selections`](../selections.rotate.ts#L45-L56) +### [`selections.rotate.selections`](../selections.rotate.ts#L47-L58) Rotate selections clockwise (selections only). The following keybinding is also available: -| Title | Identifier | Keybinding | Command | -| ----------------------------------------------------- | -------------------- | --------------------- | ------------------------------------------------------ | -| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (kakoune: normal) | `[".selections.rotate.selections", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------------------------------------- | -------------------- | --------------------------------------- | ------------------------------------------------------ | +| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal), `(` (helix: select) | `[".selections.rotate.selections", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. -Default keybinding: `)` (kakoune: normal) +Default keybinding: `)` (core: normal) ## [`view`](../view.ts) @@ -1742,10 +1770,10 @@ Moving the editor view. #### Predefined keybindings -| Title | Keybinding | Command | -| ----------------------- | ----------------------- | ---------------------------------------------------- | -| Show view menu | `v` (kakoune: normal) | `[".openMenu", { menu: "view", ... }]` | -| Show view menu (locked) | `s-v` (kakoune: normal) | `[".openMenu", { menu: "view", locked: true, ... }]` | +| Title | Keybinding | Command | +| ----------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- | +| Show view menu | `v` (kakoune: normal), `z` (helix: normal), `z` (helix: select) | `[".openMenu", { menu: "view", ... }]` | +| Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal), `s-z` (helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index 1c5830ea..563a19d4 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -12,47 +12,47 @@ devdev.copyLastErrorMessageCopies the last encountered error message dev.setSelectionBehaviorSet the selection behavior of the specified mode editedit.alignAlign selectionsShift+7 (editorTextFocus && dance.mode == 'normal') -edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal') -edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal') -edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal') -edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.mode == 'normal') -edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.mode == 'normal') -edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal') -edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal') -edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.mode == 'normal') -edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal') -edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal') -edit.paste.afterPaste after +edit.case.swapSwap caseAlt+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.paste.afterPaste afterP (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') edit.paste.after.selectPaste after and selectP (editorTextFocus && dance.mode == 'normal') -edit.paste.beforePaste before +edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') edit.paste.before.selectPaste before and selectShift+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.afterPaste all after -edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.mode == 'normal') +edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') edit.pasteAll.beforePaste all before -edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.mode == 'normal') -edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.mode == 'insert') -edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.mode == 'select') -edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.mode == 'select') -edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') -edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal') -edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal') -edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal') -edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal') -edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') -edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.mode == 'normal') +edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') edit.replaceCharactersReplace charactersR (editorTextFocus && dance.mode == 'normal') -historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal') +historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal')Alt+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') history.repeat.selectionRepeat last selection change -history.recording.playReplay recordingQ (editorTextFocus && dance.mode == 'normal') -history.recording.startStart recordingShift+Q (editorTextFocus && dance.mode == 'normal' && !dance.isRecording) -history.recording.stopStop recordingEscape (editorTextFocus && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.mode == 'normal' && dance.isRecording) -history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.mode == 'select') -history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.mode == 'normal') +history.recording.playReplay recordingQ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +history.recording.startStart recordingShift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && !dance.isRecording) +history.recording.stopStop recordingEscape (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording) +history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') history.repeatRepeat last change history.repeat.editRepeat last edit without a command. (editorTextFocus && dance.mode == 'normal')NumPad_Decimal (editorTextFocus && dance.mode == 'normal') -history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.mode == 'select') -history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.mode == 'normal') +history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') keybindingskeybindings.setupSet up Dance keybindings misccancelCancel Dance operationEscape (editorTextFocus && dance.mode == 'normal' && !dance.isRecording && !markersNavigationVisible)Escape (editorTextFocus && dance.mode == 'input') changeInputChange current input @@ -64,70 +64,70 @@ selections are empty selectRegisterSelect register for next commandShift+' (editorTextFocus && dance.mode == 'normal') updateCountUpdate Dance count updateRegisterUpdate the contents of a register -modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal') -modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal') -modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal') -modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal') +modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal')A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal')I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal')Shift+A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal')Shift+I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') modes.set.insertSet mode to Insert -modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.mode == 'select') -modes.set.selectSet mode to Select -modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.mode == 'normal') -modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.mode == 'insert') +modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')V (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modes.set.selectSet mode to SelectV (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') modes.setSet Dance mode modes.set.temporarilySet Dance mode temporarily searchsearch.nextSelect next matchN (editorTextFocus && dance.mode == 'normal') search.searchSearch/ (editorTextFocus && dance.mode == 'normal')NumPad_Divide (editorTextFocus && dance.mode == 'normal') -search.backwardSearch backwardAlt+/ (editorTextFocus && dance.mode == 'normal') -search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.mode == 'normal') -search.extendSearch (extend)Shift+/ (editorTextFocus && dance.mode == 'normal') -search.next.addAdd next matchShift+N (editorTextFocus && dance.mode == 'normal') -search.previousSelect previous matchAlt+N (editorTextFocus && dance.mode == 'normal') -search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.mode == 'normal') +search.backwardSearch backwardAlt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.extendSearch (extend)Shift+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.next.addAdd next matchShift+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.previousSelect previous matchAlt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') search.selection.smartSearch current selection (smart)Shift+8 (editorTextFocus && dance.mode == 'normal')NumPad_Multiply (editorTextFocus && dance.mode == 'normal') search.selectionSearch current selectionShift+Alt+8 (editorTextFocus && dance.mode == 'normal')Alt+NumPad_Multiply (editorTextFocus && dance.mode == 'normal') -seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.mode == 'normal') +seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') seek.leapLeap forward seek.objectSelect object seek.seekSelect to character (excluded)T (editorTextFocus && dance.mode == 'normal') -seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.mode == 'normal')Alt+A (editorTextFocus && dance.mode == 'insert') -seek.askObject.endSelect to whole object end] (editorTextFocus && dance.mode == 'normal') -seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.mode == 'normal') -seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.mode == 'normal')Alt+I (editorTextFocus && dance.mode == 'insert') -seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.mode == 'normal') -seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.mode == 'normal') -seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.mode == 'normal') -seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.mode == 'normal') -seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.mode == 'normal') -seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.mode == 'normal') -seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.mode == 'normal') -seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.mode == 'normal') -seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.mode == 'normal') -seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.mode == 'normal') -seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.mode == 'normal')T (editorTextFocus && dance.mode == 'select') -seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.mode == 'normal')Shift+T (editorTextFocus && dance.mode == 'select') +seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +seek.askObject.endSelect to whole object end] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.includedSelect to character (included)F (editorTextFocus && dance.mode == 'normal') -seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.mode == 'normal') -seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.mode == 'normal')F (editorTextFocus && dance.mode == 'select') -seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.mode == 'normal')Shift+F (editorTextFocus && dance.mode == 'select') +seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.leap.backwardLeap backward seek.syntax.child.experimentalSelect child syntax object seek.syntax.next.experimentalSelect next syntax object seek.syntax.parent.experimentalSelect parent syntax object seek.syntax.previous.experimentalSelect previous syntax object seek.word.backwardSelect to previous word startB (editorTextFocus && dance.mode == 'normal') -seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.mode == 'normal')W (editorTextFocus && dance.mode == 'select') -seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.mode == 'normal')B (editorTextFocus && dance.mode == 'select') -seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.mode == 'normal') -seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.mode == 'normal') -seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.mode == 'normal')Shift+W (editorTextFocus && dance.mode == 'select') -seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.mode == 'normal')Shift+B (editorTextFocus && dance.mode == 'select') +seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.wordEndSelect to next word endE (editorTextFocus && dance.mode == 'normal') -seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.mode == 'normal')E (editorTextFocus && dance.mode == 'select') -seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.mode == 'normal') -seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'select') +seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') +seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') seek.syntax.experimentalSelect syntax object seek.wordSelect to next word startW (editorTextFocus && dance.mode == 'normal') -selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal') +selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') select.firstVisibleLineSelect to first visible line select.horizontallySelect horizontally select.lastLineSelect to last line @@ -135,82 +135,82 @@ selections are empty select.line.aboveSelect line above select.line.above.extendExtend to line above select.line.belowSelect line below -select.line.below.extendExtend to line below -select.lineEndSelect to line endAlt+L (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') -select.lineStartSelect to line startAlt+H (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') +select.line.below.extendExtend to line belowX (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineEndSelect to line endAlt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') +select.lineStartSelect to line startAlt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') select.middleVisibleLineSelect to middle visible line -select.documentEnd.extendExtend to last character -select.documentEnd.jumpJump to last character -select.down.extendExtend downShift+J (editorTextFocus && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.mode == 'normal')J (editorTextFocus && dance.mode == 'select')Down (editorTextFocus && dance.mode == 'select') +select.documentEnd.extendExtend to last character +select.documentEnd.jumpJump to last character +select.down.extendExtend downShift+J (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Down (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') select.down.jumpJump downJ (editorTextFocus && dance.mode == 'normal')Down (editorTextFocus && dance.mode == 'normal') -select.firstLine.extendExtend to first line -select.firstLine.jumpJump to first line -select.firstVisibleLine.extendExtend to first visible line -select.firstVisibleLine.jumpJump to first visible line -select.lastLine.extendExtend to last line -select.lastLine.jumpJump to last line -select.lastVisibleLine.extendExtend to last visible line -select.lastVisibleLine.jumpJump to last visible line -select.left.extendExtend leftShift+H (editorTextFocus && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.mode == 'normal')H (editorTextFocus && dance.mode == 'select')Left (editorTextFocus && dance.mode == 'select') -select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') -select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal') -select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal') -select.lineStart.jumpJump to line start -select.lineStart.skipBlank.extendExtend to line start (skip blank) -select.lineStart.skipBlank.jumpJump to line start (skip blank) -select.middleVisibleLine.extendExtend to middle visible line -select.middleVisibleLine.jumpJump to middle visible line -select.right.extendExtend rightShift+L (editorTextFocus && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.mode == 'normal')L (editorTextFocus && dance.mode == 'select')Right (editorTextFocus && dance.mode == 'select') -select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') -select.to.extendExtend toShift+G (editorTextFocus && dance.mode == 'normal')G (editorTextFocus && dance.mode == 'select') -select.to.jumpGo toG (editorTextFocus && dance.mode == 'normal') -select.up.extendExtend upShift+K (editorTextFocus && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.mode == 'normal')K (editorTextFocus && dance.mode == 'select')Up (editorTextFocus && dance.mode == 'select') +select.firstLine.extendExtend to first line +select.firstLine.jumpJump to first line +select.firstVisibleLine.extendExtend to first visible line +select.firstVisibleLine.jumpJump to first visible line +select.lastLine.extendExtend to last line +select.lastLine.jumpJump to last line +select.lastVisibleLine.extendExtend to last visible line +select.lastVisibleLine.jumpJump to last visible line +select.left.extendExtend leftShift+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')H (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Left (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') +select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+End (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineStart.jumpJump to line start +select.lineStart.skipBlank.extendExtend to line start (skip blank) +select.lineStart.skipBlank.jumpJump to line start (skip blank) +select.middleVisibleLine.extendExtend to middle visible line +select.middleVisibleLine.jumpJump to middle visible line +select.right.extendExtend rightShift+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')L (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Right (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') +select.to.extendExtend toShift+G (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')G (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.to.jumpGo toG (editorTextFocus && dance.mode == 'normal') +select.up.extendExtend upShift+K (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Up (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') select.up.jumpJump upK (editorTextFocus && dance.mode == 'normal')Up (editorTextFocus && dance.mode == 'normal') select.toSelect to select.verticallySelect vertically -selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal') +selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.changeOrderReverse selections -selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal') -selections.expandToLinesExpand to linesX (editorTextFocus && dance.mode == 'normal') -selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal') -selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.mode == 'normal') +selections.copyCopy selections belowShift+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.expandToLinesExpand to linesX (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') selections.openOpen selected file -selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal') -selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal') -selections.restoreRestore selectionsZ (editorTextFocus && dance.mode == 'normal') -selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.mode == 'normal') -selections.saveSave selectionsShift+Z (editorTextFocus && dance.mode == 'normal') -selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal') +selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal')Shift+Alt+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal'); (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.restoreRestore selectionsZ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.saveSave selectionsShift+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.selectSelect within selections -selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal') -selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal') -selections.faceBackwardBackward selections -selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') -selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal') -selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal') -selections.hideIndicesHide selection indices -selections.orderAscendingOrder selections ascending -selections.orderDescendingOrder selections descending -selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal') -selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal') -selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal') -selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') -selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal') -selections.showIndicesShow selection indices -selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal') +selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.faceBackwardBackward selections +selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.hideIndicesHide selection indices +selections.orderAscendingOrder selections ascending +selections.orderDescendingOrder selections descending +selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.showIndicesShow selection indices +selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.sortSort selections -selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal') +selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries -selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal') -selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal') -selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal') -selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') -selections.rotate.contentsRotate selections clockwise (contents only) +selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.behavior == 'dance' && dance.mode == 'normal') +selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal') -selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.mode == 'normal') -selections.rotate.contents.reverseRotate selections counter-clockwise (contents only) -selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal') +selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') viewview.lineReveals a position based on the main cursor @@ -268,18 +268,18 @@ Specify `all` to paste all contents next to each selection. | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | -| Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | -| Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | -| Paste before and select | `paste.before.select` | `s-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | -| Paste after and select | `paste.after.select` | `p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | +| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | +| Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | +| Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | +| Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | -| Delete | `delete` | `a-d` (kakoune: normal) | `[".edit.insert", { register: "_", ... }]` | +| Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | -| Copy and delete | `yank-delete` | `d` (kakoune: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | -| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (kakoune: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | +| Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | +| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | This command: @@ -304,7 +304,8 @@ Join lines. This command: - takes an argument `separator` of type `string`. -Default keybinding: `a-j` (kakoune: normal) +Default keybinding: `a-j` (core: normal) +`s-j` (helix: select) @@ -316,7 +317,8 @@ Join lines and select inserted separators. This command: - takes an argument `separator` of type `string`. -Default keybinding: `s-a-j` (kakoune: normal) +Default keybinding: `s-a-j` (core: normal) +`s-a-j` (helix: select) @@ -328,7 +330,8 @@ Indent selected lines. This command: - may be repeated with a given number of repetitions. -Default keybinding: `>` (kakoune: normal) +Default keybinding: `>` (core: normal) +`>` (helix: select) @@ -364,7 +367,8 @@ Deindent selected lines (including incomplete indent). This command: - may be repeated with a given number of repetitions. -Default keybinding: `<` (kakoune: normal) +Default keybinding: `<` (core: normal) +`<` (helix: select) @@ -374,7 +378,8 @@ Transform to lower case. -Default keybinding: `` ` `` (kakoune: normal) +Default keybinding: `` ` `` (core: normal) +`` ` `` (helix: select) @@ -385,6 +390,8 @@ Transform to upper case. Default keybinding: `` s-` `` (kakoune: normal) +`` a-` `` (helix: normal) +`` a-` `` (helix: select) @@ -395,6 +402,8 @@ Swap case. Default keybinding: `` a-` `` (kakoune: normal) +`` s-` `` (helix: normal) +`` s-` `` (helix: select) @@ -407,7 +416,7 @@ This command: - may be repeated with a given number of repetitions. - takes an input `input` of type `string`. -Default keybinding: `r` (kakoune: normal) +Default keybinding: `r` (core: normal) @@ -422,7 +431,7 @@ before the first character of each selection. This command: - takes an argument `fill` of type `string`. -Default keybinding: `&` (kakoune: normal) +Default keybinding: `&` (core: normal) @@ -451,9 +460,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | ----------------------- | --------------------------------------------------------------------------------- | -| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (kakoune: normal) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | +| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -473,9 +482,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | --------------------- | --------------------------------------------------------------------------------- | -| Insert new line below and switch to insert | `newLine.below.insert` | `o` (kakoune: normal) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | +| Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -497,7 +506,7 @@ Undo. This command: - does not require an active text editor. -Default keybinding: `u` (kakoune: normal) +Default keybinding: `u` (core: normal) `u` (helix: select) @@ -510,7 +519,7 @@ Redo. This command: - does not require an active text editor. -Default keybinding: `s-u` (kakoune: normal) +Default keybinding: `s-u` (core: normal) `s-u` (helix: select) @@ -544,10 +553,10 @@ Default keybinding: `s-a-u` (kakoune: normal) Repeat last change. -| Title | Identifier | Keybinding | Commands | -| ---------------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------- | -| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | -| Repeat last seek | `repeat.seek` | `a-.` (kakoune: normal) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | +| Title | Identifier | Keybinding | Commands | +| ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | +| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | +| Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | This command: - may be repeated with a given number of repetitions. @@ -563,8 +572,8 @@ Repeat last edit without a command. This command: - may be repeated with a given number of repetitions. -Default keybinding: `.` (kakoune: normal) -`NumPad_Decimal` (kakoune: normal) +Default keybinding: `.` (core: normal) +`NumPad_Decimal` (core: normal) @@ -776,7 +785,7 @@ current document. This command: - takes an input `register` of type `string | Register`. -Default keybinding: `"` (kakoune: normal) +Default keybinding: `"` (core: normal) @@ -883,20 +892,20 @@ Set Dance mode. #### Variants -| Title | Identifier | Keybinding | Command | -| ------------------ | ------------ | ---------------------------------------------------- | ----------------------------------------------------------- | -| Set mode to Normal | `set.normal` | `escape` (kakoune: insert), `escape` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | -| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | -| Set mode to Select | `set.select` | | `[".modes.set", { mode: "select" }]` | +| Title | Identifier | Keybinding | Command | +| ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | +| Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | +| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | +| Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | Other variants are provided to switch to insert mode: -| Title | Identifier | Keybinding | Commands | -| -------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Insert before | `insert.before` | `i` (kakoune: normal) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert after | `insert.after` | `a` (kakoune: normal) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | -| Insert at line start | `insert.lineStart` | `s-i` (kakoune: normal) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert at line end | `insert.lineEnd` | `s-a` (kakoune: normal) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | This command: @@ -931,11 +940,11 @@ Search for patterns and replace or add selections. Search. -| Title | Identifier | Keybinding | Command | -| ------------------------ | ----------------- | ----------------------- | ------------------------------------------------------ | -| Search (extend) | `extend` | `?` (kakoune: normal) | `[".search", { shift: "extend", ... }]` | -| Search backward | `backward` | `a-/` (kakoune: normal) | `[".search", { direction: -1 , ... }]` | -| Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal) | `[".search", { direction: -1, shift: "extend", ... }]` | +| Title | Identifier | Keybinding | Command | +| ------------------------ | ----------------- | -------------------------------------------- | ------------------------------------------------------ | +| Search (extend) | `extend` | `?` (kakoune: normal), `/` (helix: select) | `[".search", { shift: "extend", ... }]` | +| Search backward | `backward` | `a-/` (kakoune: normal), `?` (helix: normal) | `[".search", { direction: -1 , ... }]` | +| Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal), `?` (helix: select) | `[".search", { direction: -1, shift: "extend", ... }]` | This command: - accepts a register (by default, it uses `slash`). @@ -944,8 +953,8 @@ This command: - takes an argument `add` of type `boolean`. - takes an argument `interactive` of type `boolean`. -Default keybinding: `/` (kakoune: normal) -`NumPad_Divide` (kakoune: normal) +Default keybinding: `/` (core: normal) +`NumPad_Divide` (core: normal) @@ -954,16 +963,16 @@ Default keybinding: `/` (kakoune: normal) Search current selection. -| Title | Identifier | Keybinding | Command | -| -------------------------------- | ----------------- | ---------------------------------------------------------- | --------------------------------------------------- | -| Search current selection (smart) | `selection.smart` | `*` (kakoune: normal), `NumPad_Multiply` (kakoune: normal) | `[".search.selection", { smart: true, +register }]` | +| Title | Identifier | Keybinding | Command | +| -------------------------------- | ----------------- | ---------------------------------------------------- | --------------------------------------------------- | +| Search current selection (smart) | `selection.smart` | `*` (core: normal), `NumPad_Multiply` (core: normal) | `[".search.selection", { smart: true, +register }]` | This command: - accepts a register (by default, it uses `slash`). - takes an argument `smart` of type `boolean`. -Default keybinding: `a-*` (kakoune: normal) -`a-NumPad_Multiply` (kakoune: normal) +Default keybinding: `a-*` (core: normal) +`a-NumPad_Multiply` (core: normal) @@ -972,18 +981,18 @@ Default keybinding: `a-*` (kakoune: normal) Select next match. -| Title | Identifier | Keybinding | Command | -| --------------------- | -------------- | ------------------------- | ----------------------------------------------------- | -| Add next match | `next.add` | `s-n` (kakoune: normal) | `[".search.next", { add: true, ... }]` | -| Select previous match | `previous` | `a-n` (kakoune: normal) | `[".search.next", { direction: -1 , ... }]` | -| Add previous match | `previous.add` | `s-a-n` (kakoune: normal) | `[".search.next", { direction: -1, add: true, ... }]` | +| Title | Identifier | Keybinding | Command | +| --------------------- | -------------- | ------------------------------------------------ | ----------------------------------------------------- | +| Add next match | `next.add` | `s-n` (kakoune: normal), `n` (helix: select) | `[".search.next", { add: true, ... }]` | +| Select previous match | `previous` | `a-n` (kakoune: normal), `s-n` (helix: normal) | `[".search.next", { direction: -1 , ... }]` | +| Add previous match | `previous.add` | `s-a-n` (kakoune: normal), `s-n` (helix: select) | `[".search.next", { direction: -1, add: true, ... }]` | This command: - accepts a register (by default, it uses `slash`). - may be repeated with a given number of repetitions. - takes an argument `add` of type `boolean`. -Default keybinding: `n` (kakoune: normal) +Default keybinding: `n` (core: normal) ## [`seek`](../seek.ts) @@ -1001,11 +1010,11 @@ Select to character (excluded). | Title | Identifier | Keybinding | Command | | ---------------------------------------- | -------------------------- | ------------------------------------------------ | ------------------------------------------------------------------- | | Extend to character (excluded) | `extend` | `s-t` (kakoune: normal), `t` (helix: select) | `[".seek", { shift: "extend" , ... }]` | -| Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal) | `[".seek", { direction: -1, ... }]` | +| Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal), `s-t` (helix: normal) | `[".seek", { direction: -1, ... }]` | | Extend to character (excluded, backward) | `extend.backward` | `s-a-t` (kakoune: normal), `s-t` (helix: select) | `[".seek", { shift: "extend", direction: -1, ... }]` | -| Select to character (included) | `included` | `f` (kakoune: normal) | `[".seek", { include: true , ... }]` | +| Select to character (included) | `included` | `f` (core: normal) | `[".seek", { include: true , ... }]` | | Extend to character (included) | `included.extend` | `s-f` (kakoune: normal), `f` (helix: select) | `[".seek", { include: true, shift: "extend" , ... }]` | -| Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal) | `[".seek", { include: true, direction: -1, ... }]` | +| Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal), `s-f` (helix: normal) | `[".seek", { include: true, direction: -1, ... }]` | | Extend to character (included, backward) | `included.extend.backward` | `s-a-f` (kakoune: normal), `s-f` (helix: select) | `[".seek", { include: true, shift: "extend", direction: -1, ... }]` | This command: @@ -1013,7 +1022,7 @@ This command: - takes an argument `include` of type `boolean`. - takes an input `input` of type `string`. -Default keybinding: `t` (kakoune: normal) +Default keybinding: `t` (core: normal) @@ -1050,15 +1059,15 @@ Select the word and following whitespaces on the right of the end of each select | Title | Identifier | Keybinding | Command | | -------------------------------------------- | ------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------- | | Extend to next word start | `word.extend` | `s-w` (kakoune: normal), `w` (helix: select) | `[".seek.word", { shift: "extend" , ... }]` | -| Select to previous word start | `word.backward` | `b` (kakoune: normal) | `[".seek.word", { direction: -1, ... }]` | +| Select to previous word start | `word.backward` | `b` (core: normal) | `[".seek.word", { direction: -1, ... }]` | | Extend to previous word start | `word.extend.backward` | `s-b` (kakoune: normal), `b` (helix: select) | `[".seek.word", { shift: "extend", direction: -1, ... }]` | -| Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal) | `[".seek.word", { ws: true , ... }]` | +| Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal), `s-w` (helix: normal) | `[".seek.word", { ws: true , ... }]` | | Extend to next non-whitespace word start | `word.ws.extend` | `s-a-w` (kakoune: normal), `s-w` (helix: select) | `[".seek.word", { ws: true, shift: "extend" , ... }]` | -| Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | +| Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal), `s-b` (helix: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | | Extend to previous non-whitespace word start | `word.ws.extend.backward` | `s-a-b` (kakoune: normal), `s-b` (helix: select) | `[".seek.word", { ws: true, shift: "extend", direction: -1, ... }]` | -| Select to next word end | `wordEnd` | `e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | +| Select to next word end | `wordEnd` | `e` (core: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | | Extend to next word end | `wordEnd.extend` | `s-e` (kakoune: normal), `e` (helix: select) | `[".seek.word", { stopAtEnd: true , shift: "extend" , ... }]` | -| Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | +| Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal), `s-e` (helix: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | | Extend to next non-whitespace word end | `wordEnd.ws.extend` | `s-a-e` (kakoune: normal), `s-e` (helix: select) | `[".seek.word", { stopAtEnd: true , ws: true, shift: "extend" , ... }]` | This command: @@ -1066,7 +1075,7 @@ This command: - takes an argument `stopAtEnd` of type `boolean`. - takes an argument `ws` of type `boolean`. -Default keybinding: `w` (kakoune: normal) +Default keybinding: `w` (core: normal) @@ -1159,28 +1168,32 @@ Default keybinding: `%` (kakoune: normal) -### [`select.vertically`](../select.ts#L31-L64) +### [`select.vertically`](../select.ts#L31-L68) Select vertically. #### Variants -| Title | Identifier | Keybinding | Command | +| Title | Identifier | Keybinding | Command | | ----------- | ------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | -| Jump down | `down.jump` | `j` (kakoune: normal) , `down` (kakoune: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | +| Jump down | `down.jump` | `j` (core: normal) , `down` (core: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | | Extend down | `down.extend` | `s-j` (kakoune: normal), `s-down` (kakoune: normal), `j` (helix: select), `down` (helix: select) | `[".select.vertically", { direction: 1, shift: "extend", ... }]` | -| Jump up | `up.jump` | `k` (kakoune: normal) , `up` (kakoune: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | +| Jump up | `up.jump` | `k` (core: normal) , `up` (core: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | | Extend up | `up.extend` | `s-k` (kakoune: normal), `s-up` (kakoune: normal) , `k` (helix: select), `up` (helix: select) | `[".select.vertically", { direction: -1, shift: "extend", ... }]` | The following keybindings are also defined: -| Keybinding | Command | -| ------------------------------------------------ | -------------------------------------------------------------------------- | -| `c-f` (kakoune: normal), `c-f` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | -| `c-d` (kakoune: normal), `c-d` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | -| `c-b` (kakoune: normal), `c-b` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | -| `c-u` (kakoune: normal), `c-u` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | +| Keybinding | Command | +| -------------------------------------------| ---------------------------------------------------------------------------- | +| `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | +| `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | +| `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | +| `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | +| `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | +| `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | +| `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | +| `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | This command: - may be repeated with a given number of repetitions. @@ -1189,7 +1202,7 @@ This command: -### [`select.horizontally`](../select.ts#L217-L239) +### [`select.horizontally`](../select.ts#L221-L243) Select horizontally. @@ -1198,9 +1211,9 @@ Select horizontally. | Title | Identifier | Keybinding | Command | | ------------ | -------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | -| Jump right | `right.jump` | `l` (kakoune: normal) , `right` (kakoune: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | +| Jump right | `right.jump` | `l` (core: normal) , `right` (core: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | | Extend right | `right.extend` | `s-l` (kakoune: normal), `s-right` (kakoune: normal), `l` (helix: select), `right` (helix: select) | `[".select.horizontally", { direction: 1, shift: "extend", ... }]` | -| Jump left | `left.jump` | `h` (kakoune: normal) , `left` (kakoune: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | +| Jump left | `left.jump` | `h` (core: normal) , `left` (core: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | | Extend left | `left.extend` | `s-h` (kakoune: normal), `s-left` (kakoune: normal), `h` (helix: select), `left` (helix: select) | `[".select.horizontally", { direction: -1, shift: "extend", ... }]` | This command: @@ -1209,7 +1222,7 @@ This command: -### [`select.to`](../select.ts#L286-L304) +### [`select.to`](../select.ts#L290-L308) Select to. @@ -1220,7 +1233,7 @@ line. If no count is specified, this command will shift open the `goto` menu. | Title | Identifier | Keybinding | Command | | --------- | ----------- | -------------------------------------------- | ------------------------------------------ | -| Go to | `to.jump` | `g` (kakoune: normal) | `[".select.to", { shift: "jump" , ... }]` | +| Go to | `to.jump` | `g` (core: normal) | `[".select.to", { shift: "jump" , ... }]` | | Extend to | `to.extend` | `s-g` (kakoune: normal), `g` (helix: select) | `[".select.to", { shift: "extend", ... }]` | This command: @@ -1229,7 +1242,7 @@ This command: -### [`select.line.below`](../select.ts#L314-L317) +### [`select.line.below`](../select.ts#L318-L321) Select line below. @@ -1238,16 +1251,19 @@ This command: -### [`select.line.below.extend`](../select.ts#L342-L345) +### [`select.line.below.extend`](../select.ts#L346-L350) Extend to line below. This command: - may be repeated with a given number of repetitions. +Default keybinding: `x` (helix: normal) +`x` (helix: select) + -### [`select.line.above`](../select.ts#L372-L375) +### [`select.line.above`](../select.ts#L377-L380) Select line above. @@ -1256,7 +1272,7 @@ This command: -### [`select.line.above.extend`](../select.ts#L399-L402) +### [`select.line.above.extend`](../select.ts#L404-L407) Extend to line above. @@ -1265,32 +1281,32 @@ This command: -### [`select.lineStart`](../select.ts#L448-L470) +### [`select.lineStart`](../select.ts#L453-L475) Select to line start. #### Variants -| Title | Identifier | Keybinding | Command | -| -------------------- | ------------------ | ----------------------------------------------------- | ------------------------------------------------------------------ | -| Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | -| Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal) | `[".select.lineStart", { shift: "extend", ... }]` | -| Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | -| Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | -| Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | -| Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | +| Title | Identifier | Keybinding | Command | +| -------------------- | ------------------ | ----------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | +| Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal), `home` (helix: select) | `[".select.lineStart", { shift: "extend", ... }]` | +| Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | +| Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | +| Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | +| Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `skipBlank` of type `boolean`. Default keybinding: `a-h` (kakoune: normal) -`home` (kakoune: normal) +`home` (core: normal) -### [`select.lineEnd`](../select.ts#L495-L517) +### [`select.lineEnd`](../select.ts#L500-L522) Select to line end. @@ -1298,22 +1314,22 @@ Select to line end. #### Variants -| Title | Identifier | Keybinding | Command | -| ------------------------ | -------------------- | ---------------------------------------------------- | --------------------------------------------------------------- | -| Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal) | `[".select.lineEnd", { shift: "extend", ... }]` | -| Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | -| Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | +| Title | Identifier | Keybinding | Command | +| ------------------------ | -------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------- | +| Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal), `end` (helix: select) | `[".select.lineEnd", { shift: "extend", ... }]` | +| Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | +| Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `lineBreak` of type `boolean`. Default keybinding: `a-l` (kakoune: normal) -`end` (kakoune: normal) +`end` (core: normal) -### [`select.lastLine`](../select.ts#L545-L555) +### [`select.lastLine`](../select.ts#L550-L560) Select to last line. @@ -1326,7 +1342,7 @@ Select to last line. -### [`select.firstVisibleLine`](../select.ts#L566-L576) +### [`select.firstVisibleLine`](../select.ts#L571-L581) Select to first visible line. @@ -1339,7 +1355,7 @@ Select to first visible line. -### [`select.middleVisibleLine`](../select.ts#L583-L593) +### [`select.middleVisibleLine`](../select.ts#L588-L598) Select to middle visible line. @@ -1352,7 +1368,7 @@ Select to middle visible line. -### [`select.lastVisibleLine`](../select.ts#L600-L610) +### [`select.lastVisibleLine`](../select.ts#L605-L615) Select to last visible line. @@ -1377,7 +1393,8 @@ Copy selections text. This command: - accepts a register (by default, it uses `dquote`). -Default keybinding: `y` (kakoune: normal) +Default keybinding: `y` (core: normal) +`y` (helix: select) @@ -1430,45 +1447,44 @@ Default keybinding: `a-z` (kakoune: normal) -### [`selections.pipe`](../selections.ts#L241-L263) +### [`selections.pipe`](../selections.ts#L241-L262) Pipe selections. Run the specified command or code with the contents of each selection, and save the result to a register. - See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes-through-external-programs #### Additional commands -| Title | Identifier | Keybinding | Commands | -| ------------------- | -------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| Pipe and replace | `pipe.replace` | `\|` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | -| Pipe and append | `pipe.append` | `!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | -| Pipe and prepend | `pipe.prepend` | `a-!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Pipe and replace | `pipe.replace` | `\|` (core: normal), `\|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | +| Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | +| Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | This command: - accepts a register (by default, it uses `pipe`). - takes an input `expression` of type `string`. -Default keybinding: `a-|` (kakoune: normal) +Default keybinding: `a-|` (core: normal) +`a-|` (helix: select) -### [`selections.filter`](../selections.ts#L291-L313) +### [`selections.filter`](../selections.ts#L290-L311) Filter selections. - #### Variants -| Title | Identifier | Keybinding | Commands | -| -------------------------- | ----------------------- | --------------------------| ------------------------------------------------------------------------ | -| Keep matching selections | `filter.regexp` | `a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/" , ... }]` | -| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | -| Clear secondary selections | `clear.secondary` | `,` (kakoune: normal) | `[".selections.filter", { expression: "i === count" , ... }]` | -| Clear main selections | `clear.main` | `a-,` (kakoune: normal) | `[".selections.filter", { expression: "i !== count" , ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | +| Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | +| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | +| Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | +| Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | This command: - accepts an argument of type `{ expression?: string }`. @@ -1477,19 +1493,20 @@ This command: - takes an argument `interactive` of type `boolean`. - takes an argument `inverse` of type `boolean`. -Default keybinding: `$` (kakoune: normal) +Default keybinding: `$` (core: normal) +`$` (helix: select) -### [`selections.select`](../selections.ts#L346-L360) +### [`selections.select`](../selections.ts#L344-L358) Select within selections. #### Variants -| Title | Identifier | Keybinding | Command | -| -------------- | --------------- | --------------------- | ------------------------------------------------------------------------------------------------- | -| Leap or select | `select.orLeap` | `s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | +| Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | This command: - accepts an argument of type `{ re?: string | RegExp }`. @@ -1497,7 +1514,7 @@ This command: -### [`selections.split`](../selections.ts#L379-L390) +### [`selections.split`](../selections.ts#L377-L388) Split selections. @@ -1507,19 +1524,20 @@ This command: - takes an argument `excludeEmpty` of type `boolean`. - takes an argument `interactive` of type `boolean`. -Default keybinding: `s-s` (kakoune: normal) +Default keybinding: `s-s` (core: normal) +`s-s` (helix: select) -### [`selections.splitLines`](../selections.ts#L415-L431) +### [`selections.splitLines`](../selections.ts#L413-L429) Split selections at line boundaries. #### Variants -| Title | Identifier | Keybinding | Command | -| ----------------------- | ---------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------- | -| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | This command: - may be repeated with a given number of repetitions. @@ -1527,7 +1545,7 @@ This command: -### [`selections.expandToLines`](../selections.ts#L474-L481) +### [`selections.expandToLines`](../selections.ts#L472-L479) Expand to lines. @@ -1536,10 +1554,12 @@ Expand selections to contain full lines (including end-of-line characters). Default keybinding: `x` (kakoune: normal) +`s-x` (helix: normal) +`s-x` (helix: select) -### [`selections.trimLines`](../selections.ts#L508-L515) +### [`selections.trimLines`](../selections.ts#L506-L513) Trim lines. @@ -1547,11 +1567,12 @@ Trim selections to only contain full lines (from start to line break). -Default keybinding: `a-x` (kakoune: normal) +Default keybinding: `a-x` (core: normal) +`a-x` (helix: select) -### [`selections.trimWhitespace`](../selections.ts#L540-L547) +### [`selections.trimWhitespace`](../selections.ts#L538-L545) Trim whitespace. @@ -1559,11 +1580,12 @@ Trim whitespace at beginning and end of selections. -Default keybinding: `_` (kakoune: normal) +Default keybinding: `_` (core: normal) +`_` (helix: select) -### [`selections.reduce`](../selections.ts#L566-L585) +### [`selections.reduce`](../selections.ts#L564-L583) Reduce selections to their cursor. @@ -1579,11 +1601,12 @@ This command: - takes an argument `empty` of type `boolean`. - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | "both"`. -Default keybinding: `;` (kakoune: normal) +Default keybinding: `;` (core: normal) +`;` (helix: select) -### [`selections.changeDirection`](../selections.ts#L647-L662) +### [`selections.changeDirection`](../selections.ts#L645-L660) Change direction of selections. @@ -1597,11 +1620,12 @@ Change direction of selections. | Backward selections | `faceBackward` | | `[".selections.changeDirection", { direction: -1 }]` | -Default keybinding: `a-;` (kakoune: normal) +Default keybinding: `a-;` (core: normal) +`a-;` (helix: select) -### [`selections.changeOrder`](../selections.ts#L687-L701) +### [`selections.changeOrder`](../selections.ts#L685-L699) Reverse selections. @@ -1615,7 +1639,7 @@ Reverse selections. -### [`selections.sort`](../selections.ts#L714-L726) +### [`selections.sort`](../selections.ts#L712-L724) Sort selections. @@ -1626,7 +1650,7 @@ This command: -### [`selections.copy`](../selections.ts#L799-L817) +### [`selections.copy`](../selections.ts#L797-L815) Copy selections below. @@ -1644,7 +1668,7 @@ Default keybinding: `s-c` (kakoune: normal) -### [`selections.merge`](../selections.ts#L851-L856) +### [`selections.merge`](../selections.ts#L849-L854) Merge contiguous selections. @@ -1654,13 +1678,13 @@ Default keybinding: `a-_` (kakoune: normal) -### [`selections.open`](../selections.ts#L860-L863) +### [`selections.open`](../selections.ts#L858-L861) Open selected file. -### [`selections.toggleIndices`](../selections.ts#L876-L893) +### [`selections.toggleIndices`](../selections.ts#L874-L891) Toggle selection indices. @@ -1703,38 +1727,42 @@ Default keybinding: `a-)` (kakoune: normal) -### [`selections.rotate.contents`](../selections.rotate.ts#L28-L37) +### [`selections.rotate.contents`](../selections.rotate.ts#L28-L39) Rotate selections clockwise (contents only). + The following command is also available: -| Title | Identifier | Command | -| --------------------------------------------------- | ------------------ | ---------------------------------------------------- | -| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `[".selections.rotate.contents", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | +| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. +Default keybinding: `a-)` (helix: normal) +`a-)` (helix: select) + -### [`selections.rotate.selections`](../selections.rotate.ts#L45-L56) +### [`selections.rotate.selections`](../selections.rotate.ts#L47-L58) Rotate selections clockwise (selections only). The following keybinding is also available: -| Title | Identifier | Keybinding | Command | -| ----------------------------------------------------- | -------------------- | --------------------- | ------------------------------------------------------ | -| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (kakoune: normal) | `[".selections.rotate.selections", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------------------------------------- | -------------------- | --------------------------------------- | ------------------------------------------------------ | +| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal), `(` (helix: select) | `[".selections.rotate.selections", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. -Default keybinding: `)` (kakoune: normal) +Default keybinding: `)` (core: normal) ## [`view`](../view.ts) @@ -1742,10 +1770,10 @@ Moving the editor view. #### Predefined keybindings -| Title | Keybinding | Command | -| ----------------------- | ----------------------- | ---------------------------------------------------- | -| Show view menu | `v` (kakoune: normal) | `[".openMenu", { menu: "view", ... }]` | -| Show view menu (locked) | `s-v` (kakoune: normal) | `[".openMenu", { menu: "view", locked: true, ... }]` | +| Title | Keybinding | Command | +| ----------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- | +| Show view menu | `v` (kakoune: normal), `z` (helix: normal), `z` (helix: select) | `[".openMenu", { menu: "view", ... }]` | +| Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal), `s-z` (helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | diff --git a/src/commands/misc.ts b/src/commands/misc.ts index 1df842e2..f8d9143a 100644 --- a/src/commands/misc.ts +++ b/src/commands/misc.ts @@ -190,7 +190,7 @@ export async function run( * press is awaited again and the returned register will be specific to the * current document. * - * @keys `"` (kakoune: normal) + * @keys `"` (core: normal) * @noreplay */ export async function selectRegister( diff --git a/src/commands/modes.ts b/src/commands/modes.ts index 8ee17d7a..2cd42c99 100644 --- a/src/commands/modes.ts +++ b/src/commands/modes.ts @@ -11,20 +11,20 @@ declare module "./modes"; * * #### Variants * - * | Title | Identifier | Keybinding | Command | - * | ------------------ | ------------ | ---------------------------------------------------- | ----------------------------------------------------------- | - * | Set mode to Normal | `set.normal` | `escape` (kakoune: insert), `escape` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | - * | Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | - * | Set mode to Select | `set.select` | | `[".modes.set", { mode: "select" }]` | + * | Title | Identifier | Keybinding | Command | + * | ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | + * | Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | + * | Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | + * | Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | * * Other variants are provided to switch to insert mode: * - * | Title | Identifier | Keybinding | Commands | - * | -------------------- | ------------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - * | Insert before | `insert.before` | `i` (kakoune: normal) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | - * | Insert after | `insert.after` | `a` (kakoune: normal) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | - * | Insert at line start | `insert.lineStart` | `s-i` (kakoune: normal) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | - * | Insert at line end | `insert.lineEnd` | `s-a` (kakoune: normal) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + * | Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | + * | Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | + * | Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | + * | Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | * * @noreplay */ diff --git a/src/commands/search.ts b/src/commands/search.ts index 7b251735..0aa7174c 100644 --- a/src/commands/search.ts +++ b/src/commands/search.ts @@ -14,13 +14,13 @@ declare module "./search"; /** * Search. * - * @keys `/` (kakoune: normal), `NumPad_Divide` (kakoune: normal) + * @keys `/` (core: normal), `NumPad_Divide` (core: normal) * - * | Title | Identifier | Keybinding | Command | - * | ------------------------ | ----------------- | ----------------------- | ------------------------------------------------------ | - * | Search (extend) | `extend` | `?` (kakoune: normal) | `[".search", { shift: "extend", ... }]` | - * | Search backward | `backward` | `a-/` (kakoune: normal) | `[".search", { direction: -1 , ... }]` | - * | Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal) | `[".search", { direction: -1, shift: "extend", ... }]` | + * | Title | Identifier | Keybinding | Command | + * | ------------------------ | ----------------- | -------------------------------------------- | ------------------------------------------------------ | + * | Search (extend) | `extend` | `?` (kakoune: normal), `/` (helix: select) | `[".search", { shift: "extend", ... }]` | + * | Search backward | `backward` | `a-/` (kakoune: normal), `?` (helix: normal) | `[".search", { direction: -1 , ... }]` | + * | Search backward (extend) | `backward.extend` | `a-?` (kakoune: normal), `?` (helix: select) | `[".search", { direction: -1, shift: "extend", ... }]` | */ export async function search( _: Context, @@ -83,11 +83,11 @@ export async function search( /** * Search current selection. * - * @keys `a-*` (kakoune: normal), `a-NumPad_Multiply` (kakoune: normal) + * @keys `a-*` (core: normal), `a-NumPad_Multiply` (core: normal) * - * | Title | Identifier | Keybinding | Command | - * | -------------------------------- | ----------------- | ---------------------------------------------------------- | --------------------------------------------------- | - * | Search current selection (smart) | `selection.smart` | `*` (kakoune: normal), `NumPad_Multiply` (kakoune: normal) | `[".search.selection", { smart: true, +register }]` | + * | Title | Identifier | Keybinding | Command | + * | -------------------------------- | ----------------- | ---------------------------------------------------- | --------------------------------------------------- | + * | Search current selection (smart) | `selection.smart` | `*` (core: normal), `NumPad_Multiply` (core: normal) | `[".search.selection", { smart: true, +register }]` | */ export function selection( document: vscode.TextDocument, @@ -151,13 +151,13 @@ export function selection( /** * Select next match. * - * @keys `n` (kakoune: normal) + * @keys `n` (core: normal) * - * | Title | Identifier | Keybinding | Command | - * | --------------------- | -------------- | ------------------------- | ----------------------------------------------------- | - * | Add next match | `next.add` | `s-n` (kakoune: normal) | `[".search.next", { add: true, ... }]` | - * | Select previous match | `previous` | `a-n` (kakoune: normal) | `[".search.next", { direction: -1 , ... }]` | - * | Add previous match | `previous.add` | `s-a-n` (kakoune: normal) | `[".search.next", { direction: -1, add: true, ... }]` | + * | Title | Identifier | Keybinding | Command | + * | --------------------- | -------------- | ------------------------------------------------ | ----------------------------------------------------- | + * | Add next match | `next.add` | `s-n` (kakoune: normal), `n` (helix: select) | `[".search.next", { add: true, ... }]` | + * | Select previous match | `previous` | `a-n` (kakoune: normal), `s-n` (helix: normal) | `[".search.next", { direction: -1 , ... }]` | + * | Add previous match | `previous.add` | `s-a-n` (kakoune: normal), `s-n` (helix: select) | `[".search.next", { direction: -1, add: true, ... }]` | */ export async function next( _: Context, diff --git a/src/commands/seek.ts b/src/commands/seek.ts index 0fe8e64f..9c99dd62 100644 --- a/src/commands/seek.ts +++ b/src/commands/seek.ts @@ -16,18 +16,18 @@ declare module "./seek"; /** * Select to character (excluded). * - * @keys `t` (kakoune: normal) + * @keys `t` (core: normal) * * #### Variants * * | Title | Identifier | Keybinding | Command | * | ---------------------------------------- | -------------------------- | ------------------------------------------------ | ------------------------------------------------------------------- | * | Extend to character (excluded) | `extend` | `s-t` (kakoune: normal), `t` (helix: select) | `[".seek", { shift: "extend" , ... }]` | - * | Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal) | `[".seek", { direction: -1, ... }]` | + * | Select to character (excluded, backward) | `backward` | `a-t` (kakoune: normal), `s-t` (helix: normal) | `[".seek", { direction: -1, ... }]` | * | Extend to character (excluded, backward) | `extend.backward` | `s-a-t` (kakoune: normal), `s-t` (helix: select) | `[".seek", { shift: "extend", direction: -1, ... }]` | - * | Select to character (included) | `included` | `f` (kakoune: normal) | `[".seek", { include: true , ... }]` | + * | Select to character (included) | `included` | `f` (core: normal) | `[".seek", { include: true , ... }]` | * | Extend to character (included) | `included.extend` | `s-f` (kakoune: normal), `f` (helix: select) | `[".seek", { include: true, shift: "extend" , ... }]` | - * | Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal) | `[".seek", { include: true, direction: -1, ... }]` | + * | Select to character (included, backward) | `included.backward` | `a-f` (kakoune: normal), `s-f` (helix: normal) | `[".seek", { include: true, direction: -1, ... }]` | * | Extend to character (included, backward) | `included.extend.backward` | `s-a-f` (kakoune: normal), `s-f` (helix: select) | `[".seek", { include: true, shift: "extend", direction: -1, ... }]` | */ export async function seek( @@ -176,22 +176,22 @@ export function enclosing( * * Select the word and following whitespaces on the right of the end of each selection. * - * @keys `w` (kakoune: normal) + * @keys `w` (core: normal) * * #### Variants * * | Title | Identifier | Keybinding | Command | * | -------------------------------------------- | ------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------- | * | Extend to next word start | `word.extend` | `s-w` (kakoune: normal), `w` (helix: select) | `[".seek.word", { shift: "extend" , ... }]` | - * | Select to previous word start | `word.backward` | `b` (kakoune: normal) | `[".seek.word", { direction: -1, ... }]` | + * | Select to previous word start | `word.backward` | `b` (core: normal) | `[".seek.word", { direction: -1, ... }]` | * | Extend to previous word start | `word.extend.backward` | `s-b` (kakoune: normal), `b` (helix: select) | `[".seek.word", { shift: "extend", direction: -1, ... }]` | - * | Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal) | `[".seek.word", { ws: true , ... }]` | + * | Select to next non-whitespace word start | `word.ws` | `a-w` (kakoune: normal), `s-w` (helix: normal) | `[".seek.word", { ws: true , ... }]` | * | Extend to next non-whitespace word start | `word.ws.extend` | `s-a-w` (kakoune: normal), `s-w` (helix: select) | `[".seek.word", { ws: true, shift: "extend" , ... }]` | - * | Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | + * | Select to previous non-whitespace word start | `word.ws.backward` | `a-b` (kakoune: normal), `s-b` (helix: normal) | `[".seek.word", { ws: true, direction: -1, ... }]` | * | Extend to previous non-whitespace word start | `word.ws.extend.backward` | `s-a-b` (kakoune: normal), `s-b` (helix: select) | `[".seek.word", { ws: true, shift: "extend", direction: -1, ... }]` | - * | Select to next word end | `wordEnd` | `e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | + * | Select to next word end | `wordEnd` | `e` (core: normal) | `[".seek.word", { stopAtEnd: true , ... }]` | * | Extend to next word end | `wordEnd.extend` | `s-e` (kakoune: normal), `e` (helix: select) | `[".seek.word", { stopAtEnd: true , shift: "extend" , ... }]` | - * | Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | + * | Select to next non-whitespace word end | `wordEnd.ws` | `a-e` (kakoune: normal), `s-e` (helix: normal) | `[".seek.word", { stopAtEnd: true , ws: true , ... }]` | * | Extend to next non-whitespace word end | `wordEnd.ws.extend` | `s-a-e` (kakoune: normal), `s-e` (helix: select) | `[".seek.word", { stopAtEnd: true , ws: true, shift: "extend" , ... }]` | */ export function word( diff --git a/src/commands/select.ts b/src/commands/select.ts index 70537102..8888c65a 100644 --- a/src/commands/select.ts +++ b/src/commands/select.ts @@ -36,21 +36,25 @@ const preferredColumnsToken = * * #### Variants * - * | Title | Identifier | Keybinding | Command | + * | Title | Identifier | Keybinding | Command | * | ----------- | ------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | - * | Jump down | `down.jump` | `j` (kakoune: normal) , `down` (kakoune: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | + * | Jump down | `down.jump` | `j` (core: normal) , `down` (core: normal) | `[".select.vertically", { direction: 1, shift: "jump" , ... }]` | * | Extend down | `down.extend` | `s-j` (kakoune: normal), `s-down` (kakoune: normal), `j` (helix: select), `down` (helix: select) | `[".select.vertically", { direction: 1, shift: "extend", ... }]` | - * | Jump up | `up.jump` | `k` (kakoune: normal) , `up` (kakoune: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | + * | Jump up | `up.jump` | `k` (core: normal) , `up` (core: normal) | `[".select.vertically", { direction: -1, shift: "jump" , ... }]` | * | Extend up | `up.extend` | `s-k` (kakoune: normal), `s-up` (kakoune: normal) , `k` (helix: select), `up` (helix: select) | `[".select.vertically", { direction: -1, shift: "extend", ... }]` | * * The following keybindings are also defined: * - * | Keybinding | Command | - * | ------------------------------------------------ | -------------------------------------------------------------------------- | - * | `c-f` (kakoune: normal), `c-f` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | - * | `c-d` (kakoune: normal), `c-d` (kakoune: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | - * | `c-b` (kakoune: normal), `c-b` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | - * | `c-u` (kakoune: normal), `c-u` (kakoune: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | + * | Keybinding | Command | + * | -------------------------------------------| ---------------------------------------------------------------------------- | + * | `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | + * | `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | + * | `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | + * | `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | + * | `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | + * | `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | + * | `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | + * | `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | */ export function vertically( _: Context, @@ -224,9 +228,9 @@ export function vertically( * * | Title | Identifier | Keybinding | Command | * | ------------ | -------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | - * | Jump right | `right.jump` | `l` (kakoune: normal) , `right` (kakoune: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | + * | Jump right | `right.jump` | `l` (core: normal) , `right` (core: normal) | `[".select.horizontally", { direction: 1, shift: "jump" , ... }]` | * | Extend right | `right.extend` | `s-l` (kakoune: normal), `s-right` (kakoune: normal), `l` (helix: select), `right` (helix: select) | `[".select.horizontally", { direction: 1, shift: "extend", ... }]` | - * | Jump left | `left.jump` | `h` (kakoune: normal) , `left` (kakoune: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | + * | Jump left | `left.jump` | `h` (core: normal) , `left` (core: normal) | `[".select.horizontally", { direction: -1, shift: "jump" , ... }]` | * | Extend left | `left.extend` | `s-h` (kakoune: normal), `s-left` (kakoune: normal), `h` (helix: select), `left` (helix: select) | `[".select.horizontally", { direction: -1, shift: "extend", ... }]` | */ export function horizontally( @@ -293,7 +297,7 @@ export function horizontally( * * | Title | Identifier | Keybinding | Command | * | --------- | ----------- | -------------------------------------------- | ------------------------------------------ | - * | Go to | `to.jump` | `g` (kakoune: normal) | `[".select.to", { shift: "jump" , ... }]` | + * | Go to | `to.jump` | `g` (core: normal) | `[".select.to", { shift: "jump" , ... }]` | * | Extend to | `to.extend` | `s-g` (kakoune: normal), `g` (helix: select) | `[".select.to", { shift: "extend", ... }]` | */ export function to( @@ -341,6 +345,7 @@ export function line_below(_: Context, count: number) { /** * Extend to line below. + * @keys `x` (helix: normal), `x` (helix: select) */ export function line_below_extend(_: Context, count: number) { if (count === 0 || count === 1) { @@ -448,18 +453,18 @@ export function line_above_extend(_: Context, count: number) { /** * Select to line start. * - * @keys `a-h` (kakoune: normal), `home` (kakoune: normal) + * @keys `a-h` (kakoune: normal), `home` (core: normal) * * #### Variants * - * | Title | Identifier | Keybinding | Command | - * | -------------------- | ------------------ | ----------------------------------------------------- | ------------------------------------------------------------------ | - * | Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | - * | Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal) | `[".select.lineStart", { shift: "extend", ... }]` | - * | Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | - * | Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | - * | Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | - * | Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | + * | Title | Identifier | Keybinding | Command | + * | -------------------- | ------------------ | ----------------------------------------------------------------------------- | ------------------------------------------------------------------ | + * | Jump to line start | `lineStart.jump` | | `[".select.lineStart", { shift: "jump" , ... }]` | + * | Extend to line start | `lineStart.extend` | `s-a-h` (kakoune: normal), `s-home` (kakoune: normal), `home` (helix: select) | `[".select.lineStart", { shift: "extend", ... }]` | + * | Jump to line start (skip blank) | `lineStart.skipBlank.jump` | | `[".select.lineStart", { skipBlank: true, shift: "jump" , ... }]` | + * | Extend to line start (skip blank) | `lineStart.skipBlank.extend` | | `[".select.lineStart", { skipBlank: true, shift: "extend", ... }]` | + * | Jump to first line | `firstLine.jump` | | `[".select.lineStart", { count: 0, shift: "jump" , ... }]` | + * | Extend to first line | `firstLine.extend` | | `[".select.lineStart", { count: 0, shift: "extend", ... }]` | */ export function lineStart( _: Context, @@ -498,15 +503,15 @@ export function lineStart( * @param lineBreak If `true`, selects the line break in character selection * mode. * - * @keys `a-l` (kakoune: normal), `end` (kakoune: normal) + * @keys `a-l` (kakoune: normal), `end` (core: normal) * * #### Variants * - * | Title | Identifier | Keybinding | Command | - * | ------------------------ | -------------------- | ---------------------------------------------------- | --------------------------------------------------------------- | - * | Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal) | `[".select.lineEnd", { shift: "extend", ... }]` | - * | Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | - * | Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | + * | Title | Identifier | Keybinding | Command | + * | ------------------------ | -------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------- | + * | Extend to line end | `lineEnd.extend` | `s-a-l` (kakoune: normal), `s-end` (kakoune: normal), `end` (helix: select) | `[".select.lineEnd", { shift: "extend", ... }]` | + * | Jump to last character | `documentEnd.jump` | | `[".select.lineEnd", { count: MAX_INT, shift: "jump" , ... }]` | + * | Extend to last character | `documentEnd.extend` | | `[".select.lineEnd", { count: MAX_INT, shift: "extend", ... }]` | */ export function lineEnd( _: Context, diff --git a/src/commands/selections.rotate.ts b/src/commands/selections.rotate.ts index e6daf188..36b40267 100644 --- a/src/commands/selections.rotate.ts +++ b/src/commands/selections.rotate.ts @@ -28,11 +28,13 @@ export function both(_: Context, repetitions: number, reverse: Argument /** * Rotate selections clockwise (contents only). * + * @keys `a-)` (helix: normal), `a-)` (helix: select) + * * The following command is also available: * - * | Title | Identifier | Command | - * | --------------------------------------------------- | ------------------ | ---------------------------------------------------- | - * | Rotate selections counter-clockwise (contents only) | `contents.reverse` | `[".selections.rotate.contents", { reverse: true }]` | + * | Title | Identifier | Keybinding | Command | + * | --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | + * | Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | */ export function contents(_: Context, repetitions: number, reverse: Argument = false) { if (reverse) { @@ -45,13 +47,13 @@ export function contents(_: Context, repetitions: number, reverse: Argument = false) { if (reverse) { diff --git a/src/commands/selections.ts b/src/commands/selections.ts index b5994b12..9f51b78f 100644 --- a/src/commands/selections.ts +++ b/src/commands/selections.ts @@ -21,7 +21,7 @@ declare module "./selections"; /** * Copy selections text. * - * @keys `y` (kakoune: normal) + * @keys `y` (core: normal), `y` (helix: select) */ export function saveText( document: vscode.TextDocument, @@ -244,17 +244,16 @@ const pipeHistory: string[] = []; * Run the specified command or code with the contents of each selection, and * save the result to a register. * - * @keys `a-|` (kakoune: normal) - * + * @keys `a-|` (core: normal), `a-|` (helix: select) * See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes-through-external-programs * * #### Additional commands * - * | Title | Identifier | Keybinding | Commands | - * | ------------------- | -------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------- | - * | Pipe and replace | `pipe.replace` | `|` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", ... }]` | - * | Pipe and append | `pipe.append` | `!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "end" , shift: "select", ... }]` | - * | Pipe and prepend | `pipe.prepend` | `a-!` (kakoune: normal) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "start", shift: "select", ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | + * | Pipe and replace | `pipe.replace` | `|` (core: normal), `|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", ... }]` | + * | Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "end" , shift: "select", ... }]` | + * | Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "start", shift: "select", ... }]` | */ export async function pipe( _: Context, @@ -291,16 +290,15 @@ const filterHistory: string[] = []; /** * Filter selections. * - * @keys `$` (kakoune: normal) - * + * @keys `$` (core: normal), `$` (helix: select) * #### Variants * - * | Title | Identifier | Keybinding | Commands | - * | -------------------------- | ----------------------- | --------------------------| ------------------------------------------------------------------------ | - * | Keep matching selections | `filter.regexp` | `a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/" , ... }]` | - * | Clear matching selections | `filter.regexp.inverse` | `s-a-k` (kakoune: normal) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | - * | Clear secondary selections | `clear.secondary` | `,` (kakoune: normal) | `[".selections.filter", { expression: "i === count" , ... }]` | - * | Clear main selections | `clear.main` | `a-,` (kakoune: normal) | `[".selections.filter", { expression: "i !== count" , ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | + * | Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | + * | Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | + * | Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | + * | Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | */ export function filter( _: Context, @@ -348,9 +346,9 @@ export function filter( * * #### Variants * - * | Title | Identifier | Keybinding | Command | - * | -------------- | --------------- | --------------------- | ------------------------------------------------------------------------------------------------- | - * | Leap or select | `select.orLeap` | `s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | + * | Title | Identifier | Keybinding | Command | + * | -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | + * | Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | */ export function select( _: Context, @@ -379,7 +377,7 @@ export function select( /** * Split selections. * - * @keys `s-s` (kakoune: normal) + * @keys `s-s` (core: normal), `s-s` (helix: select) */ export function split( _: Context, @@ -417,9 +415,9 @@ export function split( * * #### Variants * - * | Title | Identifier | Keybinding | Command | - * | ----------------------- | ---------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------- | - * | Leap or select backward | `splitLines.orLeap.backward` | `a-s` (kakoune: normal) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | + * | Title | Identifier | Keybinding | Command | + * | ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | + * | Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | */ export function splitLines( _: Context, @@ -476,7 +474,7 @@ export function splitLines( * * Expand selections to contain full lines (including end-of-line characters). * - * @keys `x` (kakoune: normal) + * @keys `x` (kakoune: normal), `s-x` (helix: normal), `s-x` (helix: select) */ export function expandToLines(_: Context) { return Selections.updateByIndex((_i, selection, document) => { @@ -510,7 +508,7 @@ export function expandToLines(_: Context) { * * Trim selections to only contain full lines (from start to line break). * - * @keys `a-x` (kakoune: normal) + * @keys `a-x` (core: normal), `a-x` (helix: select) */ export function trimLines(_: Context) { return Selections.updateByIndex((_, selection) => { @@ -542,7 +540,7 @@ export function trimLines(_: Context) { * * Trim whitespace at beginning and end of selections. * - * @keys `_` (kakoune: normal) + * @keys `_` (core: normal), `_` (helix: select) */ export function trimWhitespace(_: Context) { const blank = getCharacters(CharSet.Blank, _.document), @@ -569,7 +567,7 @@ export function trimWhitespace(_: Context) { * @param where Which edge each selection should be reduced to; defaults to * "active". * - * @keys `;` (kakoune: normal) + * @keys `;` (core: normal), `;` (helix: select) * * #### Variant * @@ -650,7 +648,7 @@ export function reduce( * @param direction If unspecified, flips each direction. Otherwise, ensures * that all selections face the given direction. * - * @keys `a-;` (kakoune: normal) + * @keys `a-;` (core: normal), `a-;` (helix: select) * * #### Variants * diff --git a/src/commands/view.ts b/src/commands/view.ts index 26b23200..2bccc51b 100644 --- a/src/commands/view.ts +++ b/src/commands/view.ts @@ -8,10 +8,10 @@ import { Context, Selections } from "../api"; * * #### Predefined keybindings * - * | Title | Keybinding | Command | - * | ----------------------- | ----------------------- | ---------------------------------------------------- | - * | Show view menu | `v` (kakoune: normal) | `[".openMenu", { menu: "view", ... }]` | - * | Show view menu (locked) | `s-v` (kakoune: normal) | `[".openMenu", { menu: "view", locked: true, ... }]` | + * | Title | Keybinding | Command | + * | ----------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- | + * | Show view menu | `v` (kakoune: normal), `z` (helix: normal), `z` (helix: select) | `[".openMenu", { menu: "view", ... }]` | + * | Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal), `s-z` (helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | */ declare module "./view"; diff --git a/src/state/extension.ts b/src/state/extension.ts index 6085d262..821c374d 100644 --- a/src/state/extension.ts +++ b/src/state/extension.ts @@ -35,6 +35,11 @@ export class Extension implements vscode.Disposable { return this._gotoMenus as ReadonlyMap; } + private _behavior = ""; + public get behavior() { + return this._behavior; + } + // State. // ========================================================================== @@ -168,6 +173,15 @@ export class Extension implements vscode.Disposable { true, ); + this.observePreference( + ".behavior", + (value, _validator, _inspect) => { + this._behavior = value; + vscode.commands.executeCommand("setContext", "dance.behavior", this._behavior); + }, + true, + ); + this._subscriptions.push( // Update configuration automatically. vscode.workspace.onDidChangeConfiguration((e) => { From 7baaa3094d9b083b441e9a23e91a0653c5b4534b Mon Sep 17 00:00:00 2001 From: Strackeror Date: Wed, 10 Jul 2024 14:04:59 +0200 Subject: [PATCH 02/16] Behavior choice: Helix keymap as an extension --- .gitattributes | 1 + .vscode/launch.json | 12 + extensions/helix/LICENSE | 5 + extensions/helix/dance.png | Bin 0 -> 14536 bytes extensions/helix/package.build.ts | 216 +++ extensions/helix/package.json | 2270 +++++++++++++++++++++++++++++ meta.ts | 65 +- package.build.ts | 59 +- package.json | 1386 ++++-------------- src/api/data/commands.yaml | 23 +- src/api/modes.ts | 24 +- src/commands/README.md | 276 ++-- src/commands/edit.ts | 2 +- src/commands/layouts/azerty.fr.md | 276 ++-- src/commands/layouts/qwerty.md | 276 ++-- src/commands/seek.ts | 7 + src/state/extension.ts | 14 - 17 files changed, 3342 insertions(+), 1570 deletions(-) create mode 100644 extensions/helix/LICENSE create mode 100644 extensions/helix/dance.png create mode 100644 extensions/helix/package.build.ts create mode 100644 extensions/helix/package.json diff --git a/.gitattributes b/.gitattributes index 7f37cd42..62cf7aed 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,5 +3,6 @@ /src/commands/load-all.ts linguist-generated /src/commands/README.md linguist-generated /package.json linguist-generated +/extensions/helix/package.json linguist-generated /test/suite/api.test.ts linguist-generated /test/suite/commands/*.test.ts linguist-generated diff --git a/.vscode/launch.json b/.vscode/launch.json index 59779fbf..850be651 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,6 +9,18 @@ "args": ["--extensionDevelopmentPath=${workspaceFolder}"], "outFiles": ["${workspaceFolder}/out/**/*.js"], }, + { + "name": "Launch extension with helix keybinds", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "${workspaceFolder}/.vscode-test", + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionDevelopmentPath=${workspaceFolder}/extensions/helix/", + ], + "outFiles": ["${workspaceFolder}/out/**/*.js"], + }, { "name": "Run all tests", "type": "extensionHost", diff --git a/extensions/helix/LICENSE b/extensions/helix/LICENSE new file mode 100644 index 00000000..3155ccf3 --- /dev/null +++ b/extensions/helix/LICENSE @@ -0,0 +1,5 @@ +Copyright 2020-2021 Grégoire Geis + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/extensions/helix/dance.png b/extensions/helix/dance.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca6bb3fca603160afc69f9b6033e7fad99534af GIT binary patch literal 14536 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 literal 0 HcmV?d00001 diff --git a/extensions/helix/package.build.ts b/extensions/helix/package.build.ts new file mode 100644 index 00000000..6f812156 --- /dev/null +++ b/extensions/helix/package.build.ts @@ -0,0 +1,216 @@ +// Save to package.json +// ============================================================================ + +import { Builder, generateIgnoredKeybinds } from "../../meta"; +import * as fs from "fs/promises"; +import { SelectionBehavior } from "../../src/api"; + +const version = "0.1.0", + preRelease = 1, + preReleaseVersion = version.replace(/\d+$/, "$&" + preRelease.toString().padStart(3, "0")); + +export const pkg = (modules: Builder.ParsedModule[]) => ({ + + // Common package.json properties. + // ========================================================================== + + name: "dance-helix-keybinds", + description: "Helix keybindings for dance", + version, + license: "ISC", + + author: { + name: "Grégoire Geis", + email: "opensource@gregoirege.is", + }, + + repository: { + type: "git", + url: "https://github.com/71/dance.git", + }, + + engines: { + vscode: "^1.63.0", + }, + + displayName: "Dance", + publisher: "gregoire", + categories: ["Keymaps", "Other"], + readme: "README.md", + icon: "dance.png", + + scripts: { + "package": "vsce package --allow-star-activation", + "publish": "vsce publish --allow-star-activation", + "package:pre": `vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json ${preReleaseVersion}`, + "publish:pre": `vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json ${preReleaseVersion}`, + }, + + contributes: { + configurationDefaults: { + "dance.defaultMode": "helix/normal", + "dance.modes": { + "": { + hiddenSelectionsIndicatorsDecoration: { + after: { + color: "$list.warningForeground", + }, + backgroundColor: "$inputValidation.warningBackground", + borderColor: "$inputValidation.warningBorder", + borderStyle: "solid", + borderWidth: "1px", + isWholeLine: true, + }, + }, + "input": { + cursorStyle: "underline-thin", + }, + "helix/insert": { + onLeaveMode: [ + [".selections.save", { + register: " insert", + }], + ], + }, + "helix/select": { + cursorStyle: "block", + selectionBehavior: "character", + }, + "helix/normal": { + cursorStyle: "block", + selectionBehavior: "character", + decorations: { + applyTo: "main", + backgroundColor: "$editor.hoverHighlightBackground", + isWholeLine: true, + }, + onEnterMode: [ + [".selections.restore", { register: " ^", try: true }], + ], + onLeaveMode: [ + [".selections.save", { + register: " ^", + style: { + borderColor: "$editor.selectionBackground", + borderStyle: "solid", + borderWidth: "2px", + borderRadius: "1px", + }, + until: [ + ["mode-did-change", { include: "normal" }], + ["selections-did-change"], + ], + }], + ], + }, + }, + + "dance.menus": { + match: { + title: "Match", + items: { + // Should be jump in normal mode, extend in select mode, but jump for seek.enclosing is not implemented + "m": { command: "dance.seek.enclosing", text: "Goto matching bracket" }, + "a": { command: "dance.openMenu", args: [{ menu: "object", title: "Match around" }], text: "Select around object" }, + "i": { command: "dance.openMenu", args: [{ menu: "object", title: "Match inside", pass: [{ inner: true }] }], text: "Select inside object" }, + }, + }, + + object: { + title: "Select object...", + items: ((command = "dance.seek.object") => ({ + "()": { command, args: [{ input: "\\((?#inner)\\)" }], text: "parenthesis block" }, + "{}": { command, args: [{ input: "\\{(?#inner)\\}" }], text: "braces block" }, + "[]": { command, args: [{ input: "\\[(?#inner)\\]" }], text: "brackets block" }, + "<>": { command, args: [{ input: "<(?#inner)>" }], text: "angle block" }, + '"': { command, args: [{ input: "(?#noescape)\"(?#inner)(?#noescape)\"" }], text: "double quote string" }, + "'": { command, args: [{ input: "(?#noescape)'(?#inner)(?#noescape)'" }], text: "single quote string" }, + "`": { command, args: [{ input: "(?#noescape)`(?#inner)(?#noescape)`" }], text: "grave quote string" }, + "w": { command, args: [{ input: "[\\p{L}_\\d]+(?[^\\S\\n]+)" }], text: "word" }, + "W": { command, args: [{ input: "[\\S]+(?[^\\S\\n]+)" }], text: "WORD" }, + "p": { command, args: [{ input: "(?#predefined=paragraph)" }], text: "paragraph" }, + "a": { command, args: [{ input: "(?#predefined=argument)" }], text: "argument" }, + "!": { command, text: "custom object desc" }, + }))(), + }, + + view: { + "title": "View", + "items": { + "cz": { text: "Align view center", command: "dance.view.line", args: [{ "at": "center" }] }, + "t": { text: "Align view top", command: "dance.view.line", args: [{ "at": "top" }] }, + "b": { text: "Align view bottom", command: "dance.view.line", args: [{ "at": "bottom" }] }, + "k": { text: "Scroll view up", command: "editorScroll", args: [{ "by": "line", "revealCursor": true, "to": "up" }] }, + "j": { text: "Scroll view down", command: "editorScroll", args: [{ "by": "line", "revealCursor": true, "to": "down" }] }, + "/": { text: "Search for regex pattern", command: "dance.search" }, + "?": { text: "Reverse search for regex pattern", command: "dance.search.backward" }, + "n": { text: "Select next search match", command: "dance.search.next" }, + "N": { text: "Select previous search match", command: "dance.search.previous" }, + }, + }, + + goto: { + title: "Goto", + items: { + "g": { text: "to line number else file start", command: "dance.select.lineStart" }, + "e": { text: "to last line", command: "dance.select.lineEnd", args: [{ count: 2 ** 31 - 1 }] }, + "f": { text: "to file/URLs in selections", command: "dance.selections.open" }, + "h": { text: "to line start", command: "dance.select.lineStart" }, + "l": { text: "to line end", command: "dance.select.lineEnd" }, + "i": { text: "to first non-blank in line", command: "dance.select.lineStart", args: [{ skipBlank: true }] }, + "d": { text: "to definition", command: "editor.action.revealDefinition" }, + "r": { text: "to references", command: "editor.action.goToReferences" }, + "j": { text: "to last line", command: "dance.select.lastLine" }, + "t": { text: "to window top", command: "dance.select.firstVisibleLine" }, + "c": { text: "to window center", command: "dance.select.middleVisibleLine" }, + "b": { text: "to window bottom", command: "dance.select.lastVisibleLine" }, + "a": { text: "to last buffer", command: "workbench.action.openPreviousRecentlyUsedEditorInGroup" }, + "A": { text: "to last buffer...", command: "workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup" }, + "n": { text: "to next buffer", command: "workbench.action.nextEditor" }, + "p": { text: "to previous buffer", command: "workbench.action.previousEditor" }, + ".": { text: "to last buffer modification position", command: "dance.selections.restore", args: [{ register: " insert" }], + }, + }, + }, + }, + }, + + keybindings: (() => { + const ignoredKeybindings = [], + keybindings = modules + .flatMap((module) => module.keybindings) + .filter((keybinding) => ["core", "helix", undefined].includes(keybinding.category)) + .map((k) => ({ ...k })); + for (const mode of ["normal", "select", "insert"]) { + for (const keybind of keybindings) { + keybind.when = keybind.when.replace(`dance.mode == '${mode}'`, `dance.mode == 'helix/${mode}'`); + } + } + + for (const mode of ["normal", "select"]) { + const whenMode = `dance.mode == 'helix/${mode}'`; + ignoredKeybindings.push(...generateIgnoredKeybinds( + keybindings.filter(key => key.when.includes(whenMode)), + whenMode, + )); + + } + + return [ + ...keybindings, + ...ignoredKeybindings, + ]; + })(), + + + }, +}); + + +export async function build(builder: Builder) { + await fs.writeFile( + `${__dirname}/package.json`, + JSON.stringify(pkg(await builder.getCommandModules()), undefined, 2) + "\n", + "utf-8", + ); +} diff --git a/extensions/helix/package.json b/extensions/helix/package.json new file mode 100644 index 00000000..6928e837 --- /dev/null +++ b/extensions/helix/package.json @@ -0,0 +1,2270 @@ +{ + "name": "dance-helix-keybinds", + "description": "Helix keybindings for dance", + "version": "0.1.0", + "license": "ISC", + "author": { + "name": "Grégoire Geis", + "email": "opensource@gregoirege.is" + }, + "repository": { + "type": "git", + "url": "https://github.com/71/dance.git" + }, + "engines": { + "vscode": "^1.63.0" + }, + "displayName": "Dance", + "publisher": "gregoire", + "categories": [ + "Keymaps", + "Other" + ], + "readme": "README.md", + "icon": "dance.png", + "scripts": { + "package": "vsce package --allow-star-activation", + "publish": "vsce publish --allow-star-activation", + "package:pre": "vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.1.0001", + "publish:pre": "vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.1.0001" + }, + "contributes": { + "configurationDefaults": { + "dance.defaultMode": "helix/normal", + "dance.modes": { + "": { + "hiddenSelectionsIndicatorsDecoration": { + "after": { + "color": "$list.warningForeground" + }, + "backgroundColor": "$inputValidation.warningBackground", + "borderColor": "$inputValidation.warningBorder", + "borderStyle": "solid", + "borderWidth": "1px", + "isWholeLine": true + } + }, + "input": { + "cursorStyle": "underline-thin" + }, + "helix/insert": { + "onLeaveMode": [ + [ + ".selections.save", + { + "register": " insert" + } + ] + ] + }, + "helix/select": { + "cursorStyle": "block", + "selectionBehavior": "character" + }, + "helix/normal": { + "cursorStyle": "block", + "selectionBehavior": "character", + "decorations": { + "applyTo": "main", + "backgroundColor": "$editor.hoverHighlightBackground", + "isWholeLine": true + }, + "onEnterMode": [ + [ + ".selections.restore", + { + "register": " ^", + "try": true + } + ] + ], + "onLeaveMode": [ + [ + ".selections.save", + { + "register": " ^", + "style": { + "borderColor": "$editor.selectionBackground", + "borderStyle": "solid", + "borderWidth": "2px", + "borderRadius": "1px" + }, + "until": [ + [ + "mode-did-change", + { + "include": "normal" + } + ], + [ + "selections-did-change" + ] + ] + } + ] + ] + } + }, + "dance.menus": { + "match": { + "title": "Match", + "items": { + "m": { + "command": "dance.seek.enclosing", + "text": "Goto matching bracket" + }, + "a": { + "command": "dance.openMenu", + "args": [ + { + "menu": "object", + "title": "Match around" + } + ], + "text": "Select around object" + }, + "i": { + "command": "dance.openMenu", + "args": [ + { + "menu": "object", + "title": "Match inside", + "pass": [ + { + "inner": true + } + ] + } + ], + "text": "Select inside object" + } + } + }, + "object": { + "title": "Select object...", + "items": { + "()": { + "command": "dance.seek.object", + "args": [ + { + "input": "\\((?#inner)\\)" + } + ], + "text": "parenthesis block" + }, + "{}": { + "command": "dance.seek.object", + "args": [ + { + "input": "\\{(?#inner)\\}" + } + ], + "text": "braces block" + }, + "[]": { + "command": "dance.seek.object", + "args": [ + { + "input": "\\[(?#inner)\\]" + } + ], + "text": "brackets block" + }, + "<>": { + "command": "dance.seek.object", + "args": [ + { + "input": "<(?#inner)>" + } + ], + "text": "angle block" + }, + "\"": { + "command": "dance.seek.object", + "args": [ + { + "input": "(?#noescape)\"(?#inner)(?#noescape)\"" + } + ], + "text": "double quote string" + }, + "'": { + "command": "dance.seek.object", + "args": [ + { + "input": "(?#noescape)'(?#inner)(?#noescape)'" + } + ], + "text": "single quote string" + }, + "`": { + "command": "dance.seek.object", + "args": [ + { + "input": "(?#noescape)`(?#inner)(?#noescape)`" + } + ], + "text": "grave quote string" + }, + "w": { + "command": "dance.seek.object", + "args": [ + { + "input": "[\\p{L}_\\d]+(?[^\\S\\n]+)" + } + ], + "text": "word" + }, + "W": { + "command": "dance.seek.object", + "args": [ + { + "input": "[\\S]+(?[^\\S\\n]+)" + } + ], + "text": "WORD" + }, + "p": { + "command": "dance.seek.object", + "args": [ + { + "input": "(?#predefined=paragraph)" + } + ], + "text": "paragraph" + }, + "a": { + "command": "dance.seek.object", + "args": [ + { + "input": "(?#predefined=argument)" + } + ], + "text": "argument" + }, + "!": { + "command": "dance.seek.object", + "text": "custom object desc" + } + } + }, + "view": { + "title": "View", + "items": { + "cz": { + "text": "Align view center", + "command": "dance.view.line", + "args": [ + { + "at": "center" + } + ] + }, + "t": { + "text": "Align view top", + "command": "dance.view.line", + "args": [ + { + "at": "top" + } + ] + }, + "b": { + "text": "Align view bottom", + "command": "dance.view.line", + "args": [ + { + "at": "bottom" + } + ] + }, + "k": { + "text": "Scroll view up", + "command": "editorScroll", + "args": [ + { + "by": "line", + "revealCursor": true, + "to": "up" + } + ] + }, + "j": { + "text": "Scroll view down", + "command": "editorScroll", + "args": [ + { + "by": "line", + "revealCursor": true, + "to": "down" + } + ] + }, + "/": { + "text": "Search for regex pattern", + "command": "dance.search" + }, + "?": { + "text": "Reverse search for regex pattern", + "command": "dance.search.backward" + }, + "n": { + "text": "Select next search match", + "command": "dance.search.next" + }, + "N": { + "text": "Select previous search match", + "command": "dance.search.previous" + } + } + }, + "goto": { + "title": "Goto", + "items": { + "g": { + "text": "to line number else file start", + "command": "dance.select.lineStart" + }, + "e": { + "text": "to last line", + "command": "dance.select.lineEnd", + "args": [ + { + "count": 2147483647 + } + ] + }, + "f": { + "text": "to file/URLs in selections", + "command": "dance.selections.open" + }, + "h": { + "text": "to line start", + "command": "dance.select.lineStart" + }, + "l": { + "text": "to line end", + "command": "dance.select.lineEnd" + }, + "i": { + "text": "to first non-blank in line", + "command": "dance.select.lineStart", + "args": [ + { + "skipBlank": true + } + ] + }, + "d": { + "text": "to definition", + "command": "editor.action.revealDefinition" + }, + "r": { + "text": "to references", + "command": "editor.action.goToReferences" + }, + "j": { + "text": "to last line", + "command": "dance.select.lastLine" + }, + "t": { + "text": "to window top", + "command": "dance.select.firstVisibleLine" + }, + "c": { + "text": "to window center", + "command": "dance.select.middleVisibleLine" + }, + "b": { + "text": "to window bottom", + "command": "dance.select.lastVisibleLine" + }, + "a": { + "text": "to last buffer", + "command": "workbench.action.openPreviousRecentlyUsedEditorInGroup" + }, + "A": { + "text": "to last buffer...", + "command": "workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup" + }, + "n": { + "text": "to next buffer", + "command": "workbench.action.nextEditor" + }, + "p": { + "text": "to previous buffer", + "command": "workbench.action.previousEditor" + }, + ".": { + "text": "to last buffer modification position", + "command": "dance.selections.restore", + "args": [ + { + "register": " insert" + } + ] + } + } + } + } + }, + "keybindings": [ + { + "category": "core", + "key": "Shift+7", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Align selections", + "command": "dance.edit.align" + }, + { + "category": "helix", + "key": "Shift+`", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Swap case", + "command": "dance.edit.case.swap" + }, + { + "category": "helix", + "key": "Shift+`", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Swap case", + "command": "dance.edit.case.swap" + }, + { + "category": "core", + "key": "`", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Transform to lower case", + "command": "dance.edit.case.toLower" + }, + { + "category": "helix", + "key": "`", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Transform to lower case", + "command": "dance.edit.case.toLower" + }, + { + "category": "helix", + "key": "Alt+`", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Transform to upper case", + "command": "dance.edit.case.toUpper" + }, + { + "category": "helix", + "key": "Alt+`", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Transform to upper case", + "command": "dance.edit.case.toUpper" + }, + { + "category": "core", + "key": "Shift+,", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Deindent selected lines (including incomplete indent)", + "command": "dance.edit.deindent.withIncomplete" + }, + { + "category": "helix", + "key": "Shift+,", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Deindent selected lines (including incomplete indent)", + "command": "dance.edit.deindent.withIncomplete" + }, + { + "category": "core", + "key": "Alt+D", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Delete", + "command": "dance.edit.delete" + }, + { + "category": "helix", + "key": "Alt+D", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Delete", + "command": "dance.edit.delete" + }, + { + "category": "core", + "key": "Shift+.", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Indent selected lines", + "command": "dance.edit.indent" + }, + { + "category": "helix", + "key": "Shift+.", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Indent selected lines", + "command": "dance.edit.indent" + }, + { + "category": "helix", + "key": "Shift+J", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Join lines", + "command": "dance.edit.join" + }, + { + "category": "helix", + "key": "Shift+J", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Join lines", + "command": "dance.edit.join" + }, + { + "category": "core", + "key": "Shift+Alt+J", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Join lines and select inserted separators", + "command": "dance.edit.join.select" + }, + { + "category": "helix", + "key": "Shift+Alt+J", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Join lines and select inserted separators", + "command": "dance.edit.join.select" + }, + { + "category": "core", + "key": "Shift+O", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Insert new line above and switch to insert", + "command": "dance.edit.newLine.above.insert" + }, + { + "category": "helix", + "key": "Shift+O", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Insert new line above and switch to insert", + "command": "dance.edit.newLine.above.insert" + }, + { + "category": "core", + "key": "O", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Insert new line below and switch to insert", + "command": "dance.edit.newLine.below.insert" + }, + { + "category": "helix", + "key": "O", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Insert new line below and switch to insert", + "command": "dance.edit.newLine.below.insert" + }, + { + "category": "helix", + "key": "P", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Paste after", + "command": "dance.edit.paste.after" + }, + { + "category": "core", + "key": "P", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Paste after and select", + "command": "dance.edit.paste.after.select" + }, + { + "category": "helix", + "key": "Shift+P", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Paste before", + "command": "dance.edit.paste.before" + }, + { + "category": "core", + "key": "Shift+P", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Paste before and select", + "command": "dance.edit.paste.before.select" + }, + { + "category": "core", + "key": "R", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Replace characters", + "command": "dance.edit.replaceCharacters" + }, + { + "category": "core", + "key": "D", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Copy and delete", + "command": "dance.edit.yank-delete" + }, + { + "category": "helix", + "key": "D", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Copy and delete", + "command": "dance.edit.yank-delete" + }, + { + "category": "core", + "key": "C", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Copy, delete and switch to Insert", + "command": "dance.edit.yank-delete-insert" + }, + { + "category": "helix", + "key": "C", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Copy, delete and switch to Insert", + "command": "dance.edit.yank-delete-insert" + }, + { + "category": "core", + "key": "Shift+U", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Redo", + "command": "dance.history.redo" + }, + { + "category": "helix", + "key": "Shift+U", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Redo", + "command": "dance.history.redo" + }, + { + "category": "core", + "key": ".", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Repeat last edit without a command", + "command": "dance.history.repeat.edit" + }, + { + "category": "core", + "key": "NumPad_Decimal", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Repeat last edit without a command", + "command": "dance.history.repeat.edit" + }, + { + "category": "core", + "key": "Alt+.", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Repeat last seek", + "command": "dance.history.repeat.seek" + }, + { + "category": "helix", + "key": "Alt+.", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Repeat last seek", + "command": "dance.history.repeat.seek" + }, + { + "category": "core", + "key": "U", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Undo", + "command": "dance.history.undo" + }, + { + "category": "helix", + "key": "U", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Undo", + "command": "dance.history.undo" + }, + { + "category": "core", + "key": "Escape", + "when": "editorTextFocus && dance.mode == 'helix/normal' && !dance.isRecording && !markersNavigationVisible", + "title": "Cancel Dance operation", + "command": "dance.cancel" + }, + { + "category": "core", + "key": "Escape", + "when": "editorTextFocus && dance.mode == 'input'", + "title": "Cancel Dance operation", + "command": "dance.cancel" + }, + { + "category": "core", + "key": "Up", + "when": "inputFocus && dance.inPrompt", + "command": "dance.changeInput", + "args": { + "action": "previous" + } + }, + { + "category": "core", + "key": "Down", + "when": "inputFocus && dance.inPrompt", + "command": "dance.changeInput", + "args": { + "action": "next" + } + }, + { + "category": "core", + "key": "Shift+'", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select register for next command", + "command": "dance.selectRegister" + }, + { + "category": "core", + "key": "0", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 0 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 0 + } + }, + { + "category": "core", + "key": "NumPad0", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 0 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 0 + } + }, + { + "category": "core", + "key": "1", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 1 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 1 + } + }, + { + "category": "core", + "key": "NumPad1", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 1 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 1 + } + }, + { + "category": "core", + "key": "2", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 2 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 2 + } + }, + { + "category": "core", + "key": "NumPad2", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 2 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 2 + } + }, + { + "category": "core", + "key": "3", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 3 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 3 + } + }, + { + "category": "core", + "key": "NumPad3", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 3 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 3 + } + }, + { + "category": "core", + "key": "4", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 4 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 4 + } + }, + { + "category": "core", + "key": "NumPad4", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 4 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 4 + } + }, + { + "category": "core", + "key": "5", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 5 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 5 + } + }, + { + "category": "core", + "key": "NumPad5", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 5 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 5 + } + }, + { + "category": "core", + "key": "6", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 6 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 6 + } + }, + { + "category": "core", + "key": "NumPad6", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 6 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 6 + } + }, + { + "category": "core", + "key": "7", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 7 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 7 + } + }, + { + "category": "core", + "key": "NumPad7", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 7 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 7 + } + }, + { + "category": "core", + "key": "8", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 8 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 8 + } + }, + { + "category": "core", + "key": "NumPad8", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 8 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 8 + } + }, + { + "category": "core", + "key": "9", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 9 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 9 + } + }, + { + "category": "core", + "key": "NumPad9", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Add the digit 9 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 9 + } + }, + { + "category": "core", + "key": "Shift+;", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "command": "workbench.action.showCommands", + "args": { + "$exclude": [] + } + }, + { + "category": "core", + "key": "A", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Insert after", + "command": "dance.modes.insert.after" + }, + { + "category": "helix", + "key": "A", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Insert after", + "command": "dance.modes.insert.after" + }, + { + "category": "core", + "key": "I", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Insert before", + "command": "dance.modes.insert.before" + }, + { + "category": "helix", + "key": "I", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Insert before", + "command": "dance.modes.insert.before" + }, + { + "category": "core", + "key": "Shift+A", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Insert at line end", + "command": "dance.modes.insert.lineEnd" + }, + { + "category": "helix", + "key": "Shift+A", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Insert at line end", + "command": "dance.modes.insert.lineEnd" + }, + { + "category": "core", + "key": "Shift+I", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Insert at line start", + "command": "dance.modes.insert.lineStart" + }, + { + "category": "helix", + "key": "Shift+I", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Insert at line start", + "command": "dance.modes.insert.lineStart" + }, + { + "category": "core", + "key": "Escape", + "when": "editorTextFocus && dance.mode == 'helix/insert'", + "title": "Set mode to Normal", + "command": "dance.modes.set.normal" + }, + { + "category": "helix", + "key": "Escape", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Set mode to Normal", + "command": "dance.modes.set.normal" + }, + { + "category": "helix", + "key": "V", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Set mode to Normal", + "command": "dance.modes.set.normal" + }, + { + "category": "helix", + "key": "V", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Set mode to Select", + "command": "dance.modes.set.select" + }, + { + "category": "core", + "key": "/", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Search", + "command": "dance.search" + }, + { + "category": "core", + "key": "NumPad_Divide", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Search", + "command": "dance.search" + }, + { + "category": "helix", + "key": "Shift+/", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Search backward", + "command": "dance.search.backward" + }, + { + "category": "helix", + "key": "Shift+/", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Search backward (extend)", + "command": "dance.search.backward.extend" + }, + { + "category": "helix", + "key": "/", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Search (extend)", + "command": "dance.search.extend" + }, + { + "category": "core", + "key": "N", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select next match", + "command": "dance.search.next" + }, + { + "category": "helix", + "key": "N", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add next match", + "command": "dance.search.next.add" + }, + { + "category": "helix", + "key": "Shift+N", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select previous match", + "command": "dance.search.previous" + }, + { + "category": "helix", + "key": "Shift+N", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add previous match", + "command": "dance.search.previous.add" + }, + { + "category": "core", + "key": "Shift+Alt+8", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Search current selection", + "command": "dance.search.selection" + }, + { + "category": "core", + "key": "Alt+NumPad_Multiply", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Search current selection", + "command": "dance.search.selection" + }, + { + "category": "core", + "key": "Shift+8", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Search current selection (smart)", + "command": "dance.search.selection.smart" + }, + { + "category": "core", + "key": "NumPad_Multiply", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Search current selection (smart)", + "command": "dance.search.selection.smart" + }, + { + "category": "helix", + "key": "M", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Open match menu", + "command": "dance.openMenu", + "args": { + "menu": "match" + } + }, + { + "category": "helix", + "key": "M", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Open match menu with extend", + "command": "dance.openMenu", + "args": { + "menu": "match", + "pass": [ + { + "shift": "extend" + } + ] + } + }, + { + "category": "core", + "key": "T", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to character (excluded)", + "command": "dance.seek" + }, + { + "category": "helix", + "key": "Shift+T", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to character (excluded, backward)", + "command": "dance.seek.backward" + }, + { + "category": "helix", + "key": "T", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to character (excluded)", + "command": "dance.seek.extend" + }, + { + "category": "helix", + "key": "Shift+T", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to character (excluded, backward)", + "command": "dance.seek.extend.backward" + }, + { + "category": "core", + "key": "F", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to character (included)", + "command": "dance.seek.included" + }, + { + "category": "helix", + "key": "Shift+F", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to character (included, backward)", + "command": "dance.seek.included.backward" + }, + { + "category": "helix", + "key": "F", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to character (included)", + "command": "dance.seek.included.extend" + }, + { + "category": "helix", + "key": "Shift+F", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to character (included, backward)", + "command": "dance.seek.included.extend.backward" + }, + { + "category": "core", + "key": "W", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to next word start", + "command": "dance.seek.word" + }, + { + "category": "core", + "key": "B", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to previous word start", + "command": "dance.seek.word.backward" + }, + { + "category": "helix", + "key": "W", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to next word start", + "command": "dance.seek.word.extend" + }, + { + "category": "helix", + "key": "B", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to previous word start", + "command": "dance.seek.word.extend.backward" + }, + { + "category": "helix", + "key": "Shift+W", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to next non-whitespace word start", + "command": "dance.seek.word.ws" + }, + { + "category": "helix", + "key": "Shift+B", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to previous non-whitespace word start", + "command": "dance.seek.word.ws.backward" + }, + { + "category": "helix", + "key": "Shift+W", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to next non-whitespace word start", + "command": "dance.seek.word.ws.extend" + }, + { + "category": "helix", + "key": "Shift+B", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to previous non-whitespace word start", + "command": "dance.seek.word.ws.extend.backward" + }, + { + "category": "core", + "key": "E", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to next word end", + "command": "dance.seek.wordEnd" + }, + { + "category": "helix", + "key": "E", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to next word end", + "command": "dance.seek.wordEnd.extend" + }, + { + "category": "helix", + "key": "Shift+E", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to next non-whitespace word end", + "command": "dance.seek.wordEnd.ws" + }, + { + "category": "helix", + "key": "Shift+E", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to next non-whitespace word end", + "command": "dance.seek.wordEnd.ws.extend" + }, + { + "category": "helix", + "key": "J", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend down", + "command": "dance.select.down.extend" + }, + { + "category": "helix", + "key": "Down", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend down", + "command": "dance.select.down.extend" + }, + { + "category": "core", + "key": "J", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Jump down", + "command": "dance.select.down.jump" + }, + { + "category": "core", + "key": "Down", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Jump down", + "command": "dance.select.down.jump" + }, + { + "category": "helix", + "key": "H", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend left", + "command": "dance.select.left.extend" + }, + { + "category": "helix", + "key": "Left", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend left", + "command": "dance.select.left.extend" + }, + { + "category": "core", + "key": "H", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Jump left", + "command": "dance.select.left.jump" + }, + { + "category": "core", + "key": "Left", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Jump left", + "command": "dance.select.left.jump" + }, + { + "category": "helix", + "key": "X", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Extend to line below", + "command": "dance.select.line.below.extend" + }, + { + "category": "helix", + "key": "X", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to line below", + "command": "dance.select.line.below.extend" + }, + { + "category": "core", + "key": "End", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to line end", + "command": "dance.select.lineEnd" + }, + { + "category": "helix", + "key": "End", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to line end", + "command": "dance.select.lineEnd.extend" + }, + { + "category": "core", + "key": "Home", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select to line start", + "command": "dance.select.lineStart" + }, + { + "category": "helix", + "key": "Home", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to line start", + "command": "dance.select.lineStart.extend" + }, + { + "category": "helix", + "key": "L", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend right", + "command": "dance.select.right.extend" + }, + { + "category": "helix", + "key": "Right", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend right", + "command": "dance.select.right.extend" + }, + { + "category": "core", + "key": "L", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Jump right", + "command": "dance.select.right.jump" + }, + { + "category": "core", + "key": "Right", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Jump right", + "command": "dance.select.right.jump" + }, + { + "category": "helix", + "key": "G", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend to", + "command": "dance.select.to.extend" + }, + { + "category": "core", + "key": "G", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Go to", + "command": "dance.select.to.jump" + }, + { + "category": "helix", + "key": "K", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend up", + "command": "dance.select.up.extend" + }, + { + "category": "helix", + "key": "Up", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Extend up", + "command": "dance.select.up.extend" + }, + { + "category": "core", + "key": "K", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Jump up", + "command": "dance.select.up.jump" + }, + { + "category": "core", + "key": "Up", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Jump up", + "command": "dance.select.up.jump" + }, + { + "category": "core", + "key": "Ctrl+F", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "command": "dance.select.vertically", + "args": { + "direction": 1, + "by": "page", + "shift": "jump" + } + }, + { + "category": "core", + "key": "Ctrl+F", + "when": "editorTextFocus && dance.mode == 'helix/insert'", + "command": "dance.select.vertically", + "args": { + "direction": 1, + "by": "page", + "shift": "jump" + } + }, + { + "category": "core", + "key": "Ctrl+D", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "command": "dance.select.vertically", + "args": { + "direction": 1, + "by": "halfPage", + "shift": "jump" + } + }, + { + "category": "core", + "key": "Ctrl+D", + "when": "editorTextFocus && dance.mode == 'helix/insert'", + "command": "dance.select.vertically", + "args": { + "direction": 1, + "by": "halfPage", + "shift": "jump" + } + }, + { + "category": "core", + "key": "Ctrl+B", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "command": "dance.select.vertically", + "args": { + "direction": -1, + "by": "page", + "shift": "jump" + } + }, + { + "category": "core", + "key": "Ctrl+B", + "when": "editorTextFocus && dance.mode == 'helix/insert'", + "command": "dance.select.vertically", + "args": { + "direction": -1, + "by": "page", + "shift": "jump" + } + }, + { + "category": "core", + "key": "Ctrl+U", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "command": "dance.select.vertically", + "args": { + "direction": -1, + "by": "halfPage", + "shift": "jump" + } + }, + { + "category": "core", + "key": "Ctrl+U", + "when": "editorTextFocus && dance.mode == 'helix/insert'", + "command": "dance.select.vertically", + "args": { + "direction": -1, + "by": "halfPage", + "shift": "jump" + } + }, + { + "category": "helix", + "key": "Ctrl+F", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.select.vertically", + "args": { + "direction": 1, + "by": "page", + "shift": "extend" + } + }, + { + "category": "helix", + "key": "Ctrl+D", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.select.vertically", + "args": { + "direction": 1, + "by": "halfPage", + "shift": "extend" + } + }, + { + "category": "helix", + "key": "Ctrl+B", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.select.vertically", + "args": { + "direction": -1, + "by": "page", + "shift": "extend" + } + }, + { + "category": "helix", + "key": "Ctrl+U", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.select.vertically", + "args": { + "direction": -1, + "by": "halfPage", + "shift": "extend" + } + }, + { + "category": "core", + "key": "Alt+;", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Change direction of selections", + "command": "dance.selections.changeDirection" + }, + { + "category": "helix", + "key": "Alt+;", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Change direction of selections", + "command": "dance.selections.changeDirection" + }, + { + "category": "core", + "key": "Alt+,", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Clear main selections", + "command": "dance.selections.clear.main" + }, + { + "category": "helix", + "key": "Alt+,", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Clear main selections", + "command": "dance.selections.clear.main" + }, + { + "category": "core", + "key": ",", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Clear secondary selections", + "command": "dance.selections.clear.secondary" + }, + { + "category": "helix", + "key": ",", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Clear secondary selections", + "command": "dance.selections.clear.secondary" + }, + { + "category": "helix", + "key": "Shift+X", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Expand to lines", + "command": "dance.selections.expandToLines" + }, + { + "category": "helix", + "key": "Shift+X", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Expand to lines", + "command": "dance.selections.expandToLines" + }, + { + "category": "core", + "key": "Shift+4", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Filter selections", + "command": "dance.selections.filter" + }, + { + "category": "helix", + "key": "Shift+4", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Filter selections", + "command": "dance.selections.filter" + }, + { + "category": "core", + "key": "Alt+K", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Keep matching selections", + "command": "dance.selections.filter.regexp" + }, + { + "category": "helix", + "key": "Alt+K", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Keep matching selections", + "command": "dance.selections.filter.regexp" + }, + { + "category": "core", + "key": "Shift+Alt+K", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Clear matching selections", + "command": "dance.selections.filter.regexp.inverse" + }, + { + "category": "helix", + "key": "Shift+Alt+K", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Clear matching selections", + "command": "dance.selections.filter.regexp.inverse" + }, + { + "category": "core", + "key": "Shift+Alt+\\", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Pipe selections", + "command": "dance.selections.pipe" + }, + { + "category": "helix", + "key": "Shift+Alt+\\", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Pipe selections", + "command": "dance.selections.pipe" + }, + { + "category": "core", + "key": "Shift+1", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Pipe and append", + "command": "dance.selections.pipe.append" + }, + { + "category": "helix", + "key": "Shift+1", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Pipe and append", + "command": "dance.selections.pipe.append" + }, + { + "category": "core", + "key": "Shift+Alt+1", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Pipe and prepend", + "command": "dance.selections.pipe.prepend" + }, + { + "category": "helix", + "key": "Shift+Alt+1", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Pipe and prepend", + "command": "dance.selections.pipe.prepend" + }, + { + "category": "core", + "key": "Shift+\\", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Pipe and replace", + "command": "dance.selections.pipe.replace" + }, + { + "category": "helix", + "key": "Shift+\\", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Pipe and replace", + "command": "dance.selections.pipe.replace" + }, + { + "category": "core", + "key": ";", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Reduce selections to their cursor", + "command": "dance.selections.reduce" + }, + { + "category": "helix", + "key": ";", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Reduce selections to their cursor", + "command": "dance.selections.reduce" + }, + { + "category": "core", + "key": "Y", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Copy selections text", + "command": "dance.selections.saveText" + }, + { + "category": "helix", + "key": "Y", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Copy selections text", + "command": "dance.selections.saveText" + }, + { + "category": "core", + "key": "S", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Leap or select", + "command": "dance.selections.select.orLeap" + }, + { + "category": "helix", + "key": "S", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Leap or select", + "command": "dance.selections.select.orLeap" + }, + { + "category": "core", + "key": "Shift+S", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Split selections", + "command": "dance.selections.split" + }, + { + "category": "helix", + "key": "Shift+S", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Split selections", + "command": "dance.selections.split" + }, + { + "category": "core", + "key": "Alt+S", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Leap or select backward", + "command": "dance.selections.splitLines.orLeap.backward" + }, + { + "category": "helix", + "key": "Alt+S", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Leap or select backward", + "command": "dance.selections.splitLines.orLeap.backward" + }, + { + "category": "core", + "key": "Alt+X", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Trim lines", + "command": "dance.selections.trimLines" + }, + { + "category": "helix", + "key": "Alt+X", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Trim lines", + "command": "dance.selections.trimLines" + }, + { + "category": "core", + "key": "Shift+-", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Trim whitespace", + "command": "dance.selections.trimWhitespace" + }, + { + "category": "helix", + "key": "Shift+-", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Trim whitespace", + "command": "dance.selections.trimWhitespace" + }, + { + "category": "helix", + "key": "Shift+Alt+0", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Rotate selections clockwise (contents only)", + "command": "dance.selections.rotate.contents" + }, + { + "category": "helix", + "key": "Shift+Alt+0", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Rotate selections clockwise (contents only)", + "command": "dance.selections.rotate.contents" + }, + { + "category": "helix", + "key": "Shift+Alt+9", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Rotate selections counter-clockwise (contents only)", + "command": "dance.selections.rotate.contents.reverse" + }, + { + "category": "helix", + "key": "Shift+Alt+9", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Rotate selections counter-clockwise (contents only)", + "command": "dance.selections.rotate.contents.reverse" + }, + { + "category": "core", + "key": "Shift+0", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Rotate selections clockwise (selections only)", + "command": "dance.selections.rotate.selections" + }, + { + "category": "core", + "key": "Shift+9", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Rotate selections counter-clockwise (selections only)", + "command": "dance.selections.rotate.selections.reverse" + }, + { + "category": "helix", + "key": "Shift+9", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Rotate selections counter-clockwise (selections only)", + "command": "dance.selections.rotate.selections.reverse" + }, + { + "category": "helix", + "key": "Z", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Show view menu", + "command": "dance.openMenu", + "args": { + "menu": "view", + "$exclude": [] + } + }, + { + "category": "helix", + "key": "Z", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Show view menu", + "command": "dance.openMenu", + "args": { + "menu": "view", + "$exclude": [] + } + }, + { + "category": "helix", + "key": "Shift+Z", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Show view menu (locked)", + "command": "dance.openMenu", + "args": { + "menu": "view", + "locked": true, + "$exclude": [] + } + }, + { + "category": "helix", + "key": "Shift+Z", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Show view menu (locked)", + "command": "dance.openMenu", + "args": { + "menu": "view", + "locked": true, + "$exclude": [] + } + }, + { + "key": "Q", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+C", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+D", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+G", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+H", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+K", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+L", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+M", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+Q", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+R", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+V", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+Y", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+2", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+3", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+5", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+6", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "'", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "-", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "=", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Tab", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Space", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "NumPad_Add", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "NumPad_Subtract", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+=", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+Tab", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+Space", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+NumPad_Add", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Shift+NumPad_Subtract", + "command": "dance.ignore", + "when": "dance.mode == 'helix/normal'" + }, + { + "key": "Q", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "R", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "0", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "1", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "2", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "3", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "4", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "5", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "6", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "7", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "8", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "9", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+C", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+D", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+G", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+H", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+K", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+L", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+M", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+Q", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+R", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+V", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+Y", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+0", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+2", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+3", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+5", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+6", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+7", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+8", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "'", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "-", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "=", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Tab", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Space", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "NumPad_Add", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "NumPad_Subtract", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+'", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+=", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+Tab", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+Space", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+NumPad_Add", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + }, + { + "key": "Shift+NumPad_Subtract", + "command": "dance.ignore", + "when": "dance.mode == 'helix/select'" + } + ] + } +} diff --git a/meta.ts b/meta.ts index c6db3888..f6378d4d 100644 --- a/meta.ts +++ b/meta.ts @@ -460,6 +460,15 @@ export declare namespace Builder { line: number; } + export interface Keybinding { + readonly title?: string; + readonly key: string; + readonly when: string; + readonly command: string; + readonly category?: string; + readonly args?: any; + } + export interface ParsedModule { readonly path: string; readonly name: string; @@ -476,13 +485,7 @@ export declare namespace Builder { readonly enablement?: string; }[]; - readonly keybindings: { - readonly title?: string; - readonly key: string; - readonly when: string; - readonly command: string; - readonly args?: any; - }[]; + readonly keybindings: Keybinding[]; } } @@ -518,10 +521,6 @@ export function parseKeys(keys: string) { const remainingKeybinding = keybinding.replace(/[csa]-/g, ""), whenClauses = ["editorTextFocus"]; - - if (category !== "core") { - whenClauses.push(`dance.behavior == '${category}'`); - } for (let tag of tags.split(", ")) { const negate = tag.startsWith("!"); if (negate) { @@ -603,11 +602,10 @@ function getCommands(module: Omit) { /** * Returns all defined keybindings in the given module. */ -function getKeybindings(module: Omit) { +function getKeybindings(module: Omit): Builder.Keybinding[] { return [ ...module.functions.flatMap((f) => parseKeys(f.properties["keys"] ?? "").map((key) => ({ - key: key.key, - when: key.when, + ...key, title: f.summary, command: `dance.${f.qualifiedName}`, }))), @@ -619,8 +617,7 @@ function getKeybindings(module: Omit) { if (qualifiedIdentifier !== undefined) { return parsedKeys.map((key) => ({ - key: key.key, - when: key.when, + ...key, title, command: `dance.${qualifiedIdentifier}`, })); @@ -637,8 +634,7 @@ function getKeybindings(module: Omit) { } return parsedKeys.map((key) => ({ - key: key.key, - when: key.when, + ...key, title, command, args: parsedCommands[0][1], @@ -646,8 +642,7 @@ function getKeybindings(module: Omit) { } return parsedKeys.map((key) => ({ - key: key.key, - when: key.when, + ...key, title, command: "dance.run", args: { @@ -658,6 +653,36 @@ function getKeybindings(module: Omit) { ].sort((a, b) => a.command.localeCompare(b.command)); } +export function generateIgnoredKeybinds( + currentKeybindings: Builder.Keybinding[], + when: string, +): Builder.Keybinding[] { + const alphanum = [..."ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"], + symbols = [...",'-=", "Tab", "Space", "NumPad_Add", "NumPad_Subtract"], + keysToAssign = new Set([ + ...alphanum, + ...alphanum.map((x) => `Shift+${x}`), + ...symbols, + ...symbols.map((x) => `Shift+${x}`), + ]), + ignoredKeybindings: Builder.Keybinding[] = []; + + const unassignedKeys = new Set(keysToAssign); + for (const keybinding of currentKeybindings) { + unassignedKeys.delete(keybinding.key); + } + + for (const unassignedKey of unassignedKeys) { + ignoredKeybindings.push({ + key: unassignedKey, + command: "dance.ignore", + when, + }); + } + + return ignoredKeybindings; +} + /** * Given a multiline string, returns the same string with all lines starting * with an indentation `>= by` reduced by `by` spaces. diff --git a/package.build.ts b/package.build.ts index 76489367..f0da06bb 100644 --- a/package.build.ts +++ b/package.build.ts @@ -1,4 +1,4 @@ -import type { Builder } from "./meta"; +import { type Builder, generateIgnoredKeybinds } from "./meta"; import { availableClipboardRegisters } from "./src/utils/constants"; // Shared values @@ -22,7 +22,7 @@ const builtinModesAreDeprecatedMessage = "Built-in modes are deprecated. Use `#dance.modes#` instead."; const modeNamePattern = { - pattern: /^[a-zA-Z]\w*$/.source, + pattern: /^[a-zA-Z]\w*\/?\w*$/.source, patternErrorMessage: "", }; @@ -129,6 +129,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ "publish": "vsce publish --allow-star-activation", "package:pre": `vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json ${version.replace(/\d+$/, "$&" + preRelease.toString().padStart(3, "0"))}`, "publish:pre": `vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json ${version.replace(/\d+$/, "$&" + preRelease.toString().padStart(3, "0"))}`, + "package-helix": `cd extensions/helix && npm run package`, }, devDependencies: { @@ -206,12 +207,6 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ description: "Controls which mode is set by default when an editor is opened.", ...modeNamePattern, }, - "dance.behavior": { - enum: ["kakoune", "helix"], - enumItemLabels: ["Kakoune", "Helix"], - description: "Controls which base set of editor keybinds to use", - default: "kakoune", - }, "dance.modes": { type: "object", scope: "language-overridable", @@ -591,13 +586,13 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ }, }, } as Record}>, + { items: Record }>, }, "dance.systemClipboardRegister": { enum: ["dquote", null, ...availableClipboardRegisters], enumItemLabels: ['"', "None"], - enumDescriptions:["The default yank register", "Disables using the system clipboard"], + enumDescriptions: ["The default yank register", "Disables using the system clipboard"], default: "dquote", description: "Controls which register maps to the system clipboard.", }, @@ -761,42 +756,16 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ // TODO: unassign default keybindings, and force the user to explicitly set // them up. keybindings: (() => { - const keybindings = modules.flatMap((module) => module.keybindings), - alphanum = [..."ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"], - symbols = [...",'-=", "Tab", "Space", "NumPad_Add", "NumPad_Subtract"], - keysToAssign = new Set([ - ...alphanum, - ...alphanum.map((x) => `Shift+${x}`), - ...symbols, - ...symbols.map((x) => `Shift+${x}`), - ]); - - for (const [category, mode] of [ - ["kakoune", "normal"], - ["helix", "normal"], - ["helix", "select"], - ]) { - const unassignedKeys = new Set(keysToAssign); - for (const keybinding of keybindings) { - const isInCategory = - keybinding.when.includes(`dance.behavior == '${category}'`) || !keybinding.when.includes("dance.behavior"); - const isMode = keybinding.when.includes(`dance.mode == '${mode}'`); - if (isMode && isInCategory) { - unassignedKeys.delete(keybinding.key); - } - } - - for (const unassignedKey of unassignedKeys) { - keybindings.push({ - key: unassignedKey, - command: "dance.ignore", - when: `dance.mode == '${mode}' && dance.behavior == '${category}'`, - }); - } - } - - return keybindings; + const keybindings = modules + .flatMap((module) => module.keybindings) + .filter((keybinding) => ["core", "kakoune", undefined].includes(keybinding.category)); + + return [ + ...keybindings, + ...generateIgnoredKeybinds(keybindings,`dance.mode == 'normal'`), + ]; })(), + }, }); diff --git a/package.json b/package.json index c6debb29..4b88c4c1 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,8 @@ "package": "vsce package --allow-star-activation", "publish": "vsce publish --allow-star-activation", "package:pre": "vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.5.15001", - "publish:pre": "vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.5.15001" + "publish:pre": "vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.5.15001", + "package-helix": "cd extensions/helix && npm run package" }, "devDependencies": { "@types/glob": "^7.2.0", @@ -93,28 +94,16 @@ "scope": "language-overridable", "default": "normal", "description": "Controls which mode is set by default when an editor is opened.", - "pattern": "^[a-zA-Z]\\w*$", + "pattern": "^[a-zA-Z]\\w*\\/?\\w*$", "patternErrorMessage": "" }, - "dance.behavior": { - "enum": [ - "kakoune", - "helix" - ], - "enumItemLabels": [ - "Kakoune", - "Helix" - ], - "description": "Controls which base set of editor keybinds to use", - "default": "kakoune" - }, "dance.modes": { "type": "object", "scope": "language-overridable", "additionalProperties": { "type": "object", "propertyNames": { - "pattern": "^[a-zA-Z]\\w*$", + "pattern": "^[a-zA-Z]\\w*\\/?\\w*$", "patternErrorMessage": "" }, "properties": { @@ -124,7 +113,7 @@ "null" ], "description": "Controls how default configuration options are obtained for this mode. Specify a string to inherit from the mode with the given name, and null to inherit from the VS Code configuration.", - "pattern": "^[a-zA-Z]\\w*$", + "pattern": "^[a-zA-Z]\\w*\\/?\\w*$", "patternErrorMessage": "" }, "cursorStyle": { @@ -2788,366 +2777,294 @@ }, "keybindings": [ { + "category": "core", "key": "Shift+7", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Align selections", "command": "dance.edit.align" }, { + "category": "kakoune", "key": "Alt+`", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Swap case", - "command": "dance.edit.case.swap" - }, - { - "key": "Shift+`", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", - "title": "Swap case", - "command": "dance.edit.case.swap" - }, - { - "key": "Shift+`", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Swap case", "command": "dance.edit.case.swap" }, { + "category": "core", "key": "`", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Transform to lower case", "command": "dance.edit.case.toLower" }, { - "key": "`", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Transform to lower case", - "command": "dance.edit.case.toLower" - }, - { + "category": "kakoune", "key": "Shift+`", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Transform to upper case", - "command": "dance.edit.case.toUpper" - }, - { - "key": "Alt+`", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", - "title": "Transform to upper case", - "command": "dance.edit.case.toUpper" - }, - { - "key": "Alt+`", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Transform to upper case", "command": "dance.edit.case.toUpper" }, { + "category": "kakoune", "key": "Shift+Alt+7", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy indentation", "command": "dance.edit.copyIndentation" }, { + "category": "kakoune", "key": "Shift+Alt+,", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Deindent selected lines", "command": "dance.edit.deindent" }, { + "category": "core", "key": "Shift+,", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Deindent selected lines (including incomplete indent)", "command": "dance.edit.deindent.withIncomplete" }, { - "key": "Shift+,", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Deindent selected lines (including incomplete indent)", - "command": "dance.edit.deindent.withIncomplete" - }, - { + "category": "core", "key": "Alt+D", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Delete", "command": "dance.edit.delete" }, { - "key": "Alt+D", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Delete", - "command": "dance.edit.delete" - }, - { + "category": "kakoune", "key": "Alt+C", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Delete and switch to Insert", "command": "dance.edit.delete-insert" }, { + "category": "core", "key": "Shift+.", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Indent selected lines", "command": "dance.edit.indent" }, { - "key": "Shift+.", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Indent selected lines", - "command": "dance.edit.indent" - }, - { + "category": "kakoune", "key": "Shift+Alt+.", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Indent selected lines (including empty lines)", "command": "dance.edit.indent.withEmpty" }, { + "category": "kakoune", "key": "Shift+Alt+R", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert contents of register", "command": "dance.edit.insert" }, { + "category": "kakoune", "key": "Alt+J", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Join lines", "command": "dance.edit.join" }, { - "key": "Shift+J", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Join lines", - "command": "dance.edit.join" - }, - { + "category": "core", "key": "Shift+Alt+J", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Join lines and select inserted separators", "command": "dance.edit.join.select" }, { - "key": "Shift+Alt+J", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Join lines and select inserted separators", - "command": "dance.edit.join.select" - }, - { + "category": "kakoune", "key": "Shift+Alt+O", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert new line above each selection", "command": "dance.edit.newLine.above" }, { + "category": "core", "key": "Shift+O", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert new line above and switch to insert", "command": "dance.edit.newLine.above.insert" }, { - "key": "Shift+O", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Insert new line above and switch to insert", - "command": "dance.edit.newLine.above.insert" - }, - { + "category": "kakoune", "key": "Alt+O", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert new line below each selection", "command": "dance.edit.newLine.below" }, { + "category": "core", "key": "O", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert new line below and switch to insert", "command": "dance.edit.newLine.below.insert" }, { - "key": "O", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Insert new line below and switch to insert", - "command": "dance.edit.newLine.below.insert" - }, - { - "key": "P", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Paste after", - "command": "dance.edit.paste.after" - }, - { + "category": "core", "key": "P", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Paste after and select", "command": "dance.edit.paste.after.select" }, { - "key": "Shift+P", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Paste before", - "command": "dance.edit.paste.before" - }, - { + "category": "core", "key": "Shift+P", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Paste before and select", "command": "dance.edit.paste.before.select" }, { + "category": "kakoune", "key": "Alt+P", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Paste all after and select", "command": "dance.edit.pasteAll.after.select" }, { + "category": "kakoune", "key": "Shift+Alt+P", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Paste all before and select", "command": "dance.edit.pasteAll.before.select" }, { + "category": "core", "key": "R", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Replace characters", "command": "dance.edit.replaceCharacters" }, { + "category": "kakoune", "key": "Ctrl+R", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pick register and replace", "command": "dance.edit.selectRegister-insert" }, { + "category": "kakoune", "key": "Ctrl+R", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert'", + "when": "editorTextFocus && dance.mode == 'insert'", "title": "Pick register and replace", "command": "dance.edit.selectRegister-insert" }, { + "category": "core", "key": "D", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy and delete", "command": "dance.edit.yank-delete" }, { - "key": "D", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Copy and delete", - "command": "dance.edit.yank-delete" - }, - { + "category": "core", "key": "C", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy, delete and switch to Insert", "command": "dance.edit.yank-delete-insert" }, { - "key": "C", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Copy, delete and switch to Insert", - "command": "dance.edit.yank-delete-insert" - }, - { + "category": "kakoune", "key": "Shift+R", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy and replace", "command": "dance.edit.yank-replace" }, { + "category": "kakoune", "key": "Q", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Replay recording", "command": "dance.history.recording.play" }, { + "category": "kakoune", "key": "Shift+Q", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && !dance.isRecording", + "when": "editorTextFocus && dance.mode == 'normal' && !dance.isRecording", "title": "Start recording", "command": "dance.history.recording.start" }, { + "category": "kakoune", "key": "Escape", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording", + "when": "editorTextFocus && dance.mode == 'normal' && dance.isRecording", "title": "Stop recording", "command": "dance.history.recording.stop" }, { + "category": "kakoune", "key": "Shift+Q", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording", + "when": "editorTextFocus && dance.mode == 'normal' && dance.isRecording", "title": "Stop recording", "command": "dance.history.recording.stop" }, { + "category": "core", "key": "Shift+U", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Redo", "command": "dance.history.redo" }, { - "key": "Shift+U", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Redo", - "command": "dance.history.redo" - }, - { + "category": "kakoune", "key": "Shift+Alt+U", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Redo a change of selections", "command": "dance.history.redo.selections" }, { + "category": "core", "key": ".", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Repeat last edit without a command", "command": "dance.history.repeat.edit" }, { + "category": "core", "key": "NumPad_Decimal", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Repeat last edit without a command", "command": "dance.history.repeat.edit" }, { + "category": "core", "key": "Alt+.", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Repeat last seek", "command": "dance.history.repeat.seek" }, { - "key": "Alt+.", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Repeat last seek", - "command": "dance.history.repeat.seek" - }, - { + "category": "core", "key": "U", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Undo", "command": "dance.history.undo" }, { - "key": "U", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Undo", - "command": "dance.history.undo" - }, - { + "category": "kakoune", "key": "Alt+U", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Undo a change of selections", "command": "dance.history.undo.selections" }, { + "category": "core", "key": "Escape", "when": "editorTextFocus && dance.mode == 'normal' && !dance.isRecording && !markersNavigationVisible", "title": "Cancel Dance operation", "command": "dance.cancel" }, { + "category": "core", "key": "Escape", "when": "editorTextFocus && dance.mode == 'input'", "title": "Cancel Dance operation", "command": "dance.cancel" }, { + "category": "core", "key": "Up", "when": "inputFocus && dance.inPrompt", "command": "dance.changeInput", @@ -3156,6 +3073,7 @@ } }, { + "category": "core", "key": "Down", "when": "inputFocus && dance.inPrompt", "command": "dance.changeInput", @@ -3164,12 +3082,14 @@ } }, { + "category": "core", "key": "Shift+'", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select register for next command", "command": "dance.selectRegister" }, { + "category": "core", "key": "0", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 0 to the counter", @@ -3179,6 +3099,7 @@ } }, { + "category": "core", "key": "NumPad0", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 0 to the counter", @@ -3188,6 +3109,7 @@ } }, { + "category": "core", "key": "1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 1 to the counter", @@ -3197,6 +3119,7 @@ } }, { + "category": "core", "key": "NumPad1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 1 to the counter", @@ -3206,6 +3129,7 @@ } }, { + "category": "core", "key": "2", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 2 to the counter", @@ -3215,6 +3139,7 @@ } }, { + "category": "core", "key": "NumPad2", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 2 to the counter", @@ -3224,6 +3149,7 @@ } }, { + "category": "core", "key": "3", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 3 to the counter", @@ -3233,6 +3159,7 @@ } }, { + "category": "core", "key": "NumPad3", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 3 to the counter", @@ -3242,6 +3169,7 @@ } }, { + "category": "core", "key": "4", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 4 to the counter", @@ -3251,6 +3179,7 @@ } }, { + "category": "core", "key": "NumPad4", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 4 to the counter", @@ -3260,6 +3189,7 @@ } }, { + "category": "core", "key": "5", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 5 to the counter", @@ -3269,6 +3199,7 @@ } }, { + "category": "core", "key": "NumPad5", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 5 to the counter", @@ -3278,6 +3209,7 @@ } }, { + "category": "core", "key": "6", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 6 to the counter", @@ -3287,6 +3219,7 @@ } }, { + "category": "core", "key": "NumPad6", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 6 to the counter", @@ -3296,6 +3229,7 @@ } }, { + "category": "core", "key": "7", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 7 to the counter", @@ -3305,6 +3239,7 @@ } }, { + "category": "core", "key": "NumPad7", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 7 to the counter", @@ -3314,6 +3249,7 @@ } }, { + "category": "core", "key": "8", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 8 to the counter", @@ -3323,6 +3259,7 @@ } }, { + "category": "core", "key": "NumPad8", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 8 to the counter", @@ -3332,6 +3269,7 @@ } }, { + "category": "core", "key": "9", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 9 to the counter", @@ -3341,6 +3279,7 @@ } }, { + "category": "core", "key": "NumPad9", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 9 to the counter", @@ -3350,6 +3289,7 @@ } }, { + "category": "core", "key": "Shift+;", "when": "editorTextFocus && dance.mode == 'normal'", "command": "workbench.action.showCommands", @@ -3358,750 +3298,588 @@ } }, { + "category": "core", "key": "A", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert after", "command": "dance.modes.insert.after" }, { - "key": "A", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Insert after", - "command": "dance.modes.insert.after" - }, - { + "category": "core", "key": "I", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert before", "command": "dance.modes.insert.before" }, { - "key": "I", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Insert before", - "command": "dance.modes.insert.before" - }, - { + "category": "core", "key": "Shift+A", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert at line end", "command": "dance.modes.insert.lineEnd" }, { - "key": "Shift+A", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Insert at line end", - "command": "dance.modes.insert.lineEnd" - }, - { + "category": "core", "key": "Shift+I", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert at line start", "command": "dance.modes.insert.lineStart" }, { - "key": "Shift+I", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Insert at line start", - "command": "dance.modes.insert.lineStart" - }, - { + "category": "core", "key": "Escape", "when": "editorTextFocus && dance.mode == 'insert'", "title": "Set mode to Normal", "command": "dance.modes.set.normal" }, { - "key": "Escape", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Set mode to Normal", - "command": "dance.modes.set.normal" - }, - { - "key": "V", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Set mode to Normal", - "command": "dance.modes.set.normal" - }, - { - "key": "V", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", - "title": "Set mode to Select", - "command": "dance.modes.set.select" - }, - { + "category": "kakoune", "key": "Ctrl+V", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Temporary Insert mode", "command": "dance.modes.set.temporarily.insert" }, { + "category": "kakoune", "key": "Ctrl+V", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert'", + "when": "editorTextFocus && dance.mode == 'insert'", "title": "Temporary Normal mode", "command": "dance.modes.set.temporarily.normal" }, { + "category": "core", "key": "/", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search", "command": "dance.search" }, { + "category": "core", "key": "NumPad_Divide", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search", "command": "dance.search" }, { + "category": "kakoune", "key": "Alt+/", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Search backward", - "command": "dance.search.backward" - }, - { - "key": "Shift+/", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search backward", "command": "dance.search.backward" }, { + "category": "kakoune", "key": "Shift+Alt+/", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Search backward (extend)", - "command": "dance.search.backward.extend" - }, - { - "key": "Shift+/", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search backward (extend)", "command": "dance.search.backward.extend" }, { + "category": "kakoune", "key": "Shift+/", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Search (extend)", - "command": "dance.search.extend" - }, - { - "key": "/", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search (extend)", "command": "dance.search.extend" }, { + "category": "core", "key": "N", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select next match", "command": "dance.search.next" }, { + "category": "kakoune", "key": "Shift+N", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Add next match", - "command": "dance.search.next.add" - }, - { - "key": "N", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add next match", "command": "dance.search.next.add" }, { + "category": "kakoune", "key": "Alt+N", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Select previous match", - "command": "dance.search.previous" - }, - { - "key": "Shift+N", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select previous match", "command": "dance.search.previous" }, { + "category": "kakoune", "key": "Shift+Alt+N", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Add previous match", - "command": "dance.search.previous.add" - }, - { - "key": "Shift+N", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add previous match", "command": "dance.search.previous.add" }, { + "category": "core", "key": "Shift+Alt+8", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search current selection", "command": "dance.search.selection" }, { + "category": "core", "key": "Alt+NumPad_Multiply", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search current selection", "command": "dance.search.selection" }, { + "category": "core", "key": "Shift+8", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search current selection (smart)", "command": "dance.search.selection.smart" }, { + "category": "core", "key": "NumPad_Multiply", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search current selection (smart)", "command": "dance.search.selection.smart" }, { + "category": "core", "key": "T", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to character (excluded)", "command": "dance.seek" }, { + "category": "kakoune", "key": "Alt+A", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select whole object", "command": "dance.seek.askObject" }, { + "category": "kakoune", "key": "Alt+A", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert'", + "when": "editorTextFocus && dance.mode == 'insert'", "title": "Select whole object", "command": "dance.seek.askObject" }, { + "category": "kakoune", "key": "]", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to whole object end", "command": "dance.seek.askObject.end" }, { + "category": "kakoune", "key": "Shift+]", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to whole object end", "command": "dance.seek.askObject.end.extend" }, { + "category": "kakoune", "key": "Alt+I", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select inner object", "command": "dance.seek.askObject.inner" }, { + "category": "kakoune", "key": "Alt+I", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert'", + "when": "editorTextFocus && dance.mode == 'insert'", "title": "Select inner object", "command": "dance.seek.askObject.inner" }, { + "category": "kakoune", "key": "Alt+]", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to inner object end", "command": "dance.seek.askObject.inner.end" }, { + "category": "kakoune", "key": "Shift+Alt+]", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to inner object end", "command": "dance.seek.askObject.inner.end.extend" }, { + "category": "kakoune", "key": "Alt+[", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to inner object start", "command": "dance.seek.askObject.inner.start" }, { + "category": "kakoune", "key": "Shift+Alt+[", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to inner object start", "command": "dance.seek.askObject.inner.start.extend" }, { + "category": "kakoune", "key": "[", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to whole object start", "command": "dance.seek.askObject.start" }, { + "category": "kakoune", "key": "Shift+[", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to whole object start", "command": "dance.seek.askObject.start.extend" }, { + "category": "kakoune", "key": "Alt+T", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Select to character (excluded, backward)", - "command": "dance.seek.backward" - }, - { - "key": "Shift+T", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to character (excluded, backward)", "command": "dance.seek.backward" }, { + "category": "kakoune", "key": "M", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next enclosing character", "command": "dance.seek.enclosing" }, { + "category": "kakoune", "key": "Alt+M", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to previous enclosing character", "command": "dance.seek.enclosing.backward" }, { + "category": "kakoune", "key": "Shift+M", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next enclosing character", "command": "dance.seek.enclosing.extend" }, { + "category": "kakoune", "key": "Shift+Alt+M", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to previous enclosing character", "command": "dance.seek.enclosing.extend.backward" }, { + "category": "kakoune", "key": "Shift+T", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to character (excluded)", - "command": "dance.seek.extend" - }, - { - "key": "T", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to character (excluded)", "command": "dance.seek.extend" }, { + "category": "kakoune", "key": "Shift+Alt+T", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to character (excluded, backward)", - "command": "dance.seek.extend.backward" - }, - { - "key": "Shift+T", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to character (excluded, backward)", "command": "dance.seek.extend.backward" }, { + "category": "core", "key": "F", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to character (included)", "command": "dance.seek.included" }, { + "category": "kakoune", "key": "Alt+F", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Select to character (included, backward)", - "command": "dance.seek.included.backward" - }, - { - "key": "Shift+F", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to character (included, backward)", "command": "dance.seek.included.backward" }, { + "category": "kakoune", "key": "Shift+F", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to character (included)", - "command": "dance.seek.included.extend" - }, - { - "key": "F", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to character (included)", "command": "dance.seek.included.extend" }, { + "category": "kakoune", "key": "Shift+Alt+F", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to character (included, backward)", - "command": "dance.seek.included.extend.backward" - }, - { - "key": "Shift+F", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to character (included, backward)", "command": "dance.seek.included.extend.backward" }, { + "category": "core", "key": "W", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next word start", "command": "dance.seek.word" }, { + "category": "core", "key": "B", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to previous word start", "command": "dance.seek.word.backward" }, { + "category": "kakoune", "key": "Shift+W", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to next word start", - "command": "dance.seek.word.extend" - }, - { - "key": "W", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next word start", "command": "dance.seek.word.extend" }, { + "category": "kakoune", "key": "Shift+B", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to previous word start", - "command": "dance.seek.word.extend.backward" - }, - { - "key": "B", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to previous word start", "command": "dance.seek.word.extend.backward" }, { + "category": "kakoune", "key": "Alt+W", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Select to next non-whitespace word start", - "command": "dance.seek.word.ws" - }, - { - "key": "Shift+W", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next non-whitespace word start", "command": "dance.seek.word.ws" }, { + "category": "kakoune", "key": "Alt+B", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Select to previous non-whitespace word start", - "command": "dance.seek.word.ws.backward" - }, - { - "key": "Shift+B", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to previous non-whitespace word start", "command": "dance.seek.word.ws.backward" }, { + "category": "kakoune", "key": "Shift+Alt+W", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to next non-whitespace word start", - "command": "dance.seek.word.ws.extend" - }, - { - "key": "Shift+W", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next non-whitespace word start", "command": "dance.seek.word.ws.extend" }, { + "category": "kakoune", "key": "Shift+Alt+B", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to previous non-whitespace word start", - "command": "dance.seek.word.ws.extend.backward" - }, - { - "key": "Shift+B", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to previous non-whitespace word start", "command": "dance.seek.word.ws.extend.backward" }, { + "category": "core", "key": "E", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next word end", "command": "dance.seek.wordEnd" }, { + "category": "kakoune", "key": "Shift+E", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to next word end", - "command": "dance.seek.wordEnd.extend" - }, - { - "key": "E", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next word end", "command": "dance.seek.wordEnd.extend" }, { + "category": "kakoune", "key": "Alt+E", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Select to next non-whitespace word end", - "command": "dance.seek.wordEnd.ws" - }, - { - "key": "Shift+E", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next non-whitespace word end", "command": "dance.seek.wordEnd.ws" }, { + "category": "kakoune", "key": "Shift+Alt+E", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to next non-whitespace word end", - "command": "dance.seek.wordEnd.ws.extend" - }, - { - "key": "Shift+E", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next non-whitespace word end", "command": "dance.seek.wordEnd.ws.extend" }, { + "category": "kakoune", "key": "Shift+5", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select whole buffer", "command": "dance.select.buffer" }, { + "category": "kakoune", "key": "Shift+J", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend down", "command": "dance.select.down.extend" }, { + "category": "kakoune", "key": "Shift+Down", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend down", - "command": "dance.select.down.extend" - }, - { - "key": "J", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Extend down", - "command": "dance.select.down.extend" - }, - { - "key": "Down", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend down", "command": "dance.select.down.extend" }, { + "category": "core", "key": "J", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump down", "command": "dance.select.down.jump" }, { + "category": "core", "key": "Down", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump down", "command": "dance.select.down.jump" }, { + "category": "kakoune", "key": "Shift+H", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend left", "command": "dance.select.left.extend" }, { + "category": "kakoune", "key": "Shift+Left", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend left", - "command": "dance.select.left.extend" - }, - { - "key": "H", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Extend left", - "command": "dance.select.left.extend" - }, - { - "key": "Left", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend left", "command": "dance.select.left.extend" }, { + "category": "core", "key": "H", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump left", "command": "dance.select.left.jump" }, { + "category": "core", "key": "Left", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump left", "command": "dance.select.left.jump" }, { - "key": "X", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", - "title": "Extend to line below", - "command": "dance.select.line.below.extend" - }, - { - "key": "X", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Extend to line below", - "command": "dance.select.line.below.extend" - }, - { + "category": "kakoune", "key": "Alt+L", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to line end", "command": "dance.select.lineEnd" }, { + "category": "core", "key": "End", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to line end", "command": "dance.select.lineEnd" }, { + "category": "kakoune", "key": "Shift+Alt+L", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to line end", "command": "dance.select.lineEnd.extend" }, { + "category": "kakoune", "key": "Shift+End", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to line end", - "command": "dance.select.lineEnd.extend" - }, - { - "key": "End", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to line end", "command": "dance.select.lineEnd.extend" }, { + "category": "kakoune", "key": "Alt+H", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to line start", "command": "dance.select.lineStart" }, { + "category": "core", "key": "Home", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to line start", "command": "dance.select.lineStart" }, { + "category": "kakoune", "key": "Shift+Alt+H", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to line start", "command": "dance.select.lineStart.extend" }, { + "category": "kakoune", "key": "Shift+Home", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to line start", - "command": "dance.select.lineStart.extend" - }, - { - "key": "Home", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to line start", "command": "dance.select.lineStart.extend" }, { + "category": "kakoune", "key": "Shift+L", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend right", "command": "dance.select.right.extend" }, { + "category": "kakoune", "key": "Shift+Right", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend right", - "command": "dance.select.right.extend" - }, - { - "key": "L", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Extend right", - "command": "dance.select.right.extend" - }, - { - "key": "Right", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend right", "command": "dance.select.right.extend" }, { + "category": "core", "key": "L", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump right", "command": "dance.select.right.jump" }, { + "category": "core", "key": "Right", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump right", "command": "dance.select.right.jump" }, { + "category": "kakoune", "key": "Shift+G", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend to", - "command": "dance.select.to.extend" - }, - { - "key": "G", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to", "command": "dance.select.to.extend" }, { + "category": "core", "key": "G", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Go to", "command": "dance.select.to.jump" }, { + "category": "kakoune", "key": "Shift+K", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend up", "command": "dance.select.up.extend" }, { + "category": "kakoune", "key": "Shift+Up", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Extend up", - "command": "dance.select.up.extend" - }, - { - "key": "K", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Extend up", - "command": "dance.select.up.extend" - }, - { - "key": "Up", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend up", "command": "dance.select.up.extend" }, { + "category": "core", "key": "K", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump up", "command": "dance.select.up.jump" }, { + "category": "core", "key": "Up", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump up", "command": "dance.select.up.jump" }, { + "category": "core", "key": "Ctrl+F", "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.select.vertically", @@ -4112,6 +3890,7 @@ } }, { + "category": "core", "key": "Ctrl+F", "when": "editorTextFocus && dance.mode == 'insert'", "command": "dance.select.vertically", @@ -4122,6 +3901,7 @@ } }, { + "category": "core", "key": "Ctrl+D", "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.select.vertically", @@ -4132,6 +3912,7 @@ } }, { + "category": "core", "key": "Ctrl+D", "when": "editorTextFocus && dance.mode == 'insert'", "command": "dance.select.vertically", @@ -4142,6 +3923,7 @@ } }, { + "category": "core", "key": "Ctrl+B", "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.select.vertically", @@ -4152,6 +3934,7 @@ } }, { + "category": "core", "key": "Ctrl+B", "when": "editorTextFocus && dance.mode == 'insert'", "command": "dance.select.vertically", @@ -4162,6 +3945,7 @@ } }, { + "category": "core", "key": "Ctrl+U", "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.select.vertically", @@ -4172,6 +3956,7 @@ } }, { + "category": "core", "key": "Ctrl+U", "when": "editorTextFocus && dance.mode == 'insert'", "command": "dance.select.vertically", @@ -4182,240 +3967,142 @@ } }, { - "key": "Ctrl+F", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "command": "dance.select.vertically", - "args": { - "direction": 1, - "by": "page", - "shift": "extend" - } - }, - { - "key": "Ctrl+D", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "command": "dance.select.vertically", - "args": { - "direction": 1, - "by": "halfPage", - "shift": "extend" - } - }, - { - "key": "Ctrl+B", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "command": "dance.select.vertically", - "args": { - "direction": -1, - "by": "page", - "shift": "extend" - } - }, - { - "key": "Ctrl+U", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "command": "dance.select.vertically", - "args": { - "direction": -1, - "by": "halfPage", - "shift": "extend" - } - }, - { + "category": "core", "key": "Alt+;", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Change direction of selections", "command": "dance.selections.changeDirection" }, { - "key": "Alt+;", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Change direction of selections", - "command": "dance.selections.changeDirection" - }, - { + "category": "core", "key": "Alt+,", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Clear main selections", "command": "dance.selections.clear.main" }, { - "key": "Alt+,", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Clear main selections", - "command": "dance.selections.clear.main" - }, - { + "category": "core", "key": ",", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Clear secondary selections", "command": "dance.selections.clear.secondary" }, { - "key": ",", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Clear secondary selections", - "command": "dance.selections.clear.secondary" - }, - { + "category": "kakoune", "key": "Shift+C", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy selections below", "command": "dance.selections.copy" }, { + "category": "kakoune", "key": "Shift+Alt+C", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy selections above", "command": "dance.selections.copy.above" }, { + "category": "kakoune", "key": "X", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Expand to lines", - "command": "dance.selections.expandToLines" - }, - { - "key": "Shift+X", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", - "title": "Expand to lines", - "command": "dance.selections.expandToLines" - }, - { - "key": "Shift+X", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Expand to lines", "command": "dance.selections.expandToLines" }, { + "category": "kakoune", "key": "Shift+Alt+;", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Forward selections", "command": "dance.selections.faceForward" }, { + "category": "core", "key": "Shift+4", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Filter selections", "command": "dance.selections.filter" }, { - "key": "Shift+4", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Filter selections", - "command": "dance.selections.filter" - }, - { + "category": "core", "key": "Alt+K", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Keep matching selections", "command": "dance.selections.filter.regexp" }, { - "key": "Alt+K", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Keep matching selections", - "command": "dance.selections.filter.regexp" - }, - { + "category": "core", "key": "Shift+Alt+K", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Clear matching selections", "command": "dance.selections.filter.regexp.inverse" }, { - "key": "Shift+Alt+K", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Clear matching selections", - "command": "dance.selections.filter.regexp.inverse" - }, - { + "category": "kakoune", "key": "Shift+Alt+-", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Merge contiguous selections", "command": "dance.selections.merge" }, { + "category": "core", "key": "Shift+Alt+\\", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe selections", "command": "dance.selections.pipe" }, { - "key": "Shift+Alt+\\", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Pipe selections", - "command": "dance.selections.pipe" - }, - { + "category": "core", "key": "Shift+1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe and append", "command": "dance.selections.pipe.append" }, { - "key": "Shift+1", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Pipe and append", - "command": "dance.selections.pipe.append" - }, - { + "category": "core", "key": "Shift+Alt+1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe and prepend", "command": "dance.selections.pipe.prepend" }, { - "key": "Shift+Alt+1", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Pipe and prepend", - "command": "dance.selections.pipe.prepend" - }, - { + "category": "core", "key": "Shift+\\", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe and replace", "command": "dance.selections.pipe.replace" }, { - "key": "Shift+\\", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Pipe and replace", - "command": "dance.selections.pipe.replace" - }, - { + "category": "core", "key": ";", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Reduce selections to their cursor", "command": "dance.selections.reduce" }, { - "key": ";", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Reduce selections to their cursor", - "command": "dance.selections.reduce" - }, - { + "category": "kakoune", "key": "Shift+Alt+S", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Reduce selections to their ends", "command": "dance.selections.reduce.edges" }, { + "category": "kakoune", "key": "Z", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Restore selections", "command": "dance.selections.restore" }, { + "category": "kakoune", "key": "Alt+Z", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Combine register selections with current ones", "command": "dance.selections.restore.withCurrent" }, { + "category": "kakoune", "key": "Shift+Alt+Z", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.selections.restore.withCurrent", "args": { "reverse": true, @@ -4423,166 +4110,86 @@ } }, { + "category": "kakoune", "key": "Shift+Z", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Save selections", "command": "dance.selections.save" }, { + "category": "core", "key": "Y", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy selections text", "command": "dance.selections.saveText" }, { - "key": "Y", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Copy selections text", - "command": "dance.selections.saveText" - }, - { + "category": "core", "key": "S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Leap or select", "command": "dance.selections.select.orLeap" }, { - "key": "S", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Leap or select", - "command": "dance.selections.select.orLeap" - }, - { + "category": "core", "key": "Shift+S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Split selections", "command": "dance.selections.split" }, { - "key": "Shift+S", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Split selections", - "command": "dance.selections.split" - }, - { + "category": "core", "key": "Alt+S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Leap or select backward", "command": "dance.selections.splitLines.orLeap.backward" }, { - "key": "Alt+S", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Leap or select backward", - "command": "dance.selections.splitLines.orLeap.backward" - }, - { - "key": "Enter", - "when": "editorTextFocus && dance.behavior == 'dance' && dance.mode == 'normal'", - "title": "Toggle selection indices", - "command": "dance.selections.toggleIndices" - }, - { + "category": "core", "key": "Alt+X", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Trim lines", "command": "dance.selections.trimLines" }, { - "key": "Alt+X", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Trim lines", - "command": "dance.selections.trimLines" - }, - { + "category": "core", "key": "Shift+-", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Trim whitespace", "command": "dance.selections.trimWhitespace" }, { - "key": "Shift+-", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Trim whitespace", - "command": "dance.selections.trimWhitespace" - }, - { + "category": "kakoune", "key": "Shift+Alt+0", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Rotate selections clockwise", "command": "dance.selections.rotate.both" }, { + "category": "kakoune", "key": "Shift+Alt+9", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Rotate selections counter-clockwise", "command": "dance.selections.rotate.both.reverse" }, { - "key": "Shift+Alt+0", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", - "title": "Rotate selections clockwise (contents only)", - "command": "dance.selections.rotate.contents" - }, - { - "key": "Shift+Alt+0", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Rotate selections clockwise (contents only)", - "command": "dance.selections.rotate.contents" - }, - { - "key": "Shift+Alt+9", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", - "title": "Rotate selections counter-clockwise (contents only)", - "command": "dance.selections.rotate.contents.reverse" - }, - { - "key": "Shift+Alt+9", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Rotate selections counter-clockwise (contents only)", - "command": "dance.selections.rotate.contents.reverse" - }, - { + "category": "core", "key": "Shift+0", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Rotate selections clockwise (selections only)", "command": "dance.selections.rotate.selections" }, { + "category": "core", "key": "Shift+9", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Rotate selections counter-clockwise (selections only)", "command": "dance.selections.rotate.selections.reverse" }, { - "key": "Shift+9", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", - "title": "Rotate selections counter-clockwise (selections only)", - "command": "dance.selections.rotate.selections.reverse" - }, - { + "category": "kakoune", "key": "V", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Show view menu", - "command": "dance.openMenu", - "args": { - "menu": "view", - "$exclude": [] - } - }, - { - "key": "Z", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", - "title": "Show view menu", - "command": "dance.openMenu", - "args": { - "menu": "view", - "$exclude": [] - } - }, - { - "key": "Z", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Show view menu", "command": "dance.openMenu", "args": { @@ -4591,30 +4198,9 @@ } }, { + "category": "kakoune", "key": "Shift+V", - "when": "editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal'", - "title": "Show view menu (locked)", - "command": "dance.openMenu", - "args": { - "menu": "view", - "locked": true, - "$exclude": [] - } - }, - { - "key": "Shift+Z", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal'", - "title": "Show view menu (locked)", - "command": "dance.openMenu", - "args": { - "menu": "view", - "locked": true, - "$exclude": [] - } - }, - { - "key": "Shift+Z", - "when": "editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select'", + "when": "editorTextFocus && dance.mode == 'normal'", "title": "Show view menu (locked)", "command": "dance.openMenu", "args": { @@ -4626,462 +4212,92 @@ { "key": "Shift+D", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+X", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+Y", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+2", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+3", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+6", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "'", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "-", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "=", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "Tab", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "Space", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "NumPad_Add", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" + "when": "dance.mode == 'normal'" }, { "key": "NumPad_Subtract", "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" - }, - { - "key": "Shift+=", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" - }, - { - "key": "Shift+Tab", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" - }, - { - "key": "Shift+Space", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" - }, - { - "key": "Shift+NumPad_Add", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" - }, - { - "key": "Shift+NumPad_Subtract", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'kakoune'" - }, - { - "key": "M", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Q", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+C", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+D", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+G", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+H", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+J", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+K", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+L", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+M", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+Q", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+R", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+V", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+Y", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+2", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+3", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+5", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+6", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "'", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "-", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "=", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Tab", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Space", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "NumPad_Add", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "NumPad_Subtract", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+=", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+Tab", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+Space", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+NumPad_Add", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "Shift+NumPad_Subtract", - "command": "dance.ignore", - "when": "dance.mode == 'normal' && dance.behavior == 'helix'" - }, - { - "key": "M", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Q", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "R", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "0", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "1", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "2", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "3", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "4", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "5", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "6", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "7", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "8", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "9", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+C", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+D", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+G", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+H", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+K", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+L", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+M", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+Q", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+R", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+V", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+Y", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+0", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+2", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+3", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+5", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+6", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+7", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+8", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "'", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "-", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "=", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Tab", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Space", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "NumPad_Add", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "NumPad_Subtract", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" - }, - { - "key": "Shift+'", - "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+=", "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+Tab", "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+Space", "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+NumPad_Add", "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" + "when": "dance.mode == 'normal'" }, { "key": "Shift+NumPad_Subtract", "command": "dance.ignore", - "when": "dance.mode == 'select' && dance.behavior == 'helix'" + "when": "dance.mode == 'normal'" } ] } diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index 141edaaf..841f601b 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -234,7 +234,8 @@ edit.join: keys: qwerty: |- - `a-j` (core: normal) + `a-j` (kakoune: normal) + `s-j` (helix: normal) `s-j` (helix: select) doc: @@ -2739,6 +2740,26 @@ anonymous: qwerty: |- `up` (core: prompt) + - title: + en: Open match menu + + commands: |- + [".openMenu", { menu: "match" }] + + keys: + qwerty: |- + `m` (helix: normal) + + - title: + en: Open match menu with extend + + commands: |- + [".openMenu", { menu: "match", pass: [{shift: "extend"}] }] + + keys: + qwerty: |- + `m` (helix: select) + - title: en: Show view menu diff --git a/src/api/modes.ts b/src/api/modes.ts index 23e4404b..f258d74f 100644 --- a/src/api/modes.ts +++ b/src/api/modes.ts @@ -13,8 +13,7 @@ export function toMode(modeName: string, count: number): Thenable; export async function toMode(modeName: string, count?: number) { const context = Context.current, extension = context.extension, - mode = extension.modes.get(modeName); - + mode = findMode(modeName); if (mode === undefined || mode.isPendingDeletion) { throw new Error(`mode ${JSON.stringify(modeName)} does not exist`); } @@ -62,3 +61,24 @@ export async function toMode(modeName: string, count?: number) { })); }, 0); } + +/* Find a mode by name, prioritizing one that's within the same 'namespace' */ +function findMode(modeName: string, context?: Context) { + context = context ?? Context.current; + + const currentMode = context.mode, + split = currentMode.name.split("/"); + if (split.length === 2) { + const namespacedMode = context.extension.modes.get(`${split[0]}/${modeName}`); + if (namespacedMode) { + return namespacedMode; + } + } + + const directMode = context.extension.modes.get(modeName); + if (directMode) { + return directMode; + } + + return undefined; +} diff --git a/src/commands/README.md b/src/commands/README.md index ab733b6a..04f7554d 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -27,47 +27,47 @@ depending on the keyboard layout. The following layouts _will be_\* supported: devdev.copyLastErrorMessageCopies the last encountered error message dev.setSelectionBehaviorSet the selection behavior of the specified mode editedit.alignAlign selectionsShift+7 (editorTextFocus && dance.mode == 'normal') -edit.case.swapSwap caseAlt+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.paste.afterPaste afterP (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'select') +edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.mode == 'select') +edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'select') +edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.mode == 'normal') +edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.mode == 'normal') +edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.mode == 'select') +edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.mode == 'select') +edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.mode == 'normal') +edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.mode == 'select') +edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.mode == 'select') +edit.paste.afterPaste afterP (editorTextFocus && dance.mode == 'select') edit.paste.after.selectPaste after and selectP (editorTextFocus && dance.mode == 'normal') -edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.mode == 'select') edit.paste.before.selectPaste before and selectShift+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.afterPaste all after -edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.beforePaste all before -edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') -edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.mode == 'normal') +edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.mode == 'insert') +edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.mode == 'select') +edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.mode == 'select') +edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') +edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.mode == 'select') +edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal') +edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'select') +edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.mode == 'select') +edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') +edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.mode == 'normal') edit.replaceCharactersReplace charactersR (editorTextFocus && dance.mode == 'normal') -historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal')Alt+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal')Alt+. (editorTextFocus && dance.mode == 'select') history.repeat.selectionRepeat last selection change -history.recording.playReplay recordingQ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -history.recording.startStart recordingShift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && !dance.isRecording) -history.recording.stopStop recordingEscape (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording) -history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +history.recording.playReplay recordingQ (editorTextFocus && dance.mode == 'normal') +history.recording.startStart recordingShift+Q (editorTextFocus && dance.mode == 'normal' && !dance.isRecording) +history.recording.stopStop recordingEscape (editorTextFocus && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.mode == 'normal' && dance.isRecording) +history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.mode == 'select') +history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.mode == 'normal') history.repeatRepeat last change history.repeat.editRepeat last edit without a command. (editorTextFocus && dance.mode == 'normal')NumPad_Decimal (editorTextFocus && dance.mode == 'normal') -history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.mode == 'select') +history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.mode == 'normal') keybindingskeybindings.setupSet up Dance keybindings misccancelCancel Dance operationEscape (editorTextFocus && dance.mode == 'normal' && !dance.isRecording && !markersNavigationVisible)Escape (editorTextFocus && dance.mode == 'input') changeInputChange current input @@ -79,70 +79,70 @@ selections are empty selectRegisterSelect register for next commandShift+' (editorTextFocus && dance.mode == 'normal') updateCountUpdate Dance count updateRegisterUpdate the contents of a register -modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal')A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal')I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal')Shift+A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal')Shift+I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal')A (editorTextFocus && dance.mode == 'select') +modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal')I (editorTextFocus && dance.mode == 'select') +modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal')Shift+A (editorTextFocus && dance.mode == 'select') +modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal')Shift+I (editorTextFocus && dance.mode == 'select') modes.set.insertSet mode to Insert -modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')V (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.set.selectSet mode to SelectV (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.mode == 'select')V (editorTextFocus && dance.mode == 'select') +modes.set.selectSet mode to SelectV (editorTextFocus && dance.mode == 'normal') +modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.mode == 'normal') +modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.mode == 'insert') modes.setSet Dance mode modes.set.temporarilySet Dance mode temporarily searchsearch.nextSelect next matchN (editorTextFocus && dance.mode == 'normal') search.searchSearch/ (editorTextFocus && dance.mode == 'normal')NumPad_Divide (editorTextFocus && dance.mode == 'normal') -search.backwardSearch backwardAlt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -search.extendSearch (extend)Shift+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -search.next.addAdd next matchShift+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -search.previousSelect previous matchAlt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.backwardSearch backwardAlt+/ (editorTextFocus && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.mode == 'normal') +search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.mode == 'select') +search.extendSearch (extend)Shift+/ (editorTextFocus && dance.mode == 'normal')/ (editorTextFocus && dance.mode == 'select') +search.next.addAdd next matchShift+N (editorTextFocus && dance.mode == 'normal')N (editorTextFocus && dance.mode == 'select') +search.previousSelect previous matchAlt+N (editorTextFocus && dance.mode == 'normal')Shift+N (editorTextFocus && dance.mode == 'normal') +search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.mode == 'normal')Shift+N (editorTextFocus && dance.mode == 'select') search.selection.smartSearch current selection (smart)Shift+8 (editorTextFocus && dance.mode == 'normal')NumPad_Multiply (editorTextFocus && dance.mode == 'normal') search.selectionSearch current selectionShift+Alt+8 (editorTextFocus && dance.mode == 'normal')Alt+NumPad_Multiply (editorTextFocus && dance.mode == 'normal') -seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.mode == 'normal') seek.leapLeap forward seek.objectSelect object seek.seekSelect to character (excluded)T (editorTextFocus && dance.mode == 'normal') -seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') -seek.askObject.endSelect to whole object end] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') -seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.includedSelect to character (included)F (editorTextFocus && dance.mode == 'normal') -seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.leap.backwardLeap backward -seek.syntax.child.experimentalSelect child syntax object -seek.syntax.next.experimentalSelect next syntax object -seek.syntax.parent.experimentalSelect parent syntax object -seek.syntax.previous.experimentalSelect previous syntax object -seek.word.backwardSelect to previous word startB (editorTextFocus && dance.mode == 'normal') -seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.wordEndSelect to next word endE (editorTextFocus && dance.mode == 'normal') -seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.mode == 'normal')Alt+A (editorTextFocus && dance.mode == 'insert') +seek.askObject.endSelect to whole object end] (editorTextFocus && dance.mode == 'normal') +seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.mode == 'normal') +seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.mode == 'normal')Alt+I (editorTextFocus && dance.mode == 'insert') +seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.mode == 'normal') +seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.mode == 'normal') +seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.mode == 'normal') +seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.mode == 'normal') +seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.mode == 'normal') +seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.mode == 'normal') +seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.mode == 'normal')Shift+T (editorTextFocus && dance.mode == 'normal') +seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.mode == 'normal') +seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.mode == 'normal') +seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.mode == 'normal') +seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.mode == 'normal')T (editorTextFocus && dance.mode == 'select') +seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.mode == 'normal')Shift+T (editorTextFocus && dance.mode == 'select') +seek.includedSelect to character (included)F (editorTextFocus && dance.mode == 'normal') +seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.mode == 'normal')Shift+F (editorTextFocus && dance.mode == 'normal') +seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.mode == 'normal')F (editorTextFocus && dance.mode == 'select') +seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.mode == 'normal')Shift+F (editorTextFocus && dance.mode == 'select') +seek.leap.backwardLeap backward +seek.syntax.child.experimentalSelect child syntax object +seek.syntax.next.experimentalSelect next syntax object +seek.syntax.parent.experimentalSelect parent syntax object +seek.syntax.previous.experimentalSelect previous syntax object +seek.word.backwardSelect to previous word startB (editorTextFocus && dance.mode == 'normal') +seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.mode == 'normal')W (editorTextFocus && dance.mode == 'select') +seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.mode == 'normal')B (editorTextFocus && dance.mode == 'select') +seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.mode == 'normal')Shift+W (editorTextFocus && dance.mode == 'normal') +seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.mode == 'normal')Shift+B (editorTextFocus && dance.mode == 'normal') +seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.mode == 'normal')Shift+W (editorTextFocus && dance.mode == 'select') +seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.mode == 'normal')Shift+B (editorTextFocus && dance.mode == 'select') +seek.wordEndSelect to next word endE (editorTextFocus && dance.mode == 'normal') +seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.mode == 'normal')E (editorTextFocus && dance.mode == 'select') +seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'normal') +seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'select') seek.syntax.experimentalSelect syntax object seek.wordSelect to next word startW (editorTextFocus && dance.mode == 'normal') -selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal') select.firstVisibleLineSelect to first visible line select.horizontallySelect horizontally select.lastLineSelect to last line @@ -150,13 +150,13 @@ selections are empty select.line.aboveSelect line above select.line.above.extendExtend to line above select.line.belowSelect line below -select.line.below.extendExtend to line belowX (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -select.lineEndSelect to line endAlt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') -select.lineStartSelect to line startAlt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') +select.line.below.extendExtend to line belowX (editorTextFocus && dance.mode == 'normal')X (editorTextFocus && dance.mode == 'select') +select.lineEndSelect to line endAlt+L (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') +select.lineStartSelect to line startAlt+H (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') select.middleVisibleLineSelect to middle visible line select.documentEnd.extendExtend to last character select.documentEnd.jumpJump to last character -select.down.extendExtend downShift+J (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Down (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.down.extendExtend downShift+J (editorTextFocus && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.mode == 'normal')J (editorTextFocus && dance.mode == 'select')Down (editorTextFocus && dance.mode == 'select') select.down.jumpJump downJ (editorTextFocus && dance.mode == 'normal')Down (editorTextFocus && dance.mode == 'normal') select.firstLine.extendExtend to first line select.firstLine.jumpJump to first line @@ -166,66 +166,66 @@ selections are empty select.lastLine.jumpJump to last line select.lastVisibleLine.extendExtend to last visible line select.lastVisibleLine.jumpJump to last visible line -select.left.extendExtend leftShift+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')H (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Left (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.left.extendExtend leftShift+H (editorTextFocus && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.mode == 'normal')H (editorTextFocus && dance.mode == 'select')Left (editorTextFocus && dance.mode == 'select') select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') -select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+End (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'select') +select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'select') select.lineStart.jumpJump to line start select.lineStart.skipBlank.extendExtend to line start (skip blank) select.lineStart.skipBlank.jumpJump to line start (skip blank) select.middleVisibleLine.extendExtend to middle visible line select.middleVisibleLine.jumpJump to middle visible line -select.right.extendExtend rightShift+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')L (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Right (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.right.extendExtend rightShift+L (editorTextFocus && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.mode == 'normal')L (editorTextFocus && dance.mode == 'select')Right (editorTextFocus && dance.mode == 'select') select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') -select.to.extendExtend toShift+G (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')G (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.to.extendExtend toShift+G (editorTextFocus && dance.mode == 'normal')G (editorTextFocus && dance.mode == 'select') select.to.jumpGo toG (editorTextFocus && dance.mode == 'normal') -select.up.extendExtend upShift+K (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Up (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.up.extendExtend upShift+K (editorTextFocus && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.mode == 'normal')K (editorTextFocus && dance.mode == 'select')Up (editorTextFocus && dance.mode == 'select') select.up.jumpJump upK (editorTextFocus && dance.mode == 'normal')Up (editorTextFocus && dance.mode == 'normal') select.toSelect to select.verticallySelect vertically -selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.mode == 'select') selections.changeOrderReverse selections -selections.copyCopy selections belowShift+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.expandToLinesExpand to linesX (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal') +selections.expandToLinesExpand to linesX (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'select') +selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.mode == 'select') +selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.mode == 'normal') selections.openOpen selected file -selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal')Shift+Alt+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal'); (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.restoreRestore selectionsZ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.saveSave selectionsShift+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal')Shift+Alt+\ (editorTextFocus && dance.mode == 'select') +selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal'); (editorTextFocus && dance.mode == 'select') +selections.restoreRestore selectionsZ (editorTextFocus && dance.mode == 'normal') +selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.mode == 'normal') +selections.saveSave selectionsShift+Z (editorTextFocus && dance.mode == 'normal') +selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.mode == 'select') selections.selectSelect within selections -selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') +selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal') selections.faceBackwardBackward selections -selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') +selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') +selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.mode == 'select') selections.hideIndicesHide selection indices selections.orderAscendingOrder selections ascending selections.orderDescendingOrder selections descending -selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.mode == 'select') +selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') +selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.mode == 'select') selections.showIndicesShow selection indices -selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.mode == 'select') selections.sortSort selections -selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries -selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.behavior == 'dance' && dance.mode == 'normal') -selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal') +selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.mode == 'select') +selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.mode == 'select') +selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') +selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.mode == 'select') selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal') -selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.mode == 'normal') +selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.mode == 'select') +selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.mode == 'select') viewview.lineReveals a position based on the main cursor @@ -319,7 +319,8 @@ Join lines. This command: - takes an argument `separator` of type `string`. -Default keybinding: `a-j` (core: normal) +Default keybinding: `a-j` (kakoune: normal) +`s-j` (helix: normal) `s-j` (helix: select) @@ -1013,9 +1014,16 @@ Default keybinding: `n` (core: normal) Update selections based on the text surrounding them. +#### Predefined keybindings + +| Title | Keybinding | Command | +| --------------------------- | ------------------- | ------------------------------------------------------------- | +| Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | +| Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{shift: "extend"}] }]` | + -### [`seek.seek`](./seek.ts#L16-L41) +### [`seek.seek`](./seek.ts#L23-L48) Select to character (excluded). @@ -1041,7 +1049,7 @@ Default keybinding: `t` (core: normal) -### [`seek.enclosing`](./seek.ts#L81-L101) +### [`seek.enclosing`](./seek.ts#L88-L108) Select to next enclosing character. @@ -1062,7 +1070,7 @@ Default keybinding: `m` (kakoune: normal) -### [`seek.word`](./seek.ts#L174-L205) +### [`seek.word`](./seek.ts#L181-L212) Select to next word start. @@ -1094,7 +1102,7 @@ Default keybinding: `w` (core: normal) -### [`seek.object`](./seek.ts#L249-L291) +### [`seek.object`](./seek.ts#L256-L298) Select object. @@ -1134,7 +1142,7 @@ This command: -### [`seek.syntax.experimental`](./seek.ts#L564-L583) +### [`seek.syntax.experimental`](./seek.ts#L571-L590) Select syntax object. @@ -1152,7 +1160,7 @@ This command: -### [`seek.leap`](./seek.ts#L617-L633) +### [`seek.leap`](./seek.ts#L624-L640) Leap forward. diff --git a/src/commands/edit.ts b/src/commands/edit.ts index 24db4a16..db2d4d72 100644 --- a/src/commands/edit.ts +++ b/src/commands/edit.ts @@ -133,7 +133,7 @@ export async function insert( /** * Join lines. * - * @keys `a-j` (core: normal), `s-j` (helix: select) + * @keys `a-j` (kakoune: normal), `s-j` (helix: normal), `s-j` (helix: select) */ export function join(_: Context, separator?: Argument) { return joinLines(Selections.lines(), separator); diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index 92fc138d..d684bd8f 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -12,47 +12,47 @@ devdev.copyLastErrorMessageCopies the last encountered error message dev.setSelectionBehaviorSet the selection behavior of the specified mode editedit.alignAlign selectionsShift+7 (editorTextFocus && dance.mode == 'normal') -edit.case.swapSwap caseAlt+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.paste.afterPaste afterP (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'select') +edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.mode == 'select') +edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'select') +edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.mode == 'normal') +edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.mode == 'normal') +edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.mode == 'select') +edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.mode == 'select') +edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.mode == 'normal') +edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.mode == 'select') +edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.mode == 'select') +edit.paste.afterPaste afterP (editorTextFocus && dance.mode == 'select') edit.paste.after.selectPaste after and selectP (editorTextFocus && dance.mode == 'normal') -edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.mode == 'select') edit.paste.before.selectPaste before and selectShift+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.afterPaste all after -edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.beforePaste all before -edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') -edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.mode == 'normal') +edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.mode == 'insert') +edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.mode == 'select') +edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.mode == 'select') +edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') +edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.mode == 'select') +edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal') +edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'select') +edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.mode == 'select') +edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') +edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.mode == 'normal') edit.replaceCharactersReplace charactersR (editorTextFocus && dance.mode == 'normal') -historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal')Alt+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal')Alt+. (editorTextFocus && dance.mode == 'select') history.repeat.selectionRepeat last selection change -history.recording.playReplay recordingQ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -history.recording.startStart recordingShift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && !dance.isRecording) -history.recording.stopStop recordingEscape (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording) -history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +history.recording.playReplay recordingQ (editorTextFocus && dance.mode == 'normal') +history.recording.startStart recordingShift+Q (editorTextFocus && dance.mode == 'normal' && !dance.isRecording) +history.recording.stopStop recordingEscape (editorTextFocus && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.mode == 'normal' && dance.isRecording) +history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.mode == 'select') +history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.mode == 'normal') history.repeatRepeat last change history.repeat.editRepeat last edit without a command. (editorTextFocus && dance.mode == 'normal')NumPad_Decimal (editorTextFocus && dance.mode == 'normal') -history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.mode == 'select') +history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.mode == 'normal') keybindingskeybindings.setupSet up Dance keybindings misccancelCancel Dance operationEscape (editorTextFocus && dance.mode == 'normal' && !dance.isRecording && !markersNavigationVisible)Escape (editorTextFocus && dance.mode == 'input') changeInputChange current input @@ -64,70 +64,70 @@ selections are empty selectRegisterSelect register for next commandShift+' (editorTextFocus && dance.mode == 'normal') updateCountUpdate Dance count updateRegisterUpdate the contents of a register -modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal')A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal')I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal')Shift+A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal')Shift+I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal')A (editorTextFocus && dance.mode == 'select') +modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal')I (editorTextFocus && dance.mode == 'select') +modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal')Shift+A (editorTextFocus && dance.mode == 'select') +modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal')Shift+I (editorTextFocus && dance.mode == 'select') modes.set.insertSet mode to Insert -modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')V (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.set.selectSet mode to SelectV (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.mode == 'select')V (editorTextFocus && dance.mode == 'select') +modes.set.selectSet mode to SelectV (editorTextFocus && dance.mode == 'normal') +modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.mode == 'normal') +modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.mode == 'insert') modes.setSet Dance mode modes.set.temporarilySet Dance mode temporarily searchsearch.nextSelect next matchN (editorTextFocus && dance.mode == 'normal') search.searchSearch/ (editorTextFocus && dance.mode == 'normal')NumPad_Divide (editorTextFocus && dance.mode == 'normal') -search.backwardSearch backwardAlt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -search.extendSearch (extend)Shift+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -search.next.addAdd next matchShift+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -search.previousSelect previous matchAlt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.backwardSearch backwardAlt+/ (editorTextFocus && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.mode == 'normal') +search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.mode == 'select') +search.extendSearch (extend)Shift+/ (editorTextFocus && dance.mode == 'normal')/ (editorTextFocus && dance.mode == 'select') +search.next.addAdd next matchShift+N (editorTextFocus && dance.mode == 'normal')N (editorTextFocus && dance.mode == 'select') +search.previousSelect previous matchAlt+N (editorTextFocus && dance.mode == 'normal')Shift+N (editorTextFocus && dance.mode == 'normal') +search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.mode == 'normal')Shift+N (editorTextFocus && dance.mode == 'select') search.selection.smartSearch current selection (smart)Shift+8 (editorTextFocus && dance.mode == 'normal')NumPad_Multiply (editorTextFocus && dance.mode == 'normal') search.selectionSearch current selectionShift+Alt+8 (editorTextFocus && dance.mode == 'normal')Alt+NumPad_Multiply (editorTextFocus && dance.mode == 'normal') -seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.mode == 'normal') seek.leapLeap forward seek.objectSelect object seek.seekSelect to character (excluded)T (editorTextFocus && dance.mode == 'normal') -seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') -seek.askObject.endSelect to whole object end] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') -seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.includedSelect to character (included)F (editorTextFocus && dance.mode == 'normal') -seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.leap.backwardLeap backward -seek.syntax.child.experimentalSelect child syntax object -seek.syntax.next.experimentalSelect next syntax object -seek.syntax.parent.experimentalSelect parent syntax object -seek.syntax.previous.experimentalSelect previous syntax object -seek.word.backwardSelect to previous word startB (editorTextFocus && dance.mode == 'normal') -seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.wordEndSelect to next word endE (editorTextFocus && dance.mode == 'normal') -seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.mode == 'normal')Alt+A (editorTextFocus && dance.mode == 'insert') +seek.askObject.endSelect to whole object end] (editorTextFocus && dance.mode == 'normal') +seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.mode == 'normal') +seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.mode == 'normal')Alt+I (editorTextFocus && dance.mode == 'insert') +seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.mode == 'normal') +seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.mode == 'normal') +seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.mode == 'normal') +seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.mode == 'normal') +seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.mode == 'normal') +seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.mode == 'normal') +seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.mode == 'normal')Shift+T (editorTextFocus && dance.mode == 'normal') +seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.mode == 'normal') +seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.mode == 'normal') +seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.mode == 'normal') +seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.mode == 'normal')T (editorTextFocus && dance.mode == 'select') +seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.mode == 'normal')Shift+T (editorTextFocus && dance.mode == 'select') +seek.includedSelect to character (included)F (editorTextFocus && dance.mode == 'normal') +seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.mode == 'normal')Shift+F (editorTextFocus && dance.mode == 'normal') +seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.mode == 'normal')F (editorTextFocus && dance.mode == 'select') +seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.mode == 'normal')Shift+F (editorTextFocus && dance.mode == 'select') +seek.leap.backwardLeap backward +seek.syntax.child.experimentalSelect child syntax object +seek.syntax.next.experimentalSelect next syntax object +seek.syntax.parent.experimentalSelect parent syntax object +seek.syntax.previous.experimentalSelect previous syntax object +seek.word.backwardSelect to previous word startB (editorTextFocus && dance.mode == 'normal') +seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.mode == 'normal')W (editorTextFocus && dance.mode == 'select') +seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.mode == 'normal')B (editorTextFocus && dance.mode == 'select') +seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.mode == 'normal')Shift+W (editorTextFocus && dance.mode == 'normal') +seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.mode == 'normal')Shift+B (editorTextFocus && dance.mode == 'normal') +seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.mode == 'normal')Shift+W (editorTextFocus && dance.mode == 'select') +seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.mode == 'normal')Shift+B (editorTextFocus && dance.mode == 'select') +seek.wordEndSelect to next word endE (editorTextFocus && dance.mode == 'normal') +seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.mode == 'normal')E (editorTextFocus && dance.mode == 'select') +seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'normal') +seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'select') seek.syntax.experimentalSelect syntax object seek.wordSelect to next word startW (editorTextFocus && dance.mode == 'normal') -selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal') select.firstVisibleLineSelect to first visible line select.horizontallySelect horizontally select.lastLineSelect to last line @@ -135,13 +135,13 @@ selections are empty select.line.aboveSelect line above select.line.above.extendExtend to line above select.line.belowSelect line below -select.line.below.extendExtend to line belowX (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -select.lineEndSelect to line endAlt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') -select.lineStartSelect to line startAlt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') +select.line.below.extendExtend to line belowX (editorTextFocus && dance.mode == 'normal')X (editorTextFocus && dance.mode == 'select') +select.lineEndSelect to line endAlt+L (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') +select.lineStartSelect to line startAlt+H (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') select.middleVisibleLineSelect to middle visible line select.documentEnd.extendExtend to last character select.documentEnd.jumpJump to last character -select.down.extendExtend downShift+J (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Down (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.down.extendExtend downShift+J (editorTextFocus && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.mode == 'normal')J (editorTextFocus && dance.mode == 'select')Down (editorTextFocus && dance.mode == 'select') select.down.jumpJump downJ (editorTextFocus && dance.mode == 'normal')Down (editorTextFocus && dance.mode == 'normal') select.firstLine.extendExtend to first line select.firstLine.jumpJump to first line @@ -151,66 +151,66 @@ selections are empty select.lastLine.jumpJump to last line select.lastVisibleLine.extendExtend to last visible line select.lastVisibleLine.jumpJump to last visible line -select.left.extendExtend leftShift+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')H (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Left (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.left.extendExtend leftShift+H (editorTextFocus && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.mode == 'normal')H (editorTextFocus && dance.mode == 'select')Left (editorTextFocus && dance.mode == 'select') select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') -select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+End (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'select') +select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'select') select.lineStart.jumpJump to line start select.lineStart.skipBlank.extendExtend to line start (skip blank) select.lineStart.skipBlank.jumpJump to line start (skip blank) select.middleVisibleLine.extendExtend to middle visible line select.middleVisibleLine.jumpJump to middle visible line -select.right.extendExtend rightShift+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')L (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Right (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.right.extendExtend rightShift+L (editorTextFocus && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.mode == 'normal')L (editorTextFocus && dance.mode == 'select')Right (editorTextFocus && dance.mode == 'select') select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') -select.to.extendExtend toShift+G (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')G (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.to.extendExtend toShift+G (editorTextFocus && dance.mode == 'normal')G (editorTextFocus && dance.mode == 'select') select.to.jumpGo toG (editorTextFocus && dance.mode == 'normal') -select.up.extendExtend upShift+K (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Up (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.up.extendExtend upShift+K (editorTextFocus && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.mode == 'normal')K (editorTextFocus && dance.mode == 'select')Up (editorTextFocus && dance.mode == 'select') select.up.jumpJump upK (editorTextFocus && dance.mode == 'normal')Up (editorTextFocus && dance.mode == 'normal') select.toSelect to select.verticallySelect vertically -selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.mode == 'select') selections.changeOrderReverse selections -selections.copyCopy selections belowShift+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.expandToLinesExpand to linesX (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal') +selections.expandToLinesExpand to linesX (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'select') +selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.mode == 'select') +selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.mode == 'normal') selections.openOpen selected file -selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal')Shift+Alt+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal'); (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.restoreRestore selectionsZ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.saveSave selectionsShift+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal')Shift+Alt+\ (editorTextFocus && dance.mode == 'select') +selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal'); (editorTextFocus && dance.mode == 'select') +selections.restoreRestore selectionsZ (editorTextFocus && dance.mode == 'normal') +selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.mode == 'normal') +selections.saveSave selectionsShift+Z (editorTextFocus && dance.mode == 'normal') +selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.mode == 'select') selections.selectSelect within selections -selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') +selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal') selections.faceBackwardBackward selections -selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') +selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') +selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.mode == 'select') selections.hideIndicesHide selection indices selections.orderAscendingOrder selections ascending selections.orderDescendingOrder selections descending -selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.mode == 'select') +selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') +selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.mode == 'select') selections.showIndicesShow selection indices -selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.mode == 'select') selections.sortSort selections -selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries -selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.behavior == 'dance' && dance.mode == 'normal') -selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal') +selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.mode == 'select') +selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.mode == 'select') +selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') +selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.mode == 'select') selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal') -selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.mode == 'normal') +selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.mode == 'select') +selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.mode == 'select') viewview.lineReveals a position based on the main cursor @@ -304,7 +304,8 @@ Join lines. This command: - takes an argument `separator` of type `string`. -Default keybinding: `a-j` (core: normal) +Default keybinding: `a-j` (kakoune: normal) +`s-j` (helix: normal) `s-j` (helix: select) @@ -998,9 +999,16 @@ Default keybinding: `n` (core: normal) Update selections based on the text surrounding them. +#### Predefined keybindings + +| Title | Keybinding | Command | +| --------------------------- | ------------------- | ------------------------------------------------------------- | +| Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | +| Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{shift: "extend"}] }]` | + -### [`seek.seek`](../seek.ts#L16-L41) +### [`seek.seek`](../seek.ts#L23-L48) Select to character (excluded). @@ -1026,7 +1034,7 @@ Default keybinding: `t` (core: normal) -### [`seek.enclosing`](../seek.ts#L81-L101) +### [`seek.enclosing`](../seek.ts#L88-L108) Select to next enclosing character. @@ -1047,7 +1055,7 @@ Default keybinding: `m` (kakoune: normal) -### [`seek.word`](../seek.ts#L174-L205) +### [`seek.word`](../seek.ts#L181-L212) Select to next word start. @@ -1079,7 +1087,7 @@ Default keybinding: `w` (core: normal) -### [`seek.object`](../seek.ts#L249-L291) +### [`seek.object`](../seek.ts#L256-L298) Select object. @@ -1119,7 +1127,7 @@ This command: -### [`seek.syntax.experimental`](../seek.ts#L564-L583) +### [`seek.syntax.experimental`](../seek.ts#L571-L590) Select syntax object. @@ -1137,7 +1145,7 @@ This command: -### [`seek.leap`](../seek.ts#L617-L633) +### [`seek.leap`](../seek.ts#L624-L640) Leap forward. diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index 563a19d4..5d8bd26f 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -12,47 +12,47 @@ devdev.copyLastErrorMessageCopies the last encountered error message dev.setSelectionBehaviorSet the selection behavior of the specified mode editedit.alignAlign selectionsShift+7 (editorTextFocus && dance.mode == 'normal') -edit.case.swapSwap caseAlt+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Alt+` (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.paste.afterPaste afterP (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'select') +edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.mode == 'select') +edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'select') +edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.mode == 'normal') +edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.mode == 'normal') +edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.mode == 'select') +edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.mode == 'select') +edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.mode == 'normal') +edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.mode == 'select') +edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.mode == 'select') +edit.paste.afterPaste afterP (editorTextFocus && dance.mode == 'select') edit.paste.after.selectPaste after and selectP (editorTextFocus && dance.mode == 'normal') -edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.mode == 'select') edit.paste.before.selectPaste before and selectShift+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.afterPaste all after -edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.beforePaste all before -edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') -edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.mode == 'normal') +edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.mode == 'insert') +edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.mode == 'select') +edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.mode == 'select') +edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') +edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.mode == 'select') +edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal') +edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'select') +edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.mode == 'select') +edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') +edit.newLine.belowInsert new line below each selectionAlt+O (editorTextFocus && dance.mode == 'normal') edit.replaceCharactersReplace charactersR (editorTextFocus && dance.mode == 'normal') -historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal')Alt+. (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +historyhistory.repeat.seekRepeat last seekAlt+. (editorTextFocus && dance.mode == 'normal')Alt+. (editorTextFocus && dance.mode == 'select') history.repeat.selectionRepeat last selection change -history.recording.playReplay recordingQ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -history.recording.startStart recordingShift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && !dance.isRecording) -history.recording.stopStop recordingEscape (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal' && dance.isRecording) -history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +history.recording.playReplay recordingQ (editorTextFocus && dance.mode == 'normal') +history.recording.startStart recordingShift+Q (editorTextFocus && dance.mode == 'normal' && !dance.isRecording) +history.recording.stopStop recordingEscape (editorTextFocus && dance.mode == 'normal' && dance.isRecording)Shift+Q (editorTextFocus && dance.mode == 'normal' && dance.isRecording) +history.redoRedoShift+U (editorTextFocus && dance.mode == 'normal')Shift+U (editorTextFocus && dance.mode == 'select') +history.redo.selectionsRedo a change of selectionsShift+Alt+U (editorTextFocus && dance.mode == 'normal') history.repeatRepeat last change history.repeat.editRepeat last edit without a command. (editorTextFocus && dance.mode == 'normal')NumPad_Decimal (editorTextFocus && dance.mode == 'normal') -history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +history.undoUndoU (editorTextFocus && dance.mode == 'normal')U (editorTextFocus && dance.mode == 'select') +history.undo.selectionsUndo a change of selectionsAlt+U (editorTextFocus && dance.mode == 'normal') keybindingskeybindings.setupSet up Dance keybindings misccancelCancel Dance operationEscape (editorTextFocus && dance.mode == 'normal' && !dance.isRecording && !markersNavigationVisible)Escape (editorTextFocus && dance.mode == 'input') changeInputChange current input @@ -64,70 +64,70 @@ selections are empty selectRegisterSelect register for next commandShift+' (editorTextFocus && dance.mode == 'normal') updateCountUpdate Dance count updateRegisterUpdate the contents of a register -modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal')A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal')I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal')Shift+A (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal')Shift+I (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +modesmodes.insert.afterInsert afterA (editorTextFocus && dance.mode == 'normal')A (editorTextFocus && dance.mode == 'select') +modes.insert.beforeInsert beforeI (editorTextFocus && dance.mode == 'normal')I (editorTextFocus && dance.mode == 'select') +modes.insert.lineEndInsert at line endShift+A (editorTextFocus && dance.mode == 'normal')Shift+A (editorTextFocus && dance.mode == 'select') +modes.insert.lineStartInsert at line startShift+I (editorTextFocus && dance.mode == 'normal')Shift+I (editorTextFocus && dance.mode == 'select') modes.set.insertSet mode to Insert -modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')V (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -modes.set.selectSet mode to SelectV (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') +modes.set.normalSet mode to NormalEscape (editorTextFocus && dance.mode == 'insert')Escape (editorTextFocus && dance.mode == 'select')V (editorTextFocus && dance.mode == 'select') +modes.set.selectSet mode to SelectV (editorTextFocus && dance.mode == 'normal') +modes.set.temporarily.insertTemporary Insert modeCtrl+V (editorTextFocus && dance.mode == 'normal') +modes.set.temporarily.normalTemporary Normal modeCtrl+V (editorTextFocus && dance.mode == 'insert') modes.setSet Dance mode modes.set.temporarilySet Dance mode temporarily searchsearch.nextSelect next matchN (editorTextFocus && dance.mode == 'normal') search.searchSearch/ (editorTextFocus && dance.mode == 'normal')NumPad_Divide (editorTextFocus && dance.mode == 'normal') -search.backwardSearch backwardAlt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -search.extendSearch (extend)Shift+/ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')/ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -search.next.addAdd next matchShift+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -search.previousSelect previous matchAlt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+N (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +search.backwardSearch backwardAlt+/ (editorTextFocus && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.mode == 'normal') +search.backward.extendSearch backward (extend)Shift+Alt+/ (editorTextFocus && dance.mode == 'normal')Shift+/ (editorTextFocus && dance.mode == 'select') +search.extendSearch (extend)Shift+/ (editorTextFocus && dance.mode == 'normal')/ (editorTextFocus && dance.mode == 'select') +search.next.addAdd next matchShift+N (editorTextFocus && dance.mode == 'normal')N (editorTextFocus && dance.mode == 'select') +search.previousSelect previous matchAlt+N (editorTextFocus && dance.mode == 'normal')Shift+N (editorTextFocus && dance.mode == 'normal') +search.previous.addAdd previous matchShift+Alt+N (editorTextFocus && dance.mode == 'normal')Shift+N (editorTextFocus && dance.mode == 'select') search.selection.smartSearch current selection (smart)Shift+8 (editorTextFocus && dance.mode == 'normal')NumPad_Multiply (editorTextFocus && dance.mode == 'normal') search.selectionSearch current selectionShift+Alt+8 (editorTextFocus && dance.mode == 'normal')Alt+NumPad_Multiply (editorTextFocus && dance.mode == 'normal') -seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +seekseek.enclosingSelect to next enclosing characterM (editorTextFocus && dance.mode == 'normal') seek.leapLeap forward seek.objectSelect object seek.seekSelect to character (excluded)T (editorTextFocus && dance.mode == 'normal') -seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+A (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') -seek.askObject.endSelect to whole object end] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Alt+I (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'insert') -seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+T (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.includedSelect to character (included)F (editorTextFocus && dance.mode == 'normal') -seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+F (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.leap.backwardLeap backward -seek.syntax.child.experimentalSelect child syntax object -seek.syntax.next.experimentalSelect next syntax object -seek.syntax.parent.experimentalSelect parent syntax object -seek.syntax.previous.experimentalSelect previous syntax object -seek.word.backwardSelect to previous word startB (editorTextFocus && dance.mode == 'normal') -seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+W (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+B (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.wordEndSelect to next word endE (editorTextFocus && dance.mode == 'normal') -seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal') -seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+E (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +seek.askObjectSelect whole objectAlt+A (editorTextFocus && dance.mode == 'normal')Alt+A (editorTextFocus && dance.mode == 'insert') +seek.askObject.endSelect to whole object end] (editorTextFocus && dance.mode == 'normal') +seek.askObject.end.extendExtend to whole object endShift+] (editorTextFocus && dance.mode == 'normal') +seek.askObject.innerSelect inner objectAlt+I (editorTextFocus && dance.mode == 'normal')Alt+I (editorTextFocus && dance.mode == 'insert') +seek.askObject.inner.endSelect to inner object endAlt+] (editorTextFocus && dance.mode == 'normal') +seek.askObject.inner.end.extendExtend to inner object endShift+Alt+] (editorTextFocus && dance.mode == 'normal') +seek.askObject.inner.startSelect to inner object startAlt+[ (editorTextFocus && dance.mode == 'normal') +seek.askObject.inner.start.extendExtend to inner object startShift+Alt+[ (editorTextFocus && dance.mode == 'normal') +seek.askObject.startSelect to whole object start[ (editorTextFocus && dance.mode == 'normal') +seek.askObject.start.extendExtend to whole object startShift+[ (editorTextFocus && dance.mode == 'normal') +seek.backwardSelect to character (excluded, backward)Alt+T (editorTextFocus && dance.mode == 'normal')Shift+T (editorTextFocus && dance.mode == 'normal') +seek.enclosing.backwardSelect to previous enclosing characterAlt+M (editorTextFocus && dance.mode == 'normal') +seek.enclosing.extendExtend to next enclosing characterShift+M (editorTextFocus && dance.mode == 'normal') +seek.enclosing.extend.backwardExtend to previous enclosing characterShift+Alt+M (editorTextFocus && dance.mode == 'normal') +seek.extendExtend to character (excluded)Shift+T (editorTextFocus && dance.mode == 'normal')T (editorTextFocus && dance.mode == 'select') +seek.extend.backwardExtend to character (excluded, backward)Shift+Alt+T (editorTextFocus && dance.mode == 'normal')Shift+T (editorTextFocus && dance.mode == 'select') +seek.includedSelect to character (included)F (editorTextFocus && dance.mode == 'normal') +seek.included.backwardSelect to character (included, backward)Alt+F (editorTextFocus && dance.mode == 'normal')Shift+F (editorTextFocus && dance.mode == 'normal') +seek.included.extendExtend to character (included)Shift+F (editorTextFocus && dance.mode == 'normal')F (editorTextFocus && dance.mode == 'select') +seek.included.extend.backwardExtend to character (included, backward)Shift+Alt+F (editorTextFocus && dance.mode == 'normal')Shift+F (editorTextFocus && dance.mode == 'select') +seek.leap.backwardLeap backward +seek.syntax.child.experimentalSelect child syntax object +seek.syntax.next.experimentalSelect next syntax object +seek.syntax.parent.experimentalSelect parent syntax object +seek.syntax.previous.experimentalSelect previous syntax object +seek.word.backwardSelect to previous word startB (editorTextFocus && dance.mode == 'normal') +seek.word.extendExtend to next word startShift+W (editorTextFocus && dance.mode == 'normal')W (editorTextFocus && dance.mode == 'select') +seek.word.extend.backwardExtend to previous word startShift+B (editorTextFocus && dance.mode == 'normal')B (editorTextFocus && dance.mode == 'select') +seek.word.wsSelect to next non-whitespace word startAlt+W (editorTextFocus && dance.mode == 'normal')Shift+W (editorTextFocus && dance.mode == 'normal') +seek.word.ws.backwardSelect to previous non-whitespace word startAlt+B (editorTextFocus && dance.mode == 'normal')Shift+B (editorTextFocus && dance.mode == 'normal') +seek.word.ws.extendExtend to next non-whitespace word startShift+Alt+W (editorTextFocus && dance.mode == 'normal')Shift+W (editorTextFocus && dance.mode == 'select') +seek.word.ws.extend.backwardExtend to previous non-whitespace word startShift+Alt+B (editorTextFocus && dance.mode == 'normal')Shift+B (editorTextFocus && dance.mode == 'select') +seek.wordEndSelect to next word endE (editorTextFocus && dance.mode == 'normal') +seek.wordEnd.extendExtend to next word endShift+E (editorTextFocus && dance.mode == 'normal')E (editorTextFocus && dance.mode == 'select') +seek.wordEnd.wsSelect to next non-whitespace word endAlt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'normal') +seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'select') seek.syntax.experimentalSelect syntax object seek.wordSelect to next word startW (editorTextFocus && dance.mode == 'normal') -selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal') select.firstVisibleLineSelect to first visible line select.horizontallySelect horizontally select.lastLineSelect to last line @@ -135,13 +135,13 @@ selections are empty select.line.aboveSelect line above select.line.above.extendExtend to line above select.line.belowSelect line below -select.line.below.extendExtend to line belowX (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -select.lineEndSelect to line endAlt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') -select.lineStartSelect to line startAlt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') +select.line.below.extendExtend to line belowX (editorTextFocus && dance.mode == 'normal')X (editorTextFocus && dance.mode == 'select') +select.lineEndSelect to line endAlt+L (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') +select.lineStartSelect to line startAlt+H (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') select.middleVisibleLineSelect to middle visible line select.documentEnd.extendExtend to last character select.documentEnd.jumpJump to last character -select.down.extendExtend downShift+J (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')J (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Down (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.down.extendExtend downShift+J (editorTextFocus && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.mode == 'normal')J (editorTextFocus && dance.mode == 'select')Down (editorTextFocus && dance.mode == 'select') select.down.jumpJump downJ (editorTextFocus && dance.mode == 'normal')Down (editorTextFocus && dance.mode == 'normal') select.firstLine.extendExtend to first line select.firstLine.jumpJump to first line @@ -151,66 +151,66 @@ selections are empty select.lastLine.jumpJump to last line select.lastVisibleLine.extendExtend to last visible line select.lastVisibleLine.jumpJump to last visible line -select.left.extendExtend leftShift+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')H (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Left (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.left.extendExtend leftShift+H (editorTextFocus && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.mode == 'normal')H (editorTextFocus && dance.mode == 'select')Left (editorTextFocus && dance.mode == 'select') select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') -select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+End (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')End (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Home (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'select') +select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'select') select.lineStart.jumpJump to line start select.lineStart.skipBlank.extendExtend to line start (skip blank) select.lineStart.skipBlank.jumpJump to line start (skip blank) select.middleVisibleLine.extendExtend to middle visible line select.middleVisibleLine.jumpJump to middle visible line -select.right.extendExtend rightShift+L (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')L (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Right (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.right.extendExtend rightShift+L (editorTextFocus && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.mode == 'normal')L (editorTextFocus && dance.mode == 'select')Right (editorTextFocus && dance.mode == 'select') select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') -select.to.extendExtend toShift+G (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')G (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.to.extendExtend toShift+G (editorTextFocus && dance.mode == 'normal')G (editorTextFocus && dance.mode == 'select') select.to.jumpGo toG (editorTextFocus && dance.mode == 'normal') -select.up.extendExtend upShift+K (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select')Up (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +select.up.extendExtend upShift+K (editorTextFocus && dance.mode == 'normal')Shift+Up (editorTextFocus && dance.mode == 'normal')K (editorTextFocus && dance.mode == 'select')Up (editorTextFocus && dance.mode == 'select') select.up.jumpJump upK (editorTextFocus && dance.mode == 'normal')Up (editorTextFocus && dance.mode == 'normal') select.toSelect to select.verticallySelect vertically -selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.mode == 'select') selections.changeOrderReverse selections -selections.copyCopy selections belowShift+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.expandToLinesExpand to linesX (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal') +selections.expandToLinesExpand to linesX (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'select') +selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.mode == 'select') +selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.mode == 'normal') selections.openOpen selected file -selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal')Shift+Alt+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal'); (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.restoreRestore selectionsZ (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.saveSave selectionsShift+Z (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipePipe selectionsShift+Alt+\ (editorTextFocus && dance.mode == 'normal')Shift+Alt+\ (editorTextFocus && dance.mode == 'select') +selections.reduceReduce selections to their cursor; (editorTextFocus && dance.mode == 'normal'); (editorTextFocus && dance.mode == 'select') +selections.restoreRestore selectionsZ (editorTextFocus && dance.mode == 'normal') +selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.mode == 'normal') +selections.saveSave selectionsShift+Z (editorTextFocus && dance.mode == 'normal') +selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.mode == 'select') selections.selectSelect within selections -selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') +selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') +selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal') selections.faceBackwardBackward selections -selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') +selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') +selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.mode == 'select') selections.hideIndicesHide selection indices selections.orderAscendingOrder selections ascending selections.orderDescendingOrder selections descending -selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.mode == 'select') +selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') +selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.mode == 'select') selections.showIndicesShow selection indices -selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.mode == 'select') selections.sortSort selections -selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries -selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.behavior == 'dance' && dance.mode == 'normal') -selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal') +selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.mode == 'select') +selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.mode == 'select') +selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') +selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.mode == 'select') selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal') -selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.behavior == 'kakoune' && dance.mode == 'normal') -selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') -selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.behavior == 'helix' && dance.mode == 'select') +selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.mode == 'normal') +selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.mode == 'select') +selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.mode == 'select') viewview.lineReveals a position based on the main cursor @@ -304,7 +304,8 @@ Join lines. This command: - takes an argument `separator` of type `string`. -Default keybinding: `a-j` (core: normal) +Default keybinding: `a-j` (kakoune: normal) +`s-j` (helix: normal) `s-j` (helix: select) @@ -998,9 +999,16 @@ Default keybinding: `n` (core: normal) Update selections based on the text surrounding them. +#### Predefined keybindings + +| Title | Keybinding | Command | +| --------------------------- | ------------------- | ------------------------------------------------------------- | +| Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | +| Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{shift: "extend"}] }]` | + -### [`seek.seek`](../seek.ts#L16-L41) +### [`seek.seek`](../seek.ts#L23-L48) Select to character (excluded). @@ -1026,7 +1034,7 @@ Default keybinding: `t` (core: normal) -### [`seek.enclosing`](../seek.ts#L81-L101) +### [`seek.enclosing`](../seek.ts#L88-L108) Select to next enclosing character. @@ -1047,7 +1055,7 @@ Default keybinding: `m` (kakoune: normal) -### [`seek.word`](../seek.ts#L174-L205) +### [`seek.word`](../seek.ts#L181-L212) Select to next word start. @@ -1079,7 +1087,7 @@ Default keybinding: `w` (core: normal) -### [`seek.object`](../seek.ts#L249-L291) +### [`seek.object`](../seek.ts#L256-L298) Select object. @@ -1119,7 +1127,7 @@ This command: -### [`seek.syntax.experimental`](../seek.ts#L564-L583) +### [`seek.syntax.experimental`](../seek.ts#L571-L590) Select syntax object. @@ -1137,7 +1145,7 @@ This command: -### [`seek.leap`](../seek.ts#L617-L633) +### [`seek.leap`](../seek.ts#L624-L640) Leap forward. diff --git a/src/commands/seek.ts b/src/commands/seek.ts index 9c99dd62..da5bb9e7 100644 --- a/src/commands/seek.ts +++ b/src/commands/seek.ts @@ -10,6 +10,13 @@ import { SyntaxNode, Tree, TreeSitter } from "../utils/tree-sitter"; /** * Update selections based on the text surrounding them. + * + * #### Predefined keybindings + * + * | Title | Keybinding | Command | + * | --------------------------- | ------------------- | ------------------------------------------------------------- | + * | Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | + * | Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{shift: "extend"}] }]` | */ declare module "./seek"; diff --git a/src/state/extension.ts b/src/state/extension.ts index 821c374d..6085d262 100644 --- a/src/state/extension.ts +++ b/src/state/extension.ts @@ -35,11 +35,6 @@ export class Extension implements vscode.Disposable { return this._gotoMenus as ReadonlyMap; } - private _behavior = ""; - public get behavior() { - return this._behavior; - } - // State. // ========================================================================== @@ -173,15 +168,6 @@ export class Extension implements vscode.Disposable { true, ); - this.observePreference( - ".behavior", - (value, _validator, _inspect) => { - this._behavior = value; - vscode.commands.executeCommand("setContext", "dance.behavior", this._behavior); - }, - true, - ); - this._subscriptions.push( // Update configuration automatically. vscode.workspace.onDidChangeConfiguration((e) => { From 7e1a759c47d1859a73d8fbfae2844f8736136494 Mon Sep 17 00:00:00 2001 From: Strackeror Date: Mon, 15 Jul 2024 15:43:21 +0200 Subject: [PATCH 03/16] Fix shift+c in helix modes Remove category field from package.json --- extensions/helix/package.build.ts | 3 +- extensions/helix/package.json | 222 +++--------------------------- package.build.ts | 3 +- package.json | 189 ------------------------- src/api/data/commands.yaml | 10 +- src/commands/README.md | 13 +- src/commands/layouts/azerty.fr.md | 13 +- src/commands/layouts/qwerty.md | 13 +- src/commands/selections.ts | 8 +- 9 files changed, 53 insertions(+), 421 deletions(-) diff --git a/extensions/helix/package.build.ts b/extensions/helix/package.build.ts index 6f812156..c22e0c3b 100644 --- a/extensions/helix/package.build.ts +++ b/extensions/helix/package.build.ts @@ -180,7 +180,8 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ keybindings = modules .flatMap((module) => module.keybindings) .filter((keybinding) => ["core", "helix", undefined].includes(keybinding.category)) - .map((k) => ({ ...k })); + .map(({ category, ...kb }) => kb); + for (const mode of ["normal", "select", "insert"]) { for (const keybind of keybindings) { keybind.when = keybind.when.replace(`dance.mode == '${mode}'`, `dance.mode == 'helix/${mode}'`); diff --git a/extensions/helix/package.json b/extensions/helix/package.json index 6928e837..8d9cfe88 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -410,287 +410,246 @@ }, "keybindings": [ { - "category": "core", "key": "Shift+7", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Align selections", "command": "dance.edit.align" }, { - "category": "helix", "key": "Shift+`", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Swap case", "command": "dance.edit.case.swap" }, { - "category": "helix", "key": "Shift+`", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Swap case", "command": "dance.edit.case.swap" }, { - "category": "core", "key": "`", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Transform to lower case", "command": "dance.edit.case.toLower" }, { - "category": "helix", "key": "`", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Transform to lower case", "command": "dance.edit.case.toLower" }, { - "category": "helix", "key": "Alt+`", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Transform to upper case", "command": "dance.edit.case.toUpper" }, { - "category": "helix", "key": "Alt+`", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Transform to upper case", "command": "dance.edit.case.toUpper" }, { - "category": "core", "key": "Shift+,", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Deindent selected lines (including incomplete indent)", "command": "dance.edit.deindent.withIncomplete" }, { - "category": "helix", "key": "Shift+,", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Deindent selected lines (including incomplete indent)", "command": "dance.edit.deindent.withIncomplete" }, { - "category": "core", "key": "Alt+D", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Delete", "command": "dance.edit.delete" }, { - "category": "helix", "key": "Alt+D", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Delete", "command": "dance.edit.delete" }, { - "category": "core", "key": "Shift+.", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Indent selected lines", "command": "dance.edit.indent" }, { - "category": "helix", "key": "Shift+.", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Indent selected lines", "command": "dance.edit.indent" }, { - "category": "helix", "key": "Shift+J", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Join lines", "command": "dance.edit.join" }, { - "category": "helix", "key": "Shift+J", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Join lines", "command": "dance.edit.join" }, { - "category": "core", "key": "Shift+Alt+J", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Join lines and select inserted separators", "command": "dance.edit.join.select" }, { - "category": "helix", "key": "Shift+Alt+J", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Join lines and select inserted separators", "command": "dance.edit.join.select" }, { - "category": "core", "key": "Shift+O", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Insert new line above and switch to insert", "command": "dance.edit.newLine.above.insert" }, { - "category": "helix", "key": "Shift+O", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Insert new line above and switch to insert", "command": "dance.edit.newLine.above.insert" }, { - "category": "core", "key": "O", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Insert new line below and switch to insert", "command": "dance.edit.newLine.below.insert" }, { - "category": "helix", "key": "O", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Insert new line below and switch to insert", "command": "dance.edit.newLine.below.insert" }, { - "category": "helix", "key": "P", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Paste after", "command": "dance.edit.paste.after" }, { - "category": "core", "key": "P", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Paste after and select", "command": "dance.edit.paste.after.select" }, { - "category": "helix", "key": "Shift+P", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Paste before", "command": "dance.edit.paste.before" }, { - "category": "core", "key": "Shift+P", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Paste before and select", "command": "dance.edit.paste.before.select" }, { - "category": "core", "key": "R", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Replace characters", "command": "dance.edit.replaceCharacters" }, { - "category": "core", "key": "D", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Copy and delete", "command": "dance.edit.yank-delete" }, { - "category": "helix", "key": "D", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Copy and delete", "command": "dance.edit.yank-delete" }, { - "category": "core", "key": "C", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Copy, delete and switch to Insert", "command": "dance.edit.yank-delete-insert" }, { - "category": "helix", "key": "C", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Copy, delete and switch to Insert", "command": "dance.edit.yank-delete-insert" }, { - "category": "core", "key": "Shift+U", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Redo", "command": "dance.history.redo" }, { - "category": "helix", "key": "Shift+U", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Redo", "command": "dance.history.redo" }, { - "category": "core", "key": ".", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Repeat last edit without a command", "command": "dance.history.repeat.edit" }, { - "category": "core", "key": "NumPad_Decimal", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Repeat last edit without a command", "command": "dance.history.repeat.edit" }, { - "category": "core", "key": "Alt+.", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Repeat last seek", "command": "dance.history.repeat.seek" }, { - "category": "helix", "key": "Alt+.", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Repeat last seek", "command": "dance.history.repeat.seek" }, { - "category": "core", "key": "U", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Undo", "command": "dance.history.undo" }, { - "category": "helix", "key": "U", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Undo", "command": "dance.history.undo" }, { - "category": "core", "key": "Escape", "when": "editorTextFocus && dance.mode == 'helix/normal' && !dance.isRecording && !markersNavigationVisible", "title": "Cancel Dance operation", "command": "dance.cancel" }, { - "category": "core", "key": "Escape", "when": "editorTextFocus && dance.mode == 'input'", "title": "Cancel Dance operation", "command": "dance.cancel" }, { - "category": "core", "key": "Up", "when": "inputFocus && dance.inPrompt", "command": "dance.changeInput", @@ -699,7 +658,6 @@ } }, { - "category": "core", "key": "Down", "when": "inputFocus && dance.inPrompt", "command": "dance.changeInput", @@ -708,14 +666,12 @@ } }, { - "category": "core", "key": "Shift+'", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select register for next command", "command": "dance.selectRegister" }, { - "category": "core", "key": "0", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 0 to the counter", @@ -725,7 +681,6 @@ } }, { - "category": "core", "key": "NumPad0", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 0 to the counter", @@ -735,7 +690,6 @@ } }, { - "category": "core", "key": "1", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 1 to the counter", @@ -745,7 +699,6 @@ } }, { - "category": "core", "key": "NumPad1", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 1 to the counter", @@ -755,7 +708,6 @@ } }, { - "category": "core", "key": "2", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 2 to the counter", @@ -765,7 +717,6 @@ } }, { - "category": "core", "key": "NumPad2", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 2 to the counter", @@ -775,7 +726,6 @@ } }, { - "category": "core", "key": "3", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 3 to the counter", @@ -785,7 +735,6 @@ } }, { - "category": "core", "key": "NumPad3", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 3 to the counter", @@ -795,7 +744,6 @@ } }, { - "category": "core", "key": "4", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 4 to the counter", @@ -805,7 +753,6 @@ } }, { - "category": "core", "key": "NumPad4", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 4 to the counter", @@ -815,7 +762,6 @@ } }, { - "category": "core", "key": "5", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 5 to the counter", @@ -825,7 +771,6 @@ } }, { - "category": "core", "key": "NumPad5", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 5 to the counter", @@ -835,7 +780,6 @@ } }, { - "category": "core", "key": "6", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 6 to the counter", @@ -845,7 +789,6 @@ } }, { - "category": "core", "key": "NumPad6", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 6 to the counter", @@ -855,7 +798,6 @@ } }, { - "category": "core", "key": "7", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 7 to the counter", @@ -865,7 +807,6 @@ } }, { - "category": "core", "key": "NumPad7", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 7 to the counter", @@ -875,7 +816,6 @@ } }, { - "category": "core", "key": "8", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 8 to the counter", @@ -885,7 +825,6 @@ } }, { - "category": "core", "key": "NumPad8", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 8 to the counter", @@ -895,7 +834,6 @@ } }, { - "category": "core", "key": "9", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 9 to the counter", @@ -905,7 +843,6 @@ } }, { - "category": "core", "key": "NumPad9", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 9 to the counter", @@ -915,7 +852,6 @@ } }, { - "category": "core", "key": "Shift+;", "when": "editorTextFocus && dance.mode == 'helix/normal'", "command": "workbench.action.showCommands", @@ -924,182 +860,156 @@ } }, { - "category": "core", "key": "A", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Insert after", "command": "dance.modes.insert.after" }, { - "category": "helix", "key": "A", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Insert after", "command": "dance.modes.insert.after" }, { - "category": "core", "key": "I", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Insert before", "command": "dance.modes.insert.before" }, { - "category": "helix", "key": "I", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Insert before", "command": "dance.modes.insert.before" }, { - "category": "core", "key": "Shift+A", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Insert at line end", "command": "dance.modes.insert.lineEnd" }, { - "category": "helix", "key": "Shift+A", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Insert at line end", "command": "dance.modes.insert.lineEnd" }, { - "category": "core", "key": "Shift+I", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Insert at line start", "command": "dance.modes.insert.lineStart" }, { - "category": "helix", "key": "Shift+I", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Insert at line start", "command": "dance.modes.insert.lineStart" }, { - "category": "core", "key": "Escape", "when": "editorTextFocus && dance.mode == 'helix/insert'", "title": "Set mode to Normal", "command": "dance.modes.set.normal" }, { - "category": "helix", "key": "Escape", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Set mode to Normal", "command": "dance.modes.set.normal" }, { - "category": "helix", "key": "V", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Set mode to Normal", "command": "dance.modes.set.normal" }, { - "category": "helix", "key": "V", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Set mode to Select", "command": "dance.modes.set.select" }, { - "category": "core", "key": "/", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Search", "command": "dance.search" }, { - "category": "core", "key": "NumPad_Divide", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Search", "command": "dance.search" }, { - "category": "helix", "key": "Shift+/", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Search backward", "command": "dance.search.backward" }, { - "category": "helix", "key": "Shift+/", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Search backward (extend)", "command": "dance.search.backward.extend" }, { - "category": "helix", "key": "/", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Search (extend)", "command": "dance.search.extend" }, { - "category": "core", "key": "N", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select next match", "command": "dance.search.next" }, { - "category": "helix", "key": "N", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add next match", "command": "dance.search.next.add" }, { - "category": "helix", "key": "Shift+N", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select previous match", "command": "dance.search.previous" }, { - "category": "helix", "key": "Shift+N", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add previous match", "command": "dance.search.previous.add" }, { - "category": "core", "key": "Shift+Alt+8", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Search current selection", "command": "dance.search.selection" }, { - "category": "core", "key": "Alt+NumPad_Multiply", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Search current selection", "command": "dance.search.selection" }, { - "category": "core", "key": "Shift+8", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Search current selection (smart)", "command": "dance.search.selection.smart" }, { - "category": "core", "key": "NumPad_Multiply", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Search current selection (smart)", "command": "dance.search.selection.smart" }, { - "category": "helix", "key": "M", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Open match menu", @@ -1109,7 +1019,6 @@ } }, { - "category": "helix", "key": "M", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Open match menu with extend", @@ -1124,315 +1033,270 @@ } }, { - "category": "core", "key": "T", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to character (excluded)", "command": "dance.seek" }, { - "category": "helix", "key": "Shift+T", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to character (excluded, backward)", "command": "dance.seek.backward" }, { - "category": "helix", "key": "T", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to character (excluded)", "command": "dance.seek.extend" }, { - "category": "helix", "key": "Shift+T", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to character (excluded, backward)", "command": "dance.seek.extend.backward" }, { - "category": "core", "key": "F", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to character (included)", "command": "dance.seek.included" }, { - "category": "helix", "key": "Shift+F", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to character (included, backward)", "command": "dance.seek.included.backward" }, { - "category": "helix", "key": "F", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to character (included)", "command": "dance.seek.included.extend" }, { - "category": "helix", "key": "Shift+F", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to character (included, backward)", "command": "dance.seek.included.extend.backward" }, { - "category": "core", "key": "W", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to next word start", "command": "dance.seek.word" }, { - "category": "core", "key": "B", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to previous word start", "command": "dance.seek.word.backward" }, { - "category": "helix", "key": "W", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to next word start", "command": "dance.seek.word.extend" }, { - "category": "helix", "key": "B", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to previous word start", "command": "dance.seek.word.extend.backward" }, { - "category": "helix", "key": "Shift+W", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to next non-whitespace word start", "command": "dance.seek.word.ws" }, { - "category": "helix", "key": "Shift+B", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to previous non-whitespace word start", "command": "dance.seek.word.ws.backward" }, { - "category": "helix", "key": "Shift+W", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to next non-whitespace word start", "command": "dance.seek.word.ws.extend" }, { - "category": "helix", "key": "Shift+B", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to previous non-whitespace word start", "command": "dance.seek.word.ws.extend.backward" }, { - "category": "core", "key": "E", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to next word end", "command": "dance.seek.wordEnd" }, { - "category": "helix", "key": "E", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to next word end", "command": "dance.seek.wordEnd.extend" }, { - "category": "helix", "key": "Shift+E", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to next non-whitespace word end", "command": "dance.seek.wordEnd.ws" }, { - "category": "helix", "key": "Shift+E", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to next non-whitespace word end", "command": "dance.seek.wordEnd.ws.extend" }, { - "category": "helix", "key": "J", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend down", "command": "dance.select.down.extend" }, { - "category": "helix", "key": "Down", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend down", "command": "dance.select.down.extend" }, { - "category": "core", "key": "J", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Jump down", "command": "dance.select.down.jump" }, { - "category": "core", "key": "Down", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Jump down", "command": "dance.select.down.jump" }, { - "category": "helix", "key": "H", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend left", "command": "dance.select.left.extend" }, { - "category": "helix", "key": "Left", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend left", "command": "dance.select.left.extend" }, { - "category": "core", "key": "H", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Jump left", "command": "dance.select.left.jump" }, { - "category": "core", "key": "Left", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Jump left", "command": "dance.select.left.jump" }, { - "category": "helix", "key": "X", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Extend to line below", "command": "dance.select.line.below.extend" }, { - "category": "helix", "key": "X", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to line below", "command": "dance.select.line.below.extend" }, { - "category": "core", "key": "End", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to line end", "command": "dance.select.lineEnd" }, { - "category": "helix", "key": "End", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to line end", "command": "dance.select.lineEnd.extend" }, { - "category": "core", "key": "Home", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Select to line start", "command": "dance.select.lineStart" }, { - "category": "helix", "key": "Home", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to line start", "command": "dance.select.lineStart.extend" }, { - "category": "helix", "key": "L", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend right", "command": "dance.select.right.extend" }, { - "category": "helix", "key": "Right", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend right", "command": "dance.select.right.extend" }, { - "category": "core", "key": "L", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Jump right", "command": "dance.select.right.jump" }, { - "category": "core", "key": "Right", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Jump right", "command": "dance.select.right.jump" }, { - "category": "helix", "key": "G", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend to", "command": "dance.select.to.extend" }, { - "category": "core", "key": "G", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Go to", "command": "dance.select.to.jump" }, { - "category": "helix", "key": "K", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend up", "command": "dance.select.up.extend" }, { - "category": "helix", "key": "Up", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Extend up", "command": "dance.select.up.extend" }, { - "category": "core", "key": "K", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Jump up", "command": "dance.select.up.jump" }, { - "category": "core", "key": "Up", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Jump up", "command": "dance.select.up.jump" }, { - "category": "core", "key": "Ctrl+F", "when": "editorTextFocus && dance.mode == 'helix/normal'", "command": "dance.select.vertically", @@ -1443,7 +1307,6 @@ } }, { - "category": "core", "key": "Ctrl+F", "when": "editorTextFocus && dance.mode == 'helix/insert'", "command": "dance.select.vertically", @@ -1454,7 +1317,6 @@ } }, { - "category": "core", "key": "Ctrl+D", "when": "editorTextFocus && dance.mode == 'helix/normal'", "command": "dance.select.vertically", @@ -1465,7 +1327,6 @@ } }, { - "category": "core", "key": "Ctrl+D", "when": "editorTextFocus && dance.mode == 'helix/insert'", "command": "dance.select.vertically", @@ -1476,7 +1337,6 @@ } }, { - "category": "core", "key": "Ctrl+B", "when": "editorTextFocus && dance.mode == 'helix/normal'", "command": "dance.select.vertically", @@ -1487,7 +1347,6 @@ } }, { - "category": "core", "key": "Ctrl+B", "when": "editorTextFocus && dance.mode == 'helix/insert'", "command": "dance.select.vertically", @@ -1498,7 +1357,6 @@ } }, { - "category": "core", "key": "Ctrl+U", "when": "editorTextFocus && dance.mode == 'helix/normal'", "command": "dance.select.vertically", @@ -1509,7 +1367,6 @@ } }, { - "category": "core", "key": "Ctrl+U", "when": "editorTextFocus && dance.mode == 'helix/insert'", "command": "dance.select.vertically", @@ -1520,7 +1377,6 @@ } }, { - "category": "helix", "key": "Ctrl+F", "when": "editorTextFocus && dance.mode == 'helix/select'", "command": "dance.select.vertically", @@ -1531,7 +1387,6 @@ } }, { - "category": "helix", "key": "Ctrl+D", "when": "editorTextFocus && dance.mode == 'helix/select'", "command": "dance.select.vertically", @@ -1542,7 +1397,6 @@ } }, { - "category": "helix", "key": "Ctrl+B", "when": "editorTextFocus && dance.mode == 'helix/select'", "command": "dance.select.vertically", @@ -1553,7 +1407,6 @@ } }, { - "category": "helix", "key": "Ctrl+U", "when": "editorTextFocus && dance.mode == 'helix/select'", "command": "dance.select.vertically", @@ -1564,308 +1417,282 @@ } }, { - "category": "core", "key": "Alt+;", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Change direction of selections", "command": "dance.selections.changeDirection" }, { - "category": "helix", "key": "Alt+;", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Change direction of selections", "command": "dance.selections.changeDirection" }, { - "category": "core", "key": "Alt+,", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Clear main selections", "command": "dance.selections.clear.main" }, { - "category": "helix", "key": "Alt+,", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Clear main selections", "command": "dance.selections.clear.main" }, { - "category": "core", "key": ",", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Clear secondary selections", "command": "dance.selections.clear.secondary" }, { - "category": "helix", "key": ",", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Clear secondary selections", "command": "dance.selections.clear.secondary" }, { - "category": "helix", + "key": "Shift+C", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Copy selections below", + "command": "dance.selections.copy" + }, + { + "key": "Shift+C", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Copy selections below", + "command": "dance.selections.copy" + }, + { + "key": "Shift+Alt+C", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Copy selections above", + "command": "dance.selections.copy.above" + }, + { "key": "Shift+X", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Expand to lines", "command": "dance.selections.expandToLines" }, { - "category": "helix", "key": "Shift+X", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Expand to lines", "command": "dance.selections.expandToLines" }, { - "category": "core", "key": "Shift+4", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Filter selections", "command": "dance.selections.filter" }, { - "category": "helix", "key": "Shift+4", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Filter selections", "command": "dance.selections.filter" }, { - "category": "core", "key": "Alt+K", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Keep matching selections", "command": "dance.selections.filter.regexp" }, { - "category": "helix", "key": "Alt+K", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Keep matching selections", "command": "dance.selections.filter.regexp" }, { - "category": "core", "key": "Shift+Alt+K", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Clear matching selections", "command": "dance.selections.filter.regexp.inverse" }, { - "category": "helix", "key": "Shift+Alt+K", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Clear matching selections", "command": "dance.selections.filter.regexp.inverse" }, { - "category": "core", "key": "Shift+Alt+\\", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Pipe selections", "command": "dance.selections.pipe" }, { - "category": "helix", "key": "Shift+Alt+\\", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Pipe selections", "command": "dance.selections.pipe" }, { - "category": "core", "key": "Shift+1", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Pipe and append", "command": "dance.selections.pipe.append" }, { - "category": "helix", "key": "Shift+1", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Pipe and append", "command": "dance.selections.pipe.append" }, { - "category": "core", "key": "Shift+Alt+1", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Pipe and prepend", "command": "dance.selections.pipe.prepend" }, { - "category": "helix", "key": "Shift+Alt+1", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Pipe and prepend", "command": "dance.selections.pipe.prepend" }, { - "category": "core", "key": "Shift+\\", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Pipe and replace", "command": "dance.selections.pipe.replace" }, { - "category": "helix", "key": "Shift+\\", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Pipe and replace", "command": "dance.selections.pipe.replace" }, { - "category": "core", "key": ";", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Reduce selections to their cursor", "command": "dance.selections.reduce" }, { - "category": "helix", "key": ";", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Reduce selections to their cursor", "command": "dance.selections.reduce" }, { - "category": "core", "key": "Y", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Copy selections text", "command": "dance.selections.saveText" }, { - "category": "helix", "key": "Y", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Copy selections text", "command": "dance.selections.saveText" }, { - "category": "core", "key": "S", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Leap or select", "command": "dance.selections.select.orLeap" }, { - "category": "helix", "key": "S", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Leap or select", "command": "dance.selections.select.orLeap" }, { - "category": "core", "key": "Shift+S", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Split selections", "command": "dance.selections.split" }, { - "category": "helix", "key": "Shift+S", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Split selections", "command": "dance.selections.split" }, { - "category": "core", "key": "Alt+S", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Leap or select backward", "command": "dance.selections.splitLines.orLeap.backward" }, { - "category": "helix", "key": "Alt+S", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Leap or select backward", "command": "dance.selections.splitLines.orLeap.backward" }, { - "category": "core", "key": "Alt+X", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Trim lines", "command": "dance.selections.trimLines" }, { - "category": "helix", "key": "Alt+X", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Trim lines", "command": "dance.selections.trimLines" }, { - "category": "core", "key": "Shift+-", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Trim whitespace", "command": "dance.selections.trimWhitespace" }, { - "category": "helix", "key": "Shift+-", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Trim whitespace", "command": "dance.selections.trimWhitespace" }, { - "category": "helix", "key": "Shift+Alt+0", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Rotate selections clockwise (contents only)", "command": "dance.selections.rotate.contents" }, { - "category": "helix", "key": "Shift+Alt+0", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Rotate selections clockwise (contents only)", "command": "dance.selections.rotate.contents" }, { - "category": "helix", "key": "Shift+Alt+9", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Rotate selections counter-clockwise (contents only)", "command": "dance.selections.rotate.contents.reverse" }, { - "category": "helix", "key": "Shift+Alt+9", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Rotate selections counter-clockwise (contents only)", "command": "dance.selections.rotate.contents.reverse" }, { - "category": "core", "key": "Shift+0", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Rotate selections clockwise (selections only)", "command": "dance.selections.rotate.selections" }, { - "category": "core", "key": "Shift+9", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Rotate selections counter-clockwise (selections only)", "command": "dance.selections.rotate.selections.reverse" }, { - "category": "helix", "key": "Shift+9", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Rotate selections counter-clockwise (selections only)", "command": "dance.selections.rotate.selections.reverse" }, { - "category": "helix", "key": "Z", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Show view menu", @@ -1876,7 +1703,6 @@ } }, { - "category": "helix", "key": "Z", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Show view menu", @@ -1887,7 +1713,6 @@ } }, { - "category": "helix", "key": "Shift+Z", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Show view menu (locked)", @@ -1899,7 +1724,6 @@ } }, { - "category": "helix", "key": "Shift+Z", "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Show view menu (locked)", @@ -1915,11 +1739,6 @@ "command": "dance.ignore", "when": "dance.mode == 'helix/normal'" }, - { - "key": "Shift+C", - "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" - }, { "key": "Shift+D", "command": "dance.ignore", @@ -2110,11 +1929,6 @@ "command": "dance.ignore", "when": "dance.mode == 'helix/select'" }, - { - "key": "Shift+C", - "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" - }, { "key": "Shift+D", "command": "dance.ignore", diff --git a/package.build.ts b/package.build.ts index f0da06bb..ba3ace41 100644 --- a/package.build.ts +++ b/package.build.ts @@ -758,7 +758,8 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ keybindings: (() => { const keybindings = modules .flatMap((module) => module.keybindings) - .filter((keybinding) => ["core", "kakoune", undefined].includes(keybinding.category)); + .filter((keybinding) => ["core", "kakoune", undefined].includes(keybinding.category)) + .map(({ category, ...kb }) => kb); return [ ...keybindings, diff --git a/package.json b/package.json index 4b88c4c1..4c3399d7 100644 --- a/package.json +++ b/package.json @@ -2777,294 +2777,252 @@ }, "keybindings": [ { - "category": "core", "key": "Shift+7", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Align selections", "command": "dance.edit.align" }, { - "category": "kakoune", "key": "Alt+`", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Swap case", "command": "dance.edit.case.swap" }, { - "category": "core", "key": "`", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Transform to lower case", "command": "dance.edit.case.toLower" }, { - "category": "kakoune", "key": "Shift+`", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Transform to upper case", "command": "dance.edit.case.toUpper" }, { - "category": "kakoune", "key": "Shift+Alt+7", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy indentation", "command": "dance.edit.copyIndentation" }, { - "category": "kakoune", "key": "Shift+Alt+,", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Deindent selected lines", "command": "dance.edit.deindent" }, { - "category": "core", "key": "Shift+,", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Deindent selected lines (including incomplete indent)", "command": "dance.edit.deindent.withIncomplete" }, { - "category": "core", "key": "Alt+D", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Delete", "command": "dance.edit.delete" }, { - "category": "kakoune", "key": "Alt+C", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Delete and switch to Insert", "command": "dance.edit.delete-insert" }, { - "category": "core", "key": "Shift+.", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Indent selected lines", "command": "dance.edit.indent" }, { - "category": "kakoune", "key": "Shift+Alt+.", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Indent selected lines (including empty lines)", "command": "dance.edit.indent.withEmpty" }, { - "category": "kakoune", "key": "Shift+Alt+R", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert contents of register", "command": "dance.edit.insert" }, { - "category": "kakoune", "key": "Alt+J", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Join lines", "command": "dance.edit.join" }, { - "category": "core", "key": "Shift+Alt+J", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Join lines and select inserted separators", "command": "dance.edit.join.select" }, { - "category": "kakoune", "key": "Shift+Alt+O", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert new line above each selection", "command": "dance.edit.newLine.above" }, { - "category": "core", "key": "Shift+O", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert new line above and switch to insert", "command": "dance.edit.newLine.above.insert" }, { - "category": "kakoune", "key": "Alt+O", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert new line below each selection", "command": "dance.edit.newLine.below" }, { - "category": "core", "key": "O", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert new line below and switch to insert", "command": "dance.edit.newLine.below.insert" }, { - "category": "core", "key": "P", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Paste after and select", "command": "dance.edit.paste.after.select" }, { - "category": "core", "key": "Shift+P", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Paste before and select", "command": "dance.edit.paste.before.select" }, { - "category": "kakoune", "key": "Alt+P", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Paste all after and select", "command": "dance.edit.pasteAll.after.select" }, { - "category": "kakoune", "key": "Shift+Alt+P", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Paste all before and select", "command": "dance.edit.pasteAll.before.select" }, { - "category": "core", "key": "R", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Replace characters", "command": "dance.edit.replaceCharacters" }, { - "category": "kakoune", "key": "Ctrl+R", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pick register and replace", "command": "dance.edit.selectRegister-insert" }, { - "category": "kakoune", "key": "Ctrl+R", "when": "editorTextFocus && dance.mode == 'insert'", "title": "Pick register and replace", "command": "dance.edit.selectRegister-insert" }, { - "category": "core", "key": "D", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy and delete", "command": "dance.edit.yank-delete" }, { - "category": "core", "key": "C", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy, delete and switch to Insert", "command": "dance.edit.yank-delete-insert" }, { - "category": "kakoune", "key": "Shift+R", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy and replace", "command": "dance.edit.yank-replace" }, { - "category": "kakoune", "key": "Q", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Replay recording", "command": "dance.history.recording.play" }, { - "category": "kakoune", "key": "Shift+Q", "when": "editorTextFocus && dance.mode == 'normal' && !dance.isRecording", "title": "Start recording", "command": "dance.history.recording.start" }, { - "category": "kakoune", "key": "Escape", "when": "editorTextFocus && dance.mode == 'normal' && dance.isRecording", "title": "Stop recording", "command": "dance.history.recording.stop" }, { - "category": "kakoune", "key": "Shift+Q", "when": "editorTextFocus && dance.mode == 'normal' && dance.isRecording", "title": "Stop recording", "command": "dance.history.recording.stop" }, { - "category": "core", "key": "Shift+U", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Redo", "command": "dance.history.redo" }, { - "category": "kakoune", "key": "Shift+Alt+U", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Redo a change of selections", "command": "dance.history.redo.selections" }, { - "category": "core", "key": ".", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Repeat last edit without a command", "command": "dance.history.repeat.edit" }, { - "category": "core", "key": "NumPad_Decimal", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Repeat last edit without a command", "command": "dance.history.repeat.edit" }, { - "category": "core", "key": "Alt+.", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Repeat last seek", "command": "dance.history.repeat.seek" }, { - "category": "core", "key": "U", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Undo", "command": "dance.history.undo" }, { - "category": "kakoune", "key": "Alt+U", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Undo a change of selections", "command": "dance.history.undo.selections" }, { - "category": "core", "key": "Escape", "when": "editorTextFocus && dance.mode == 'normal' && !dance.isRecording && !markersNavigationVisible", "title": "Cancel Dance operation", "command": "dance.cancel" }, { - "category": "core", "key": "Escape", "when": "editorTextFocus && dance.mode == 'input'", "title": "Cancel Dance operation", "command": "dance.cancel" }, { - "category": "core", "key": "Up", "when": "inputFocus && dance.inPrompt", "command": "dance.changeInput", @@ -3073,7 +3031,6 @@ } }, { - "category": "core", "key": "Down", "when": "inputFocus && dance.inPrompt", "command": "dance.changeInput", @@ -3082,14 +3039,12 @@ } }, { - "category": "core", "key": "Shift+'", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select register for next command", "command": "dance.selectRegister" }, { - "category": "core", "key": "0", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 0 to the counter", @@ -3099,7 +3054,6 @@ } }, { - "category": "core", "key": "NumPad0", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 0 to the counter", @@ -3109,7 +3063,6 @@ } }, { - "category": "core", "key": "1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 1 to the counter", @@ -3119,7 +3072,6 @@ } }, { - "category": "core", "key": "NumPad1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 1 to the counter", @@ -3129,7 +3081,6 @@ } }, { - "category": "core", "key": "2", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 2 to the counter", @@ -3139,7 +3090,6 @@ } }, { - "category": "core", "key": "NumPad2", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 2 to the counter", @@ -3149,7 +3099,6 @@ } }, { - "category": "core", "key": "3", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 3 to the counter", @@ -3159,7 +3108,6 @@ } }, { - "category": "core", "key": "NumPad3", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 3 to the counter", @@ -3169,7 +3117,6 @@ } }, { - "category": "core", "key": "4", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 4 to the counter", @@ -3179,7 +3126,6 @@ } }, { - "category": "core", "key": "NumPad4", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 4 to the counter", @@ -3189,7 +3135,6 @@ } }, { - "category": "core", "key": "5", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 5 to the counter", @@ -3199,7 +3144,6 @@ } }, { - "category": "core", "key": "NumPad5", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 5 to the counter", @@ -3209,7 +3153,6 @@ } }, { - "category": "core", "key": "6", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 6 to the counter", @@ -3219,7 +3162,6 @@ } }, { - "category": "core", "key": "NumPad6", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 6 to the counter", @@ -3229,7 +3171,6 @@ } }, { - "category": "core", "key": "7", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 7 to the counter", @@ -3239,7 +3180,6 @@ } }, { - "category": "core", "key": "NumPad7", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 7 to the counter", @@ -3249,7 +3189,6 @@ } }, { - "category": "core", "key": "8", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 8 to the counter", @@ -3259,7 +3198,6 @@ } }, { - "category": "core", "key": "NumPad8", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 8 to the counter", @@ -3269,7 +3207,6 @@ } }, { - "category": "core", "key": "9", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 9 to the counter", @@ -3279,7 +3216,6 @@ } }, { - "category": "core", "key": "NumPad9", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add the digit 9 to the counter", @@ -3289,7 +3225,6 @@ } }, { - "category": "core", "key": "Shift+;", "when": "editorTextFocus && dance.mode == 'normal'", "command": "workbench.action.showCommands", @@ -3298,588 +3233,504 @@ } }, { - "category": "core", "key": "A", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert after", "command": "dance.modes.insert.after" }, { - "category": "core", "key": "I", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert before", "command": "dance.modes.insert.before" }, { - "category": "core", "key": "Shift+A", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert at line end", "command": "dance.modes.insert.lineEnd" }, { - "category": "core", "key": "Shift+I", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Insert at line start", "command": "dance.modes.insert.lineStart" }, { - "category": "core", "key": "Escape", "when": "editorTextFocus && dance.mode == 'insert'", "title": "Set mode to Normal", "command": "dance.modes.set.normal" }, { - "category": "kakoune", "key": "Ctrl+V", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Temporary Insert mode", "command": "dance.modes.set.temporarily.insert" }, { - "category": "kakoune", "key": "Ctrl+V", "when": "editorTextFocus && dance.mode == 'insert'", "title": "Temporary Normal mode", "command": "dance.modes.set.temporarily.normal" }, { - "category": "core", "key": "/", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search", "command": "dance.search" }, { - "category": "core", "key": "NumPad_Divide", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search", "command": "dance.search" }, { - "category": "kakoune", "key": "Alt+/", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search backward", "command": "dance.search.backward" }, { - "category": "kakoune", "key": "Shift+Alt+/", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search backward (extend)", "command": "dance.search.backward.extend" }, { - "category": "kakoune", "key": "Shift+/", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search (extend)", "command": "dance.search.extend" }, { - "category": "core", "key": "N", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select next match", "command": "dance.search.next" }, { - "category": "kakoune", "key": "Shift+N", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add next match", "command": "dance.search.next.add" }, { - "category": "kakoune", "key": "Alt+N", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select previous match", "command": "dance.search.previous" }, { - "category": "kakoune", "key": "Shift+Alt+N", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Add previous match", "command": "dance.search.previous.add" }, { - "category": "core", "key": "Shift+Alt+8", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search current selection", "command": "dance.search.selection" }, { - "category": "core", "key": "Alt+NumPad_Multiply", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search current selection", "command": "dance.search.selection" }, { - "category": "core", "key": "Shift+8", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search current selection (smart)", "command": "dance.search.selection.smart" }, { - "category": "core", "key": "NumPad_Multiply", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Search current selection (smart)", "command": "dance.search.selection.smart" }, { - "category": "core", "key": "T", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to character (excluded)", "command": "dance.seek" }, { - "category": "kakoune", "key": "Alt+A", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select whole object", "command": "dance.seek.askObject" }, { - "category": "kakoune", "key": "Alt+A", "when": "editorTextFocus && dance.mode == 'insert'", "title": "Select whole object", "command": "dance.seek.askObject" }, { - "category": "kakoune", "key": "]", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to whole object end", "command": "dance.seek.askObject.end" }, { - "category": "kakoune", "key": "Shift+]", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to whole object end", "command": "dance.seek.askObject.end.extend" }, { - "category": "kakoune", "key": "Alt+I", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select inner object", "command": "dance.seek.askObject.inner" }, { - "category": "kakoune", "key": "Alt+I", "when": "editorTextFocus && dance.mode == 'insert'", "title": "Select inner object", "command": "dance.seek.askObject.inner" }, { - "category": "kakoune", "key": "Alt+]", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to inner object end", "command": "dance.seek.askObject.inner.end" }, { - "category": "kakoune", "key": "Shift+Alt+]", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to inner object end", "command": "dance.seek.askObject.inner.end.extend" }, { - "category": "kakoune", "key": "Alt+[", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to inner object start", "command": "dance.seek.askObject.inner.start" }, { - "category": "kakoune", "key": "Shift+Alt+[", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to inner object start", "command": "dance.seek.askObject.inner.start.extend" }, { - "category": "kakoune", "key": "[", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to whole object start", "command": "dance.seek.askObject.start" }, { - "category": "kakoune", "key": "Shift+[", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to whole object start", "command": "dance.seek.askObject.start.extend" }, { - "category": "kakoune", "key": "Alt+T", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to character (excluded, backward)", "command": "dance.seek.backward" }, { - "category": "kakoune", "key": "M", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next enclosing character", "command": "dance.seek.enclosing" }, { - "category": "kakoune", "key": "Alt+M", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to previous enclosing character", "command": "dance.seek.enclosing.backward" }, { - "category": "kakoune", "key": "Shift+M", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next enclosing character", "command": "dance.seek.enclosing.extend" }, { - "category": "kakoune", "key": "Shift+Alt+M", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to previous enclosing character", "command": "dance.seek.enclosing.extend.backward" }, { - "category": "kakoune", "key": "Shift+T", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to character (excluded)", "command": "dance.seek.extend" }, { - "category": "kakoune", "key": "Shift+Alt+T", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to character (excluded, backward)", "command": "dance.seek.extend.backward" }, { - "category": "core", "key": "F", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to character (included)", "command": "dance.seek.included" }, { - "category": "kakoune", "key": "Alt+F", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to character (included, backward)", "command": "dance.seek.included.backward" }, { - "category": "kakoune", "key": "Shift+F", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to character (included)", "command": "dance.seek.included.extend" }, { - "category": "kakoune", "key": "Shift+Alt+F", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to character (included, backward)", "command": "dance.seek.included.extend.backward" }, { - "category": "core", "key": "W", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next word start", "command": "dance.seek.word" }, { - "category": "core", "key": "B", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to previous word start", "command": "dance.seek.word.backward" }, { - "category": "kakoune", "key": "Shift+W", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next word start", "command": "dance.seek.word.extend" }, { - "category": "kakoune", "key": "Shift+B", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to previous word start", "command": "dance.seek.word.extend.backward" }, { - "category": "kakoune", "key": "Alt+W", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next non-whitespace word start", "command": "dance.seek.word.ws" }, { - "category": "kakoune", "key": "Alt+B", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to previous non-whitespace word start", "command": "dance.seek.word.ws.backward" }, { - "category": "kakoune", "key": "Shift+Alt+W", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next non-whitespace word start", "command": "dance.seek.word.ws.extend" }, { - "category": "kakoune", "key": "Shift+Alt+B", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to previous non-whitespace word start", "command": "dance.seek.word.ws.extend.backward" }, { - "category": "core", "key": "E", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next word end", "command": "dance.seek.wordEnd" }, { - "category": "kakoune", "key": "Shift+E", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next word end", "command": "dance.seek.wordEnd.extend" }, { - "category": "kakoune", "key": "Alt+E", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to next non-whitespace word end", "command": "dance.seek.wordEnd.ws" }, { - "category": "kakoune", "key": "Shift+Alt+E", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to next non-whitespace word end", "command": "dance.seek.wordEnd.ws.extend" }, { - "category": "kakoune", "key": "Shift+5", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select whole buffer", "command": "dance.select.buffer" }, { - "category": "kakoune", "key": "Shift+J", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend down", "command": "dance.select.down.extend" }, { - "category": "kakoune", "key": "Shift+Down", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend down", "command": "dance.select.down.extend" }, { - "category": "core", "key": "J", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump down", "command": "dance.select.down.jump" }, { - "category": "core", "key": "Down", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump down", "command": "dance.select.down.jump" }, { - "category": "kakoune", "key": "Shift+H", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend left", "command": "dance.select.left.extend" }, { - "category": "kakoune", "key": "Shift+Left", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend left", "command": "dance.select.left.extend" }, { - "category": "core", "key": "H", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump left", "command": "dance.select.left.jump" }, { - "category": "core", "key": "Left", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump left", "command": "dance.select.left.jump" }, { - "category": "kakoune", "key": "Alt+L", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to line end", "command": "dance.select.lineEnd" }, { - "category": "core", "key": "End", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to line end", "command": "dance.select.lineEnd" }, { - "category": "kakoune", "key": "Shift+Alt+L", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to line end", "command": "dance.select.lineEnd.extend" }, { - "category": "kakoune", "key": "Shift+End", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to line end", "command": "dance.select.lineEnd.extend" }, { - "category": "kakoune", "key": "Alt+H", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to line start", "command": "dance.select.lineStart" }, { - "category": "core", "key": "Home", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Select to line start", "command": "dance.select.lineStart" }, { - "category": "kakoune", "key": "Shift+Alt+H", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to line start", "command": "dance.select.lineStart.extend" }, { - "category": "kakoune", "key": "Shift+Home", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to line start", "command": "dance.select.lineStart.extend" }, { - "category": "kakoune", "key": "Shift+L", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend right", "command": "dance.select.right.extend" }, { - "category": "kakoune", "key": "Shift+Right", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend right", "command": "dance.select.right.extend" }, { - "category": "core", "key": "L", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump right", "command": "dance.select.right.jump" }, { - "category": "core", "key": "Right", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump right", "command": "dance.select.right.jump" }, { - "category": "kakoune", "key": "Shift+G", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend to", "command": "dance.select.to.extend" }, { - "category": "core", "key": "G", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Go to", "command": "dance.select.to.jump" }, { - "category": "kakoune", "key": "Shift+K", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend up", "command": "dance.select.up.extend" }, { - "category": "kakoune", "key": "Shift+Up", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Extend up", "command": "dance.select.up.extend" }, { - "category": "core", "key": "K", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump up", "command": "dance.select.up.jump" }, { - "category": "core", "key": "Up", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Jump up", "command": "dance.select.up.jump" }, { - "category": "core", "key": "Ctrl+F", "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.select.vertically", @@ -3890,7 +3741,6 @@ } }, { - "category": "core", "key": "Ctrl+F", "when": "editorTextFocus && dance.mode == 'insert'", "command": "dance.select.vertically", @@ -3901,7 +3751,6 @@ } }, { - "category": "core", "key": "Ctrl+D", "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.select.vertically", @@ -3912,7 +3761,6 @@ } }, { - "category": "core", "key": "Ctrl+D", "when": "editorTextFocus && dance.mode == 'insert'", "command": "dance.select.vertically", @@ -3923,7 +3771,6 @@ } }, { - "category": "core", "key": "Ctrl+B", "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.select.vertically", @@ -3934,7 +3781,6 @@ } }, { - "category": "core", "key": "Ctrl+B", "when": "editorTextFocus && dance.mode == 'insert'", "command": "dance.select.vertically", @@ -3945,7 +3791,6 @@ } }, { - "category": "core", "key": "Ctrl+U", "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.select.vertically", @@ -3956,7 +3801,6 @@ } }, { - "category": "core", "key": "Ctrl+U", "when": "editorTextFocus && dance.mode == 'insert'", "command": "dance.select.vertically", @@ -3967,140 +3811,120 @@ } }, { - "category": "core", "key": "Alt+;", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Change direction of selections", "command": "dance.selections.changeDirection" }, { - "category": "core", "key": "Alt+,", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Clear main selections", "command": "dance.selections.clear.main" }, { - "category": "core", "key": ",", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Clear secondary selections", "command": "dance.selections.clear.secondary" }, { - "category": "kakoune", "key": "Shift+C", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy selections below", "command": "dance.selections.copy" }, { - "category": "kakoune", "key": "Shift+Alt+C", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy selections above", "command": "dance.selections.copy.above" }, { - "category": "kakoune", "key": "X", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Expand to lines", "command": "dance.selections.expandToLines" }, { - "category": "kakoune", "key": "Shift+Alt+;", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Forward selections", "command": "dance.selections.faceForward" }, { - "category": "core", "key": "Shift+4", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Filter selections", "command": "dance.selections.filter" }, { - "category": "core", "key": "Alt+K", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Keep matching selections", "command": "dance.selections.filter.regexp" }, { - "category": "core", "key": "Shift+Alt+K", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Clear matching selections", "command": "dance.selections.filter.regexp.inverse" }, { - "category": "kakoune", "key": "Shift+Alt+-", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Merge contiguous selections", "command": "dance.selections.merge" }, { - "category": "core", "key": "Shift+Alt+\\", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe selections", "command": "dance.selections.pipe" }, { - "category": "core", "key": "Shift+1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe and append", "command": "dance.selections.pipe.append" }, { - "category": "core", "key": "Shift+Alt+1", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe and prepend", "command": "dance.selections.pipe.prepend" }, { - "category": "core", "key": "Shift+\\", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Pipe and replace", "command": "dance.selections.pipe.replace" }, { - "category": "core", "key": ";", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Reduce selections to their cursor", "command": "dance.selections.reduce" }, { - "category": "kakoune", "key": "Shift+Alt+S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Reduce selections to their ends", "command": "dance.selections.reduce.edges" }, { - "category": "kakoune", "key": "Z", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Restore selections", "command": "dance.selections.restore" }, { - "category": "kakoune", "key": "Alt+Z", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Combine register selections with current ones", "command": "dance.selections.restore.withCurrent" }, { - "category": "kakoune", "key": "Shift+Alt+Z", "when": "editorTextFocus && dance.mode == 'normal'", "command": "dance.selections.restore.withCurrent", @@ -4110,84 +3934,72 @@ } }, { - "category": "kakoune", "key": "Shift+Z", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Save selections", "command": "dance.selections.save" }, { - "category": "core", "key": "Y", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Copy selections text", "command": "dance.selections.saveText" }, { - "category": "core", "key": "S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Leap or select", "command": "dance.selections.select.orLeap" }, { - "category": "core", "key": "Shift+S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Split selections", "command": "dance.selections.split" }, { - "category": "core", "key": "Alt+S", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Leap or select backward", "command": "dance.selections.splitLines.orLeap.backward" }, { - "category": "core", "key": "Alt+X", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Trim lines", "command": "dance.selections.trimLines" }, { - "category": "core", "key": "Shift+-", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Trim whitespace", "command": "dance.selections.trimWhitespace" }, { - "category": "kakoune", "key": "Shift+Alt+0", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Rotate selections clockwise", "command": "dance.selections.rotate.both" }, { - "category": "kakoune", "key": "Shift+Alt+9", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Rotate selections counter-clockwise", "command": "dance.selections.rotate.both.reverse" }, { - "category": "core", "key": "Shift+0", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Rotate selections clockwise (selections only)", "command": "dance.selections.rotate.selections" }, { - "category": "core", "key": "Shift+9", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Rotate selections counter-clockwise (selections only)", "command": "dance.selections.rotate.selections.reverse" }, { - "category": "kakoune", "key": "V", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Show view menu", @@ -4198,7 +4010,6 @@ } }, { - "category": "kakoune", "key": "Shift+V", "when": "editorTextFocus && dance.mode == 'normal'", "title": "Show view menu (locked)", diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index 841f601b..fbdce58f 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -2142,7 +2142,8 @@ selections.copy: keys: qwerty: |- - `s-c` (kakoune: normal) + `s-c` (core: normal) + `s-c` (helix: select) doc: en: | @@ -2151,9 +2152,9 @@ selections.copy: #### Variant - | Title | Identifier | Keybinding | Command | - | --------------------- | ------------ | ------------------------- | ----------------------------------------- | - | Copy selections above | `copy.above` | `s-a-c` (kakoune: normal) | `[".selections.copy", { direction: -1 }]` | + | Title | Identifier | Keybinding | Command | + | --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | + | Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | selections.copy.above: title: @@ -2165,6 +2166,7 @@ selections.copy.above: keys: qwerty: |- `s-a-c` (kakoune: normal) + `s-a-c` (helix: select) selections.expandToLines: title: diff --git a/src/commands/README.md b/src/commands/README.md index 04f7554d..9aaf83ef 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -185,7 +185,7 @@ selections are empty select.verticallySelect vertically selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.mode == 'select') selections.changeOrderReverse selections -selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal') +selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal')Shift+C (editorTextFocus && dance.mode == 'select') selections.expandToLinesExpand to linesX (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'select') selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.mode == 'select') selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.mode == 'normal') @@ -199,7 +199,7 @@ selections are empty selections.selectSelect within selections selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal')Shift+Alt+C (editorTextFocus && dance.mode == 'select') selections.faceBackwardBackward selections selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') @@ -1680,14 +1680,15 @@ Copy selections below. #### Variant -| Title | Identifier | Keybinding | Command | -| --------------------- | ------------ | ------------------------- | ----------------------------------------- | -| Copy selections above | `copy.above` | `s-a-c` (kakoune: normal) | `[".selections.copy", { direction: -1 }]` | +| Title | Identifier | Keybinding | Command | +| --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | +| Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `s-c` (kakoune: normal) +Default keybinding: `s-c` (core: normal) +`s-c` (helix: select) diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index d684bd8f..700dc652 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -170,7 +170,7 @@ selections are empty select.verticallySelect vertically selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.mode == 'select') selections.changeOrderReverse selections -selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal') +selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal')Shift+C (editorTextFocus && dance.mode == 'select') selections.expandToLinesExpand to linesX (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'select') selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.mode == 'select') selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.mode == 'normal') @@ -184,7 +184,7 @@ selections are empty selections.selectSelect within selections selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal')Shift+Alt+C (editorTextFocus && dance.mode == 'select') selections.faceBackwardBackward selections selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') @@ -1665,14 +1665,15 @@ Copy selections below. #### Variant -| Title | Identifier | Keybinding | Command | -| --------------------- | ------------ | ------------------------- | ----------------------------------------- | -| Copy selections above | `copy.above` | `s-a-c` (kakoune: normal) | `[".selections.copy", { direction: -1 }]` | +| Title | Identifier | Keybinding | Command | +| --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | +| Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `s-c` (kakoune: normal) +Default keybinding: `s-c` (core: normal) +`s-c` (helix: select) diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index 5d8bd26f..03a58812 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -170,7 +170,7 @@ selections are empty select.verticallySelect vertically selectionsselections.changeDirectionChange direction of selectionsAlt+; (editorTextFocus && dance.mode == 'normal')Alt+; (editorTextFocus && dance.mode == 'select') selections.changeOrderReverse selections -selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal') +selections.copyCopy selections belowShift+C (editorTextFocus && dance.mode == 'normal')Shift+C (editorTextFocus && dance.mode == 'select') selections.expandToLinesExpand to linesX (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'normal')Shift+X (editorTextFocus && dance.mode == 'select') selections.filterFilter selectionsShift+4 (editorTextFocus && dance.mode == 'normal')Shift+4 (editorTextFocus && dance.mode == 'select') selections.mergeMerge contiguous selectionsShift+Alt+- (editorTextFocus && dance.mode == 'normal') @@ -184,7 +184,7 @@ selections are empty selections.selectSelect within selections selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal')Shift+Alt+C (editorTextFocus && dance.mode == 'select') selections.faceBackwardBackward selections selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') @@ -1665,14 +1665,15 @@ Copy selections below. #### Variant -| Title | Identifier | Keybinding | Command | -| --------------------- | ------------ | ------------------------- | ----------------------------------------- | -| Copy selections above | `copy.above` | `s-a-c` (kakoune: normal) | `[".selections.copy", { direction: -1 }]` | +| Title | Identifier | Keybinding | Command | +| --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | +| Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `s-c` (kakoune: normal) +Default keybinding: `s-c` (core: normal) +`s-c` (helix: select) diff --git a/src/commands/selections.ts b/src/commands/selections.ts index 9f51b78f..6e2f8cb9 100644 --- a/src/commands/selections.ts +++ b/src/commands/selections.ts @@ -797,13 +797,13 @@ export async function sort( /** * Copy selections below. * - * @keys `s-c` (kakoune: normal) + * @keys `s-c` (core: normal), `s-c` (helix: select) * * #### Variant * - * | Title | Identifier | Keybinding | Command | - * | --------------------- | ------------ | ------------------------- | ----------------------------------------- | - * | Copy selections above | `copy.above` | `s-a-c` (kakoune: normal) | `[".selections.copy", { direction: -1 }]` | + * | Title | Identifier | Keybinding | Command | + * | --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | + * | Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | */ export function copy( _: Context, From 8babb7fa24e40ec17ba056b1016ab90e656150ea Mon Sep 17 00:00:00 2001 From: Strackeror Date: Mon, 15 Jul 2024 19:22:52 +0200 Subject: [PATCH 04/16] Fix missing editorTextFocus condition --- extensions/helix/package.build.ts | 2 +- extensions/helix/package.json | 138 +++++++++++++++--------------- package.build.ts | 2 +- package.json | 36 ++++---- 4 files changed, 89 insertions(+), 89 deletions(-) diff --git a/extensions/helix/package.build.ts b/extensions/helix/package.build.ts index c22e0c3b..c2930f75 100644 --- a/extensions/helix/package.build.ts +++ b/extensions/helix/package.build.ts @@ -189,7 +189,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ } for (const mode of ["normal", "select"]) { - const whenMode = `dance.mode == 'helix/${mode}'`; + const whenMode = `editorTextFocus && dance.mode == 'helix/${mode}'`; ignoredKeybindings.push(...generateIgnoredKeybinds( keybindings.filter(key => key.when.includes(whenMode)), whenMode, diff --git a/extensions/helix/package.json b/extensions/helix/package.json index 8d9cfe88..b8fb8fe1 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -1737,347 +1737,347 @@ { "key": "Q", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+D", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+G", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+H", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+K", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+L", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+M", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+Q", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+R", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+V", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+Y", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+2", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+3", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+5", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+6", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "'", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "-", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "=", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Tab", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Space", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "NumPad_Add", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "NumPad_Subtract", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+=", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+Tab", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+Space", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+NumPad_Add", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Shift+NumPad_Subtract", "command": "dance.ignore", - "when": "dance.mode == 'helix/normal'" + "when": "editorTextFocus && dance.mode == 'helix/normal'" }, { "key": "Q", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "R", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "0", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "1", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "2", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "3", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "4", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "5", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "6", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "7", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "8", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "9", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+D", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+G", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+H", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+K", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+L", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+M", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+Q", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+R", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+V", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+Y", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+0", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+2", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+3", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+5", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+6", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+7", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+8", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "'", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "-", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "=", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Tab", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Space", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "NumPad_Add", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "NumPad_Subtract", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+'", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+=", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+Tab", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+Space", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+NumPad_Add", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" }, { "key": "Shift+NumPad_Subtract", "command": "dance.ignore", - "when": "dance.mode == 'helix/select'" + "when": "editorTextFocus && dance.mode == 'helix/select'" } ] } diff --git a/package.build.ts b/package.build.ts index ba3ace41..8c7ede28 100644 --- a/package.build.ts +++ b/package.build.ts @@ -763,7 +763,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ return [ ...keybindings, - ...generateIgnoredKeybinds(keybindings,`dance.mode == 'normal'`), + ...generateIgnoredKeybinds(keybindings,`editorTextFocus && dance.mode == 'normal'`), ]; })(), diff --git a/package.json b/package.json index 4c3399d7..06b48140 100644 --- a/package.json +++ b/package.json @@ -4023,92 +4023,92 @@ { "key": "Shift+D", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+X", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+Y", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+2", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+3", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+6", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "'", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "-", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "=", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Tab", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Space", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "NumPad_Add", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "NumPad_Subtract", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+=", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+Tab", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+Space", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+NumPad_Add", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" }, { "key": "Shift+NumPad_Subtract", "command": "dance.ignore", - "when": "dance.mode == 'normal'" + "when": "editorTextFocus && dance.mode == 'normal'" } ] } From 1b71b257ef8ef37c81694aaaec0d5658553f483f Mon Sep 17 00:00:00 2001 From: Strackeror Date: Mon, 15 Jul 2024 19:27:36 +0200 Subject: [PATCH 05/16] Add `%` binding to helix --- extensions/helix/package.json | 22 ++++++++++++---------- src/api/data/commands.yaml | 3 ++- src/commands/README.md | 5 +++-- src/commands/layouts/azerty.fr.md | 5 +++-- src/commands/layouts/qwerty.md | 5 +++-- src/commands/select.ts | 2 +- 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/extensions/helix/package.json b/extensions/helix/package.json index b8fb8fe1..e8841247 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -1152,6 +1152,18 @@ "title": "Extend to next non-whitespace word end", "command": "dance.seek.wordEnd.ws.extend" }, + { + "key": "Shift+5", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Select whole buffer", + "command": "dance.select.buffer" + }, + { + "key": "Shift+5", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Select whole buffer", + "command": "dance.select.buffer" + }, { "key": "J", "when": "editorTextFocus && dance.mode == 'helix/select'", @@ -1799,11 +1811,6 @@ "command": "dance.ignore", "when": "editorTextFocus && dance.mode == 'helix/normal'" }, - { - "key": "Shift+5", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/normal'" - }, { "key": "Shift+6", "command": "dance.ignore", @@ -1994,11 +2001,6 @@ "command": "dance.ignore", "when": "editorTextFocus && dance.mode == 'helix/select'" }, - { - "key": "Shift+5", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, { "key": "Shift+6", "command": "dance.ignore", diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index fbdce58f..da3cbc88 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -1582,7 +1582,8 @@ select.buffer: keys: qwerty: |- - `%` (kakoune: normal) + `%` (core: normal) + `%` (helix: select) doc: en: |+ diff --git a/src/commands/README.md b/src/commands/README.md index 9aaf83ef..8e44ea11 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -142,7 +142,7 @@ selections are empty seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'select') seek.syntax.experimentalSelect syntax object seek.wordSelect to next word startW (editorTextFocus && dance.mode == 'normal') -selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal') +selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal')Shift+5 (editorTextFocus && dance.mode == 'select') select.firstVisibleLineSelect to first visible line select.horizontallySelect horizontally select.lastLineSelect to last line @@ -1187,7 +1187,8 @@ Select whole buffer. -Default keybinding: `%` (kakoune: normal) +Default keybinding: `%` (core: normal) +`%` (helix: select) diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index 700dc652..ef625ea5 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -127,7 +127,7 @@ selections are empty seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'select') seek.syntax.experimentalSelect syntax object seek.wordSelect to next word startW (editorTextFocus && dance.mode == 'normal') -selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal') +selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal')Shift+5 (editorTextFocus && dance.mode == 'select') select.firstVisibleLineSelect to first visible line select.horizontallySelect horizontally select.lastLineSelect to last line @@ -1172,7 +1172,8 @@ Select whole buffer. -Default keybinding: `%` (kakoune: normal) +Default keybinding: `%` (core: normal) +`%` (helix: select) diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index 03a58812..73c43bc8 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -127,7 +127,7 @@ selections are empty seek.wordEnd.ws.extendExtend to next non-whitespace word endShift+Alt+E (editorTextFocus && dance.mode == 'normal')Shift+E (editorTextFocus && dance.mode == 'select') seek.syntax.experimentalSelect syntax object seek.wordSelect to next word startW (editorTextFocus && dance.mode == 'normal') -selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal') +selectselect.bufferSelect whole bufferShift+5 (editorTextFocus && dance.mode == 'normal')Shift+5 (editorTextFocus && dance.mode == 'select') select.firstVisibleLineSelect to first visible line select.horizontallySelect horizontally select.lastLineSelect to last line @@ -1172,7 +1172,8 @@ Select whole buffer. -Default keybinding: `%` (kakoune: normal) +Default keybinding: `%` (core: normal) +`%` (helix: select) diff --git a/src/commands/select.ts b/src/commands/select.ts index 8888c65a..41d7ed17 100644 --- a/src/commands/select.ts +++ b/src/commands/select.ts @@ -13,7 +13,7 @@ declare module "./select"; /** * Select whole buffer. * - * @keys `%` (kakoune: normal) + * @keys `%` (core: normal), `%` (helix: select) */ export function buffer(_: Context) { Selections.set([Selections.wholeBuffer()]); From 91bc9d6b807892d95d260533305adadbb2ed716e Mon Sep 17 00:00:00 2001 From: Strackeror Date: Wed, 17 Jul 2024 13:37:25 +0200 Subject: [PATCH 06/16] Fix binding: `Shift+R` --- extensions/helix/package.json | 22 ++++++++++++---------- src/api/data/commands.yaml | 4 +++- src/commands/README.md | 6 ++++-- src/commands/edit.ts | 4 ++-- src/commands/layouts/azerty.fr.md | 6 ++++-- src/commands/layouts/qwerty.md | 6 ++++-- 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/extensions/helix/package.json b/extensions/helix/package.json index e8841247..d65e9378 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -487,6 +487,18 @@ "title": "Indent selected lines", "command": "dance.edit.indent" }, + { + "key": "Shift+R", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Insert contents of register", + "command": "dance.edit.insert" + }, + { + "key": "Shift+R", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Insert contents of register", + "command": "dance.edit.insert" + }, { "key": "Shift+J", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -1786,11 +1798,6 @@ "command": "dance.ignore", "when": "editorTextFocus && dance.mode == 'helix/normal'" }, - { - "key": "Shift+R", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/normal'" - }, { "key": "Shift+V", "command": "dance.ignore", @@ -1971,11 +1978,6 @@ "command": "dance.ignore", "when": "editorTextFocus && dance.mode == 'helix/select'" }, - { - "key": "Shift+R", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, { "key": "Shift+V", "command": "dance.ignore", diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index da3cbc88..b53500eb 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -193,6 +193,8 @@ edit.insert: keys: qwerty: |- `s-a-r` (kakoune: normal) + `s-r` (helix: normal) + `s-r` (helix: select) doc: en: | @@ -214,7 +216,7 @@ edit.insert: | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | - | Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | + | Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | | Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | diff --git a/src/commands/README.md b/src/commands/README.md index 8e44ea11..a4c4f366 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -51,7 +51,7 @@ depending on the keyboard layout. The following layouts _will be_\* supported: edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.mode == 'select') edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'select') edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'select') edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.mode == 'select') edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') @@ -283,7 +283,7 @@ Specify `all` to paste all contents next to each selection. | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | -| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | +| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | | Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | @@ -308,6 +308,8 @@ This command: - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`. Default keybinding: `s-a-r` (kakoune: normal) +`s-r` (helix: normal) +`s-r` (helix: select) diff --git a/src/commands/edit.ts b/src/commands/edit.ts index db2d4d72..46474bf2 100644 --- a/src/commands/edit.ts +++ b/src/commands/edit.ts @@ -25,14 +25,14 @@ declare module "./edit"; * * Specify `all` to paste all contents next to each selection. * - * @keys `s-a-r` (kakoune: normal) + * @keys `s-a-r` (kakoune: normal), `s-r` (helix: normal), `s-r` (helix: select) * * #### Additional commands * * | Title | Identifier | Keybinding | Commands | * | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | * | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | - * | Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | + * | Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | * | Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | * | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | * | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index ef625ea5..fe995d8d 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -36,7 +36,7 @@ edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.mode == 'select') edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'select') edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'select') edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.mode == 'select') edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') @@ -268,7 +268,7 @@ Specify `all` to paste all contents next to each selection. | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | -| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | +| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | | Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | @@ -293,6 +293,8 @@ This command: - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`. Default keybinding: `s-a-r` (kakoune: normal) +`s-r` (helix: normal) +`s-r` (helix: select) diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index 73c43bc8..223f97eb 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -36,7 +36,7 @@ edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.mode == 'select') edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'select') edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'select') edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.mode == 'select') edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') @@ -268,7 +268,7 @@ Specify `all` to paste all contents next to each selection. | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | -| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | +| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | | Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | @@ -293,6 +293,8 @@ This command: - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`. Default keybinding: `s-a-r` (kakoune: normal) +`s-r` (helix: normal) +`s-r` (helix: select) From 10e50a9273ca7ef6a090e8f190a54df8f222a66b Mon Sep 17 00:00:00 2001 From: Strackeror Date: Thu, 18 Jul 2024 18:53:31 +0200 Subject: [PATCH 07/16] PR Fixes --- .vscode/launch.json | 3 +- extensions/helix/package.build.ts | 17 ++++++--- extensions/helix/package.json | 10 ++++- meta.ts | 7 +++- package.build.ts | 10 +++-- package.json | 11 ++++-- src/api/data/commands.yaml | 10 ++--- src/api/modes.ts | 9 +---- src/commands/README.md | 61 ++++++++++++++++--------------- src/commands/layouts/azerty.fr.md | 61 ++++++++++++++++--------------- src/commands/layouts/qwerty.md | 61 ++++++++++++++++--------------- src/commands/seek.ts | 8 ++-- src/commands/select.ts | 1 + 13 files changed, 146 insertions(+), 123 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 850be651..49dead84 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,12 +10,11 @@ "outFiles": ["${workspaceFolder}/out/**/*.js"], }, { - "name": "Launch extension with helix keybinds", + "name": "Launch extension with Helix keybindings", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", "args": [ - "${workspaceFolder}/.vscode-test", "--extensionDevelopmentPath=${workspaceFolder}", "--extensionDevelopmentPath=${workspaceFolder}/extensions/helix/", ], diff --git a/extensions/helix/package.build.ts b/extensions/helix/package.build.ts index c2930f75..717d8f21 100644 --- a/extensions/helix/package.build.ts +++ b/extensions/helix/package.build.ts @@ -3,7 +3,7 @@ import { Builder, generateIgnoredKeybinds } from "../../meta"; import * as fs from "fs/promises"; -import { SelectionBehavior } from "../../src/api"; +import { extensionId } from "../../src/utils/constants"; const version = "0.1.0", preRelease = 1, @@ -14,16 +14,23 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ // Common package.json properties. // ========================================================================== - name: "dance-helix-keybinds", - description: "Helix keybindings for dance", + name: "dance-helix-keybindingss", + description: "Helix keybindings for Dance", version, license: "ISC", - + extensionDependencies: [extensionId], author: { name: "Grégoire Geis", email: "opensource@gregoirege.is", }, + contributors: [ + { + name: "Rémi Lavergne", + url: "https://github.com/Strackeror", + }, + ], + repository: { type: "git", url: "https://github.com/71/dance.git", @@ -33,7 +40,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ vscode: "^1.63.0", }, - displayName: "Dance", + displayName: "Dance (Helix keybindings)", publisher: "gregoire", categories: ["Keymaps", "Other"], readme: "README.md", diff --git a/extensions/helix/package.json b/extensions/helix/package.json index d65e9378..6e5187ae 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -1,12 +1,18 @@ { - "name": "dance-helix-keybinds", - "description": "Helix keybindings for dance", + "name": "dance-helix-keybindingss", + "description": "Helix keybindings for Dance", "version": "0.1.0", "license": "ISC", "author": { "name": "Grégoire Geis", "email": "opensource@gregoirege.is" }, + "contributors": [ + { + "name": "Rémi Lavergne", + "url": "https://github.com/Strackeror" + } + ], "repository": { "type": "git", "url": "https://github.com/71/dance.git" diff --git a/meta.ts b/meta.ts index f6378d4d..b23a9b2c 100644 --- a/meta.ts +++ b/meta.ts @@ -653,8 +653,13 @@ function getKeybindings(module: Omit): Buil ].sort((a, b) => a.command.localeCompare(b.command)); } +/** + * Takes a list of keybindings and generates `dance.ignore` keybindings for + * common keys that are unused. This is used for modes where we don't want the + * user to be able to type + */ export function generateIgnoredKeybinds( - currentKeybindings: Builder.Keybinding[], + currentKeybindings: readonly Builder.Keybinding[], when: string, ): Builder.Keybinding[] { const alphanum = [..."ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"], diff --git a/package.build.ts b/package.build.ts index 8c7ede28..48064e30 100644 --- a/package.build.ts +++ b/package.build.ts @@ -22,7 +22,7 @@ const builtinModesAreDeprecatedMessage = "Built-in modes are deprecated. Use `#dance.modes#` instead."; const modeNamePattern = { - pattern: /^[a-zA-Z]\w*\/?\w*$/.source, + pattern: /^[a-zA-Z]\w*(\/\w+)?$/.source, patternErrorMessage: "", }; @@ -129,7 +129,11 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ "publish": "vsce publish --allow-star-activation", "package:pre": `vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json ${version.replace(/\d+$/, "$&" + preRelease.toString().padStart(3, "0"))}`, "publish:pre": `vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json ${version.replace(/\d+$/, "$&" + preRelease.toString().padStart(3, "0"))}`, - "package-helix": `cd extensions/helix && npm run package`, + + "package-helix": `cd extensions/helix && yarn run package`, + "publish-helix": `cd extensions/helix && yarn run publish`, + "package-helix:pre": `cd extensions/helix && yarn run package:pre`, + "publish-helix:pre": `cd extensions/helix && yarn run publish:pre`, }, devDependencies: { @@ -763,7 +767,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ return [ ...keybindings, - ...generateIgnoredKeybinds(keybindings,`editorTextFocus && dance.mode == 'normal'`), + ...generateIgnoredKeybinds(keybindings, `editorTextFocus && dance.mode == 'normal'`), ]; })(), diff --git a/package.json b/package.json index 06b48140..ac5cc124 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,10 @@ "publish": "vsce publish --allow-star-activation", "package:pre": "vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.5.15001", "publish:pre": "vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.5.15001", - "package-helix": "cd extensions/helix && npm run package" + "package-helix": "cd extensions/helix && yarn run package", + "publish-helix": "cd extensions/helix && yarn run publish", + "package-helix:pre": "cd extensions/helix && yarn run package:pre", + "publish-helix:pre": "cd extensions/helix && yarn run publish:pre" }, "devDependencies": { "@types/glob": "^7.2.0", @@ -94,7 +97,7 @@ "scope": "language-overridable", "default": "normal", "description": "Controls which mode is set by default when an editor is opened.", - "pattern": "^[a-zA-Z]\\w*\\/?\\w*$", + "pattern": "^[a-zA-Z]\\w*(\\/\\w+)?$", "patternErrorMessage": "" }, "dance.modes": { @@ -103,7 +106,7 @@ "additionalProperties": { "type": "object", "propertyNames": { - "pattern": "^[a-zA-Z]\\w*\\/?\\w*$", + "pattern": "^[a-zA-Z]\\w*(\\/\\w+)?$", "patternErrorMessage": "" }, "properties": { @@ -113,7 +116,7 @@ "null" ], "description": "Controls how default configuration options are obtained for this mode. Specify a string to inherit from the mode with the given name, and null to inherit from the VS Code configuration.", - "pattern": "^[a-zA-Z]\\w*\\/?\\w*$", + "pattern": "^[a-zA-Z]\\w*(\\/\\w+)?$", "patternErrorMessage": "" }, "cursorStyle": { diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index b53500eb..ac0567ca 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -1814,15 +1814,15 @@ select.line.below.extend: title: en: Extend to line below - doc: - en: | - Extend to line below. - keys: qwerty: |- `x` (helix: normal) `x` (helix: select) + doc: + en: |+ + Extend to line below. + select.lineEnd: title: en: Select to line end @@ -2759,7 +2759,7 @@ anonymous: en: Open match menu with extend commands: |- - [".openMenu", { menu: "match", pass: [{shift: "extend"}] }] + [".openMenu", { menu: "match", pass: [{ shift: "extend" }] }] keys: qwerty: |- diff --git a/src/api/modes.ts b/src/api/modes.ts index f258d74f..408299ea 100644 --- a/src/api/modes.ts +++ b/src/api/modes.ts @@ -70,15 +70,10 @@ function findMode(modeName: string, context?: Context) { split = currentMode.name.split("/"); if (split.length === 2) { const namespacedMode = context.extension.modes.get(`${split[0]}/${modeName}`); - if (namespacedMode) { + if (namespacedMode !== undefined) { return namespacedMode; } } - const directMode = context.extension.modes.get(modeName); - if (directMode) { - return directMode; - } - - return undefined; + return context.extension.modes.get(modeName); } diff --git a/src/commands/README.md b/src/commands/README.md index a4c4f366..1db7dff0 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -154,27 +154,27 @@ selections are empty select.lineEndSelect to line endAlt+L (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') select.lineStartSelect to line startAlt+H (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') select.middleVisibleLineSelect to middle visible line -select.documentEnd.extendExtend to last character -select.documentEnd.jumpJump to last character +select.documentEnd.extendExtend to last character +select.documentEnd.jumpJump to last character select.down.extendExtend downShift+J (editorTextFocus && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.mode == 'normal')J (editorTextFocus && dance.mode == 'select')Down (editorTextFocus && dance.mode == 'select') select.down.jumpJump downJ (editorTextFocus && dance.mode == 'normal')Down (editorTextFocus && dance.mode == 'normal') -select.firstLine.extendExtend to first line -select.firstLine.jumpJump to first line -select.firstVisibleLine.extendExtend to first visible line -select.firstVisibleLine.jumpJump to first visible line -select.lastLine.extendExtend to last line -select.lastLine.jumpJump to last line -select.lastVisibleLine.extendExtend to last visible line -select.lastVisibleLine.jumpJump to last visible line +select.firstLine.extendExtend to first line +select.firstLine.jumpJump to first line +select.firstVisibleLine.extendExtend to first visible line +select.firstVisibleLine.jumpJump to first visible line +select.lastLine.extendExtend to last line +select.lastLine.jumpJump to last line +select.lastVisibleLine.extendExtend to last visible line +select.lastVisibleLine.jumpJump to last visible line select.left.extendExtend leftShift+H (editorTextFocus && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.mode == 'normal')H (editorTextFocus && dance.mode == 'select')Left (editorTextFocus && dance.mode == 'select') select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') -select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'select') -select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'select') -select.lineStart.jumpJump to line start -select.lineStart.skipBlank.extendExtend to line start (skip blank) -select.lineStart.skipBlank.jumpJump to line start (skip blank) -select.middleVisibleLine.extendExtend to middle visible line -select.middleVisibleLine.jumpJump to middle visible line +select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'select') +select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'select') +select.lineStart.jumpJump to line start +select.lineStart.skipBlank.extendExtend to line start (skip blank) +select.lineStart.skipBlank.jumpJump to line start (skip blank) +select.middleVisibleLine.extendExtend to middle visible line +select.middleVisibleLine.jumpJump to middle visible line select.right.extendExtend rightShift+L (editorTextFocus && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.mode == 'normal')L (editorTextFocus && dance.mode == 'select')Right (editorTextFocus && dance.mode == 'select') select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') select.to.extendExtend toShift+G (editorTextFocus && dance.mode == 'normal')G (editorTextFocus && dance.mode == 'select') @@ -1018,10 +1018,10 @@ Update selections based on the text surrounding them. #### Predefined keybindings -| Title | Keybinding | Command | -| --------------------------- | ------------------- | ------------------------------------------------------------- | -| Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | -| Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{shift: "extend"}] }]` | +| Title | Keybinding | Command | +| --------------------------- | ------------------- | --------------------------------------------------------------- | +| Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | +| Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{ shift: "extend" }] }]` | @@ -1277,10 +1277,11 @@ This command: -### [`select.line.below.extend`](./select.ts#L346-L350) +### [`select.line.below.extend`](./select.ts#L346-L351) Extend to line below. + This command: - may be repeated with a given number of repetitions. @@ -1289,7 +1290,7 @@ Default keybinding: `x` (helix: normal) -### [`select.line.above`](./select.ts#L377-L380) +### [`select.line.above`](./select.ts#L378-L381) Select line above. @@ -1298,7 +1299,7 @@ This command: -### [`select.line.above.extend`](./select.ts#L404-L407) +### [`select.line.above.extend`](./select.ts#L405-L408) Extend to line above. @@ -1307,7 +1308,7 @@ This command: -### [`select.lineStart`](./select.ts#L453-L475) +### [`select.lineStart`](./select.ts#L454-L476) Select to line start. @@ -1332,7 +1333,7 @@ Default keybinding: `a-h` (kakoune: normal) -### [`select.lineEnd`](./select.ts#L500-L522) +### [`select.lineEnd`](./select.ts#L501-L523) Select to line end. @@ -1355,7 +1356,7 @@ Default keybinding: `a-l` (kakoune: normal) -### [`select.lastLine`](./select.ts#L550-L560) +### [`select.lastLine`](./select.ts#L551-L561) Select to last line. @@ -1368,7 +1369,7 @@ Select to last line. -### [`select.firstVisibleLine`](./select.ts#L571-L581) +### [`select.firstVisibleLine`](./select.ts#L572-L582) Select to first visible line. @@ -1381,7 +1382,7 @@ Select to first visible line. -### [`select.middleVisibleLine`](./select.ts#L588-L598) +### [`select.middleVisibleLine`](./select.ts#L589-L599) Select to middle visible line. @@ -1394,7 +1395,7 @@ Select to middle visible line. -### [`select.lastVisibleLine`](./select.ts#L605-L615) +### [`select.lastVisibleLine`](./select.ts#L606-L616) Select to last visible line. diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index fe995d8d..b79975e5 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -139,27 +139,27 @@ selections are empty select.lineEndSelect to line endAlt+L (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') select.lineStartSelect to line startAlt+H (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') select.middleVisibleLineSelect to middle visible line -select.documentEnd.extendExtend to last character -select.documentEnd.jumpJump to last character +select.documentEnd.extendExtend to last character +select.documentEnd.jumpJump to last character select.down.extendExtend downShift+J (editorTextFocus && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.mode == 'normal')J (editorTextFocus && dance.mode == 'select')Down (editorTextFocus && dance.mode == 'select') select.down.jumpJump downJ (editorTextFocus && dance.mode == 'normal')Down (editorTextFocus && dance.mode == 'normal') -select.firstLine.extendExtend to first line -select.firstLine.jumpJump to first line -select.firstVisibleLine.extendExtend to first visible line -select.firstVisibleLine.jumpJump to first visible line -select.lastLine.extendExtend to last line -select.lastLine.jumpJump to last line -select.lastVisibleLine.extendExtend to last visible line -select.lastVisibleLine.jumpJump to last visible line +select.firstLine.extendExtend to first line +select.firstLine.jumpJump to first line +select.firstVisibleLine.extendExtend to first visible line +select.firstVisibleLine.jumpJump to first visible line +select.lastLine.extendExtend to last line +select.lastLine.jumpJump to last line +select.lastVisibleLine.extendExtend to last visible line +select.lastVisibleLine.jumpJump to last visible line select.left.extendExtend leftShift+H (editorTextFocus && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.mode == 'normal')H (editorTextFocus && dance.mode == 'select')Left (editorTextFocus && dance.mode == 'select') select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') -select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'select') -select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'select') -select.lineStart.jumpJump to line start -select.lineStart.skipBlank.extendExtend to line start (skip blank) -select.lineStart.skipBlank.jumpJump to line start (skip blank) -select.middleVisibleLine.extendExtend to middle visible line -select.middleVisibleLine.jumpJump to middle visible line +select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'select') +select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'select') +select.lineStart.jumpJump to line start +select.lineStart.skipBlank.extendExtend to line start (skip blank) +select.lineStart.skipBlank.jumpJump to line start (skip blank) +select.middleVisibleLine.extendExtend to middle visible line +select.middleVisibleLine.jumpJump to middle visible line select.right.extendExtend rightShift+L (editorTextFocus && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.mode == 'normal')L (editorTextFocus && dance.mode == 'select')Right (editorTextFocus && dance.mode == 'select') select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') select.to.extendExtend toShift+G (editorTextFocus && dance.mode == 'normal')G (editorTextFocus && dance.mode == 'select') @@ -1003,10 +1003,10 @@ Update selections based on the text surrounding them. #### Predefined keybindings -| Title | Keybinding | Command | -| --------------------------- | ------------------- | ------------------------------------------------------------- | -| Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | -| Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{shift: "extend"}] }]` | +| Title | Keybinding | Command | +| --------------------------- | ------------------- | --------------------------------------------------------------- | +| Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | +| Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{ shift: "extend" }] }]` | @@ -1262,10 +1262,11 @@ This command: -### [`select.line.below.extend`](../select.ts#L346-L350) +### [`select.line.below.extend`](../select.ts#L346-L351) Extend to line below. + This command: - may be repeated with a given number of repetitions. @@ -1274,7 +1275,7 @@ Default keybinding: `x` (helix: normal) -### [`select.line.above`](../select.ts#L377-L380) +### [`select.line.above`](../select.ts#L378-L381) Select line above. @@ -1283,7 +1284,7 @@ This command: -### [`select.line.above.extend`](../select.ts#L404-L407) +### [`select.line.above.extend`](../select.ts#L405-L408) Extend to line above. @@ -1292,7 +1293,7 @@ This command: -### [`select.lineStart`](../select.ts#L453-L475) +### [`select.lineStart`](../select.ts#L454-L476) Select to line start. @@ -1317,7 +1318,7 @@ Default keybinding: `a-h` (kakoune: normal) -### [`select.lineEnd`](../select.ts#L500-L522) +### [`select.lineEnd`](../select.ts#L501-L523) Select to line end. @@ -1340,7 +1341,7 @@ Default keybinding: `a-l` (kakoune: normal) -### [`select.lastLine`](../select.ts#L550-L560) +### [`select.lastLine`](../select.ts#L551-L561) Select to last line. @@ -1353,7 +1354,7 @@ Select to last line. -### [`select.firstVisibleLine`](../select.ts#L571-L581) +### [`select.firstVisibleLine`](../select.ts#L572-L582) Select to first visible line. @@ -1366,7 +1367,7 @@ Select to first visible line. -### [`select.middleVisibleLine`](../select.ts#L588-L598) +### [`select.middleVisibleLine`](../select.ts#L589-L599) Select to middle visible line. @@ -1379,7 +1380,7 @@ Select to middle visible line. -### [`select.lastVisibleLine`](../select.ts#L605-L615) +### [`select.lastVisibleLine`](../select.ts#L606-L616) Select to last visible line. diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index 223f97eb..647af465 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -139,27 +139,27 @@ selections are empty select.lineEndSelect to line endAlt+L (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'normal') select.lineStartSelect to line startAlt+H (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'normal') select.middleVisibleLineSelect to middle visible line -select.documentEnd.extendExtend to last character -select.documentEnd.jumpJump to last character +select.documentEnd.extendExtend to last character +select.documentEnd.jumpJump to last character select.down.extendExtend downShift+J (editorTextFocus && dance.mode == 'normal')Shift+Down (editorTextFocus && dance.mode == 'normal')J (editorTextFocus && dance.mode == 'select')Down (editorTextFocus && dance.mode == 'select') select.down.jumpJump downJ (editorTextFocus && dance.mode == 'normal')Down (editorTextFocus && dance.mode == 'normal') -select.firstLine.extendExtend to first line -select.firstLine.jumpJump to first line -select.firstVisibleLine.extendExtend to first visible line -select.firstVisibleLine.jumpJump to first visible line -select.lastLine.extendExtend to last line -select.lastLine.jumpJump to last line -select.lastVisibleLine.extendExtend to last visible line -select.lastVisibleLine.jumpJump to last visible line +select.firstLine.extendExtend to first line +select.firstLine.jumpJump to first line +select.firstVisibleLine.extendExtend to first visible line +select.firstVisibleLine.jumpJump to first visible line +select.lastLine.extendExtend to last line +select.lastLine.jumpJump to last line +select.lastVisibleLine.extendExtend to last visible line +select.lastVisibleLine.jumpJump to last visible line select.left.extendExtend leftShift+H (editorTextFocus && dance.mode == 'normal')Shift+Left (editorTextFocus && dance.mode == 'normal')H (editorTextFocus && dance.mode == 'select')Left (editorTextFocus && dance.mode == 'select') select.left.jumpJump leftH (editorTextFocus && dance.mode == 'normal')Left (editorTextFocus && dance.mode == 'normal') -select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'select') -select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'select') -select.lineStart.jumpJump to line start -select.lineStart.skipBlank.extendExtend to line start (skip blank) -select.lineStart.skipBlank.jumpJump to line start (skip blank) -select.middleVisibleLine.extendExtend to middle visible line -select.middleVisibleLine.jumpJump to middle visible line +select.lineEnd.extendExtend to line endShift+Alt+L (editorTextFocus && dance.mode == 'normal')Shift+End (editorTextFocus && dance.mode == 'normal')End (editorTextFocus && dance.mode == 'select') +select.lineStart.extendExtend to line startShift+Alt+H (editorTextFocus && dance.mode == 'normal')Shift+Home (editorTextFocus && dance.mode == 'normal')Home (editorTextFocus && dance.mode == 'select') +select.lineStart.jumpJump to line start +select.lineStart.skipBlank.extendExtend to line start (skip blank) +select.lineStart.skipBlank.jumpJump to line start (skip blank) +select.middleVisibleLine.extendExtend to middle visible line +select.middleVisibleLine.jumpJump to middle visible line select.right.extendExtend rightShift+L (editorTextFocus && dance.mode == 'normal')Shift+Right (editorTextFocus && dance.mode == 'normal')L (editorTextFocus && dance.mode == 'select')Right (editorTextFocus && dance.mode == 'select') select.right.jumpJump rightL (editorTextFocus && dance.mode == 'normal')Right (editorTextFocus && dance.mode == 'normal') select.to.extendExtend toShift+G (editorTextFocus && dance.mode == 'normal')G (editorTextFocus && dance.mode == 'select') @@ -1003,10 +1003,10 @@ Update selections based on the text surrounding them. #### Predefined keybindings -| Title | Keybinding | Command | -| --------------------------- | ------------------- | ------------------------------------------------------------- | -| Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | -| Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{shift: "extend"}] }]` | +| Title | Keybinding | Command | +| --------------------------- | ------------------- | --------------------------------------------------------------- | +| Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | +| Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{ shift: "extend" }] }]` | @@ -1262,10 +1262,11 @@ This command: -### [`select.line.below.extend`](../select.ts#L346-L350) +### [`select.line.below.extend`](../select.ts#L346-L351) Extend to line below. + This command: - may be repeated with a given number of repetitions. @@ -1274,7 +1275,7 @@ Default keybinding: `x` (helix: normal) -### [`select.line.above`](../select.ts#L377-L380) +### [`select.line.above`](../select.ts#L378-L381) Select line above. @@ -1283,7 +1284,7 @@ This command: -### [`select.line.above.extend`](../select.ts#L404-L407) +### [`select.line.above.extend`](../select.ts#L405-L408) Extend to line above. @@ -1292,7 +1293,7 @@ This command: -### [`select.lineStart`](../select.ts#L453-L475) +### [`select.lineStart`](../select.ts#L454-L476) Select to line start. @@ -1317,7 +1318,7 @@ Default keybinding: `a-h` (kakoune: normal) -### [`select.lineEnd`](../select.ts#L500-L522) +### [`select.lineEnd`](../select.ts#L501-L523) Select to line end. @@ -1340,7 +1341,7 @@ Default keybinding: `a-l` (kakoune: normal) -### [`select.lastLine`](../select.ts#L550-L560) +### [`select.lastLine`](../select.ts#L551-L561) Select to last line. @@ -1353,7 +1354,7 @@ Select to last line. -### [`select.firstVisibleLine`](../select.ts#L571-L581) +### [`select.firstVisibleLine`](../select.ts#L572-L582) Select to first visible line. @@ -1366,7 +1367,7 @@ Select to first visible line. -### [`select.middleVisibleLine`](../select.ts#L588-L598) +### [`select.middleVisibleLine`](../select.ts#L589-L599) Select to middle visible line. @@ -1379,7 +1380,7 @@ Select to middle visible line. -### [`select.lastVisibleLine`](../select.ts#L605-L615) +### [`select.lastVisibleLine`](../select.ts#L606-L616) Select to last visible line. diff --git a/src/commands/seek.ts b/src/commands/seek.ts index da5bb9e7..4ab729cb 100644 --- a/src/commands/seek.ts +++ b/src/commands/seek.ts @@ -13,10 +13,10 @@ import { SyntaxNode, Tree, TreeSitter } from "../utils/tree-sitter"; * * #### Predefined keybindings * - * | Title | Keybinding | Command | - * | --------------------------- | ------------------- | ------------------------------------------------------------- | - * | Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | - * | Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{shift: "extend"}] }]` | + * | Title | Keybinding | Command | + * | --------------------------- | ------------------- | --------------------------------------------------------------- | + * | Open match menu | `m` (helix: normal) | `[".openMenu", { menu: "match" }]` | + * | Open match menu with extend | `m` (helix: select) | `[".openMenu", { menu: "match", pass: [{ shift: "extend" }] }]` | */ declare module "./seek"; diff --git a/src/commands/select.ts b/src/commands/select.ts index 41d7ed17..620a259f 100644 --- a/src/commands/select.ts +++ b/src/commands/select.ts @@ -345,6 +345,7 @@ export function line_below(_: Context, count: number) { /** * Extend to line below. + * * @keys `x` (helix: normal), `x` (helix: select) */ export function line_below_extend(_: Context, count: number) { From a1f82a73aa24e91a59c12156e8f5ad7fffd9ba63 Mon Sep 17 00:00:00 2001 From: Strackeror Date: Wed, 31 Jul 2024 13:37:45 +0200 Subject: [PATCH 08/16] Fix typos and title, add toggle indices --- extensions/helix/package.build.ts | 3 ++- extensions/helix/package.json | 23 +++++++++++++++++++++-- package.json | 6 ++++++ src/api/data/commands.yaml | 3 ++- src/commands/README.md | 5 +++-- src/commands/layouts/azerty.fr.md | 5 +++-- src/commands/layouts/qwerty.md | 5 +++-- src/commands/selections.ts | 2 +- 8 files changed, 41 insertions(+), 11 deletions(-) diff --git a/extensions/helix/package.build.ts b/extensions/helix/package.build.ts index 717d8f21..da79d9e3 100644 --- a/extensions/helix/package.build.ts +++ b/extensions/helix/package.build.ts @@ -14,7 +14,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ // Common package.json properties. // ========================================================================== - name: "dance-helix-keybindingss", + name: "dance-helix-keybindings", description: "Helix keybindings for Dance", version, license: "ISC", @@ -45,6 +45,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ categories: ["Keymaps", "Other"], readme: "README.md", icon: "dance.png", + extensionKind: ["ui", "workspace"], scripts: { "package": "vsce package --allow-star-activation", diff --git a/extensions/helix/package.json b/extensions/helix/package.json index 6e5187ae..389a578b 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -1,8 +1,11 @@ { - "name": "dance-helix-keybindingss", + "name": "dance-helix-keybindings", "description": "Helix keybindings for Dance", "version": "0.1.0", "license": "ISC", + "extensionDependencies": [ + "gregoire.dance" + ], "author": { "name": "Grégoire Geis", "email": "opensource@gregoirege.is" @@ -20,7 +23,7 @@ "engines": { "vscode": "^1.63.0" }, - "displayName": "Dance", + "displayName": "Dance (Helix keybindings)", "publisher": "gregoire", "categories": [ "Keymaps", @@ -28,6 +31,10 @@ ], "readme": "README.md", "icon": "dance.png", + "extensionKind": [ + "ui", + "workspace" + ], "scripts": { "package": "vsce package --allow-star-activation", "publish": "vsce publish --allow-star-activation", @@ -1656,6 +1663,18 @@ "title": "Leap or select backward", "command": "dance.selections.splitLines.orLeap.backward" }, + { + "key": "Enter", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Toggle selection indices", + "command": "dance.selections.toggleIndices" + }, + { + "key": "Enter", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Toggle selection indices", + "command": "dance.selections.toggleIndices" + }, { "key": "Alt+X", "when": "editorTextFocus && dance.mode == 'helix/normal'", diff --git a/package.json b/package.json index ac5cc124..bcc804ba 100644 --- a/package.json +++ b/package.json @@ -3966,6 +3966,12 @@ "title": "Leap or select backward", "command": "dance.selections.splitLines.orLeap.backward" }, + { + "key": "Enter", + "when": "editorTextFocus && dance.mode == 'normal'", + "title": "Toggle selection indices", + "command": "dance.selections.toggleIndices" + }, { "key": "Alt+X", "when": "editorTextFocus && dance.mode == 'normal'", diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index ac0567ca..07daad07 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -2627,7 +2627,8 @@ selections.toggleIndices: keys: qwerty: |- - `enter` (dance: normal) + `enter` (core: normal) + `enter` (helix: select) doc: en: | diff --git a/src/commands/README.md b/src/commands/README.md index 1db7dff0..34e9b91f 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -217,7 +217,7 @@ selections are empty selections.sortSort selections selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries -selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal') +selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal')Enter (editorTextFocus && dance.mode == 'select') selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.mode == 'select') selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.mode == 'select') selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') @@ -1728,7 +1728,8 @@ This command: - takes an argument `display` of type `boolean | undefined`. - takes an argument `until` of type `AutoDisposable.Event[]`. -Default keybinding: `enter` (dance: normal) +Default keybinding: `enter` (core: normal) +`enter` (helix: select) ## [`selections.rotate`](./selections.rotate.ts) diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index b79975e5..a6e81b29 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -202,7 +202,7 @@ selections are empty selections.sortSort selections selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries -selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal') +selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal')Enter (editorTextFocus && dance.mode == 'select') selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.mode == 'select') selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.mode == 'select') selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') @@ -1713,7 +1713,8 @@ This command: - takes an argument `display` of type `boolean | undefined`. - takes an argument `until` of type `AutoDisposable.Event[]`. -Default keybinding: `enter` (dance: normal) +Default keybinding: `enter` (core: normal) +`enter` (helix: select) ## [`selections.rotate`](../selections.rotate.ts) diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index 647af465..d339e81a 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -202,7 +202,7 @@ selections are empty selections.sortSort selections selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries -selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal') +selections.toggleIndicesToggle selection indicesEnter (editorTextFocus && dance.mode == 'normal')Enter (editorTextFocus && dance.mode == 'select') selections.trimLinesTrim linesAlt+X (editorTextFocus && dance.mode == 'normal')Alt+X (editorTextFocus && dance.mode == 'select') selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.mode == 'select') selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') @@ -1713,7 +1713,8 @@ This command: - takes an argument `display` of type `boolean | undefined`. - takes an argument `until` of type `AutoDisposable.Event[]`. -Default keybinding: `enter` (dance: normal) +Default keybinding: `enter` (core: normal) +`enter` (helix: select) ## [`selections.rotate`](../selections.rotate.ts) diff --git a/src/commands/selections.ts b/src/commands/selections.ts index 6e2f8cb9..0eaee934 100644 --- a/src/commands/selections.ts +++ b/src/commands/selections.ts @@ -874,7 +874,7 @@ const indicesToken = PerEditorState.registerState(/* isDisposabl /** * Toggle selection indices. * - * @keys `enter` (dance: normal) + * @keys `enter` (core: normal), `enter` (helix: select) * * #### Variants * From 38be042e46555a41ebd8406a843a53941acaf537 Mon Sep 17 00:00:00 2001 From: Strackeror Date: Wed, 7 Aug 2024 16:24:19 +0200 Subject: [PATCH 09/16] Add numpad bindings to select mode --- extensions/helix/package.json | 230 +++++++++++++++++++++++------- src/api/data/commands.yaml | 44 ++++-- src/commands/README.md | 24 ++-- src/commands/layouts/azerty.fr.md | 24 ++-- src/commands/layouts/qwerty.md | 24 ++-- src/commands/misc.ts | 24 ++-- 6 files changed, 260 insertions(+), 110 deletions(-) diff --git a/extensions/helix/package.json b/extensions/helix/package.json index 389a578b..e907db4b 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -714,6 +714,24 @@ "addDigits": 0 } }, + { + "key": "0", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 0 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 0 + } + }, + { + "key": "NumPad0", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 0 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 0 + } + }, { "key": "1", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -732,6 +750,24 @@ "addDigits": 1 } }, + { + "key": "1", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 1 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 1 + } + }, + { + "key": "NumPad1", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 1 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 1 + } + }, { "key": "2", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -750,6 +786,24 @@ "addDigits": 2 } }, + { + "key": "2", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 2 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 2 + } + }, + { + "key": "NumPad2", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 2 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 2 + } + }, { "key": "3", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -768,6 +822,24 @@ "addDigits": 3 } }, + { + "key": "3", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 3 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 3 + } + }, + { + "key": "NumPad3", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 3 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 3 + } + }, { "key": "4", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -786,6 +858,24 @@ "addDigits": 4 } }, + { + "key": "4", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 4 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 4 + } + }, + { + "key": "NumPad4", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 4 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 4 + } + }, { "key": "5", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -804,6 +894,24 @@ "addDigits": 5 } }, + { + "key": "5", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 5 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 5 + } + }, + { + "key": "NumPad5", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 5 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 5 + } + }, { "key": "6", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -822,6 +930,24 @@ "addDigits": 6 } }, + { + "key": "6", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 6 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 6 + } + }, + { + "key": "NumPad6", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 6 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 6 + } + }, { "key": "7", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -840,6 +966,24 @@ "addDigits": 7 } }, + { + "key": "7", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 7 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 7 + } + }, + { + "key": "NumPad7", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 7 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 7 + } + }, { "key": "8", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -858,6 +1002,24 @@ "addDigits": 8 } }, + { + "key": "8", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 8 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 8 + } + }, + { + "key": "NumPad8", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 8 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 8 + } + }, { "key": "9", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -876,6 +1038,24 @@ "addDigits": 9 } }, + { + "key": "9", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 9 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 9 + } + }, + { + "key": "NumPad9", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Add the digit 9 to the counter", + "command": "dance.updateCount", + "args": { + "addDigits": 9 + } + }, { "key": "Shift+;", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -1918,56 +2098,6 @@ "command": "dance.ignore", "when": "editorTextFocus && dance.mode == 'helix/select'" }, - { - "key": "0", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, - { - "key": "1", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, - { - "key": "2", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, - { - "key": "3", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, - { - "key": "4", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, - { - "key": "5", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, - { - "key": "6", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, - { - "key": "7", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, - { - "key": "8", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, - { - "key": "9", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, { "key": "Shift+D", "command": "dance.ignore", diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index 07daad07..c4c21761 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -2701,18 +2701,18 @@ updateCount: #### Additional keybindings - | Title | Keybinding | Command | - | ------------------------------ | -------------------------------------------- | ------------------------------------ | - | Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal) | `[".updateCount", { addDigits: 0 }]` | - | Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal) | `[".updateCount", { addDigits: 1 }]` | - | Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal) | `[".updateCount", { addDigits: 2 }]` | - | Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal) | `[".updateCount", { addDigits: 3 }]` | - | Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal) | `[".updateCount", { addDigits: 4 }]` | - | Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal) | `[".updateCount", { addDigits: 5 }]` | - | Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal) | `[".updateCount", { addDigits: 6 }]` | - | Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal) | `[".updateCount", { addDigits: 7 }]` | - | Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal) | `[".updateCount", { addDigits: 8 }]` | - | Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal) | `[".updateCount", { addDigits: 9 }]` | + | Title | Keybinding | Command | + | ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | + | Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | + | Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | + | Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | + | Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | + | Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | + | Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | + | Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | + | Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | + | Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | + | Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | updateRegister: title: @@ -2870,6 +2870,8 @@ anonymous: qwerty: |- `0` (core: normal) `NumPad0` (core: normal) + `0` (helix: select) + `NumPad0` (helix: select) - title: en: Add the digit 1 to the counter @@ -2884,6 +2886,8 @@ anonymous: qwerty: |- `1` (core: normal) `NumPad1` (core: normal) + `1` (helix: select) + `NumPad1` (helix: select) - title: en: Add the digit 2 to the counter @@ -2898,6 +2902,8 @@ anonymous: qwerty: |- `2` (core: normal) `NumPad2` (core: normal) + `2` (helix: select) + `NumPad2` (helix: select) - title: en: Add the digit 3 to the counter @@ -2912,6 +2918,8 @@ anonymous: qwerty: |- `3` (core: normal) `NumPad3` (core: normal) + `3` (helix: select) + `NumPad3` (helix: select) - title: en: Add the digit 4 to the counter @@ -2926,6 +2934,8 @@ anonymous: qwerty: |- `4` (core: normal) `NumPad4` (core: normal) + `4` (helix: select) + `NumPad4` (helix: select) - title: en: Add the digit 5 to the counter @@ -2940,6 +2950,8 @@ anonymous: qwerty: |- `5` (core: normal) `NumPad5` (core: normal) + `5` (helix: select) + `NumPad5` (helix: select) - title: en: Add the digit 6 to the counter @@ -2954,6 +2966,8 @@ anonymous: qwerty: |- `6` (core: normal) `NumPad6` (core: normal) + `6` (helix: select) + `NumPad6` (helix: select) - title: en: Add the digit 7 to the counter @@ -2968,6 +2982,8 @@ anonymous: qwerty: |- `7` (core: normal) `NumPad7` (core: normal) + `7` (helix: select) + `NumPad7` (helix: select) - title: en: Add the digit 8 to the counter @@ -2982,6 +2998,8 @@ anonymous: qwerty: |- `8` (core: normal) `NumPad8` (core: normal) + `8` (helix: select) + `NumPad8` (helix: select) - title: en: Add the digit 9 to the counter @@ -2996,6 +3014,8 @@ anonymous: qwerty: |- `9` (core: normal) `NumPad9` (core: normal) + `9` (helix: select) + `NumPad9` (helix: select) - commands: |- ["workbench.action.showCommands", { $exclude: [] }] diff --git a/src/commands/README.md b/src/commands/README.md index 34e9b91f..5604cf76 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -826,18 +826,18 @@ Update the current counter used to repeat the next command. #### Additional keybindings -| Title | Keybinding | Command | -| ------------------------------ | -------------------------------------------- | ------------------------------------ | -| Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal) | `[".updateCount", { addDigits: 0 }]` | -| Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal) | `[".updateCount", { addDigits: 1 }]` | -| Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal) | `[".updateCount", { addDigits: 2 }]` | -| Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal) | `[".updateCount", { addDigits: 3 }]` | -| Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal) | `[".updateCount", { addDigits: 4 }]` | -| Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal) | `[".updateCount", { addDigits: 5 }]` | -| Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal) | `[".updateCount", { addDigits: 6 }]` | -| Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal) | `[".updateCount", { addDigits: 7 }]` | -| Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal) | `[".updateCount", { addDigits: 8 }]` | -| Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal) | `[".updateCount", { addDigits: 9 }]` | +| Title | Keybinding | Command | +| ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | +| Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | +| Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | +| Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | +| Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | +| Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | +| Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | +| Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | +| Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | +| Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | +| Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | This command: diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index a6e81b29..da3a919e 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -811,18 +811,18 @@ Update the current counter used to repeat the next command. #### Additional keybindings -| Title | Keybinding | Command | -| ------------------------------ | -------------------------------------------- | ------------------------------------ | -| Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal) | `[".updateCount", { addDigits: 0 }]` | -| Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal) | `[".updateCount", { addDigits: 1 }]` | -| Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal) | `[".updateCount", { addDigits: 2 }]` | -| Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal) | `[".updateCount", { addDigits: 3 }]` | -| Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal) | `[".updateCount", { addDigits: 4 }]` | -| Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal) | `[".updateCount", { addDigits: 5 }]` | -| Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal) | `[".updateCount", { addDigits: 6 }]` | -| Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal) | `[".updateCount", { addDigits: 7 }]` | -| Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal) | `[".updateCount", { addDigits: 8 }]` | -| Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal) | `[".updateCount", { addDigits: 9 }]` | +| Title | Keybinding | Command | +| ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | +| Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | +| Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | +| Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | +| Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | +| Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | +| Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | +| Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | +| Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | +| Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | +| Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | This command: diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index d339e81a..4b6ec635 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -811,18 +811,18 @@ Update the current counter used to repeat the next command. #### Additional keybindings -| Title | Keybinding | Command | -| ------------------------------ | -------------------------------------------- | ------------------------------------ | -| Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal) | `[".updateCount", { addDigits: 0 }]` | -| Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal) | `[".updateCount", { addDigits: 1 }]` | -| Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal) | `[".updateCount", { addDigits: 2 }]` | -| Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal) | `[".updateCount", { addDigits: 3 }]` | -| Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal) | `[".updateCount", { addDigits: 4 }]` | -| Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal) | `[".updateCount", { addDigits: 5 }]` | -| Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal) | `[".updateCount", { addDigits: 6 }]` | -| Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal) | `[".updateCount", { addDigits: 7 }]` | -| Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal) | `[".updateCount", { addDigits: 8 }]` | -| Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal) | `[".updateCount", { addDigits: 9 }]` | +| Title | Keybinding | Command | +| ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | +| Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | +| Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | +| Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | +| Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | +| Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | +| Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | +| Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | +| Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | +| Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | +| Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | This command: diff --git a/src/commands/misc.ts b/src/commands/misc.ts index f8d9143a..7bb49301 100644 --- a/src/commands/misc.ts +++ b/src/commands/misc.ts @@ -256,18 +256,18 @@ export async function updateRegister( * * #### Additional keybindings * - * | Title | Keybinding | Command | - * | ------------------------------ | -------------------------------------------- | ------------------------------------ | - * | Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal) | `[".updateCount", { addDigits: 0 }]` | - * | Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal) | `[".updateCount", { addDigits: 1 }]` | - * | Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal) | `[".updateCount", { addDigits: 2 }]` | - * | Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal) | `[".updateCount", { addDigits: 3 }]` | - * | Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal) | `[".updateCount", { addDigits: 4 }]` | - * | Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal) | `[".updateCount", { addDigits: 5 }]` | - * | Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal) | `[".updateCount", { addDigits: 6 }]` | - * | Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal) | `[".updateCount", { addDigits: 7 }]` | - * | Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal) | `[".updateCount", { addDigits: 8 }]` | - * | Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal) | `[".updateCount", { addDigits: 9 }]` | + * | Title | Keybinding | Command | + * | ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | + * | Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | + * | Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | + * | Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | + * | Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | + * | Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | + * | Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | + * | Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | + * | Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | + * | Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | + * | Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | * * @noreplay */ From 0887662e177657121b8c57841c6b0072ba3ee8b9 Mon Sep 17 00:00:00 2001 From: Strackeror Date: Sat, 17 Aug 2024 17:35:53 +0200 Subject: [PATCH 10/16] PR Fixes --- package.build.ts | 2 -- package.json | 2 -- src/api/modes.ts | 7 +++++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/package.build.ts b/package.build.ts index 48064e30..ff16e1ee 100644 --- a/package.build.ts +++ b/package.build.ts @@ -130,8 +130,6 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ "package:pre": `vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json ${version.replace(/\d+$/, "$&" + preRelease.toString().padStart(3, "0"))}`, "publish:pre": `vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json ${version.replace(/\d+$/, "$&" + preRelease.toString().padStart(3, "0"))}`, - "package-helix": `cd extensions/helix && yarn run package`, - "publish-helix": `cd extensions/helix && yarn run publish`, "package-helix:pre": `cd extensions/helix && yarn run package:pre`, "publish-helix:pre": `cd extensions/helix && yarn run publish:pre`, }, diff --git a/package.json b/package.json index bcc804ba..31ee9cd5 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,6 @@ "publish": "vsce publish --allow-star-activation", "package:pre": "vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.5.15001", "publish:pre": "vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.5.15001", - "package-helix": "cd extensions/helix && yarn run package", - "publish-helix": "cd extensions/helix && yarn run publish", "package-helix:pre": "cd extensions/helix && yarn run package:pre", "publish-helix:pre": "cd extensions/helix && yarn run publish:pre" }, diff --git a/src/api/modes.ts b/src/api/modes.ts index 408299ea..139205f8 100644 --- a/src/api/modes.ts +++ b/src/api/modes.ts @@ -13,7 +13,7 @@ export function toMode(modeName: string, count: number): Thenable; export async function toMode(modeName: string, count?: number) { const context = Context.current, extension = context.extension, - mode = findMode(modeName); + mode = findMode(modeName, context); if (mode === undefined || mode.isPendingDeletion) { throw new Error(`mode ${JSON.stringify(modeName)} does not exist`); } @@ -62,7 +62,10 @@ export async function toMode(modeName: string, count?: number) { }, 0); } -/* Find a mode by name, prioritizing one that's within the same 'namespace' */ +/** + * Returns the {@link Mode} with the given name, prioritizing one that's within the name "namespace" + * as the current mode. + */ function findMode(modeName: string, context?: Context) { context = context ?? Context.current; From 47c273721408353a26f44d0ad8e2101617276a5f Mon Sep 17 00:00:00 2001 From: Strackeror Date: Sat, 17 Aug 2024 18:25:40 +0200 Subject: [PATCH 11/16] Improve keybind parsing for less verbose definitions --- extensions/helix/package.json | 97 ++++---- meta.ts | 117 +++++----- src/api/data/commands.yaml | 368 ++++++++++++------------------ src/commands/README.md | 225 ++++++++---------- src/commands/edit.ts | 32 +-- src/commands/history.ts | 12 +- src/commands/layouts/azerty.fr.md | 225 ++++++++---------- src/commands/layouts/qwerty.md | 225 ++++++++---------- src/commands/misc.ts | 24 +- src/commands/modes.ts | 22 +- src/commands/select.ts | 24 +- src/commands/selections.rotate.ts | 16 +- src/commands/selections.ts | 62 ++--- src/commands/view.ts | 8 +- 14 files changed, 663 insertions(+), 794 deletions(-) diff --git a/extensions/helix/package.json b/extensions/helix/package.json index e907db4b..d5e33753 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -706,8 +706,8 @@ } }, { - "key": "NumPad0", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "0", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 0 to the counter", "command": "dance.updateCount", "args": { @@ -715,8 +715,8 @@ } }, { - "key": "0", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad0", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 0 to the counter", "command": "dance.updateCount", "args": { @@ -742,8 +742,8 @@ } }, { - "key": "NumPad1", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "1", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 1 to the counter", "command": "dance.updateCount", "args": { @@ -751,8 +751,8 @@ } }, { - "key": "1", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad1", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 1 to the counter", "command": "dance.updateCount", "args": { @@ -778,8 +778,8 @@ } }, { - "key": "NumPad2", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "2", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 2 to the counter", "command": "dance.updateCount", "args": { @@ -787,8 +787,8 @@ } }, { - "key": "2", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad2", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 2 to the counter", "command": "dance.updateCount", "args": { @@ -814,8 +814,8 @@ } }, { - "key": "NumPad3", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "3", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 3 to the counter", "command": "dance.updateCount", "args": { @@ -823,8 +823,8 @@ } }, { - "key": "3", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad3", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 3 to the counter", "command": "dance.updateCount", "args": { @@ -850,8 +850,8 @@ } }, { - "key": "NumPad4", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "4", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 4 to the counter", "command": "dance.updateCount", "args": { @@ -859,8 +859,8 @@ } }, { - "key": "4", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad4", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 4 to the counter", "command": "dance.updateCount", "args": { @@ -886,8 +886,8 @@ } }, { - "key": "NumPad5", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "5", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 5 to the counter", "command": "dance.updateCount", "args": { @@ -895,8 +895,8 @@ } }, { - "key": "5", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad5", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 5 to the counter", "command": "dance.updateCount", "args": { @@ -922,8 +922,8 @@ } }, { - "key": "NumPad6", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "6", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 6 to the counter", "command": "dance.updateCount", "args": { @@ -931,8 +931,8 @@ } }, { - "key": "6", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad6", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 6 to the counter", "command": "dance.updateCount", "args": { @@ -958,8 +958,8 @@ } }, { - "key": "NumPad7", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "7", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 7 to the counter", "command": "dance.updateCount", "args": { @@ -967,8 +967,8 @@ } }, { - "key": "7", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad7", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 7 to the counter", "command": "dance.updateCount", "args": { @@ -994,8 +994,8 @@ } }, { - "key": "NumPad8", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "8", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 8 to the counter", "command": "dance.updateCount", "args": { @@ -1003,8 +1003,8 @@ } }, { - "key": "8", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad8", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 8 to the counter", "command": "dance.updateCount", "args": { @@ -1030,8 +1030,8 @@ } }, { - "key": "NumPad9", - "when": "editorTextFocus && dance.mode == 'helix/normal'", + "key": "9", + "when": "editorTextFocus && dance.mode == 'helix/select'", "title": "Add the digit 9 to the counter", "command": "dance.updateCount", "args": { @@ -1039,8 +1039,8 @@ } }, { - "key": "9", - "when": "editorTextFocus && dance.mode == 'helix/select'", + "key": "NumPad9", + "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Add the digit 9 to the counter", "command": "dance.updateCount", "args": { @@ -1681,6 +1681,12 @@ "title": "Copy selections below", "command": "dance.selections.copy" }, + { + "key": "Shift+Alt+C", + "when": "editorTextFocus && dance.mode == 'helix/normal'", + "title": "Copy selections above", + "command": "dance.selections.copy.above" + }, { "key": "Shift+Alt+C", "when": "editorTextFocus && dance.mode == 'helix/select'", @@ -1909,6 +1915,12 @@ "title": "Rotate selections clockwise (selections only)", "command": "dance.selections.rotate.selections" }, + { + "key": "Shift+0", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "title": "Rotate selections clockwise (selections only)", + "command": "dance.selections.rotate.selections" + }, { "key": "Shift+9", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -2143,11 +2155,6 @@ "command": "dance.ignore", "when": "editorTextFocus && dance.mode == 'helix/select'" }, - { - "key": "Shift+0", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, { "key": "Shift+2", "command": "dance.ignore", diff --git a/meta.ts b/meta.ts index b23a9b2c..df59c95c 100644 --- a/meta.ts +++ b/meta.ts @@ -497,73 +497,76 @@ export function parseKeys(keys: string) { if (keys.length === 0) { return []; } - - return keys.replace(/\n/g, ", ").split(/ *, (?=`)/g).map((keyString) => { + return keys.replace(/\n/g, ", ").split(/ *, (?=`)/g).flatMap((keyString) => { const [,, rawKeybinding, rawMetadata] = /^(`+)(.+?)\1 \((.+?)\)$/.exec(keyString)!, - keybinding = rawKeybinding.trim().replace( - specialCharacterRegExp, (m) => (specialCharacterMapping as Record)[m]), - [, category, tags] = /(\w+): (.+)/.exec(rawMetadata)!; + keybinding = rawKeybinding + .trim().replace( + specialCharacterRegExp, (m) => (specialCharacterMapping as Record)[m], + ); + return rawMetadata.split(";").map((metadata) => { + const [, category, tags] = /(\w+): (.+)/.exec(metadata)!; + + // Reorder to match Ctrl+Shift+Alt+_ + let key = ""; + + if (keybinding.includes("c-")) { + key += "Ctrl+"; + } - // Reorder to match Ctrl+Shift+Alt+_ - let key = ""; + if (keybinding.includes("s-")) { + key += "Shift+"; + } - if (keybinding.includes("c-")) { - key += "Ctrl+"; - } + if (keybinding.includes("a-")) { + key += "Alt+"; + } - if (keybinding.includes("s-")) { - key += "Shift+"; - } + const remainingKeybinding = keybinding.replace(/[csa]-/g, ""), + whenClauses = ["editorTextFocus"]; + for (let tag of tags.split(", ")) { + const negate = tag.startsWith("!"); + if (negate) { + tag = tag.slice(1); + } + switch (tag) { + case "normal": + case "insert": + case "input": + case "select": + whenClauses.push(`dance.mode ${negate ? "!=" : "=="} '${tag}'`); + break; - if (keybinding.includes("a-")) { - key += "Alt+"; - } + case "recording": + whenClauses.push(`${negate ? "!" : ""}dance.isRecording`); + break; - const remainingKeybinding = keybinding.replace(/[csa]-/g, ""), - whenClauses = ["editorTextFocus"]; - for (let tag of tags.split(", ")) { - const negate = tag.startsWith("!"); - if (negate) { - tag = tag.slice(1); - } - switch (tag) { - case "normal": - case "insert": - case "input": - case "select": - whenClauses.push(`dance.mode ${negate ? "!=" : "=="} '${tag}'`); - break; - - case "recording": - whenClauses.push(`${negate ? "!" : ""}dance.isRecording`); - break; - - case "prompt": - assert(!negate); - whenClauses.splice(whenClauses.indexOf("editorTextFocus"), 1); - whenClauses.push("inputFocus && dance.inPrompt"); - break; - - default: { - const match = /^"(!?\w+)"$/.exec(tag); - - if (match === null) { - throw new Error("unknown keybinding tag " + tag); - } + case "prompt": + assert(!negate); + whenClauses.splice(whenClauses.indexOf("editorTextFocus"), 1); + whenClauses.push("inputFocus && dance.inPrompt"); + break; - whenClauses.push((negate ? "!" : "") + match[1]); - break; - } + default: { + const match = /^"(!?\w+)"$/.exec(tag); + + if (match === null) { + throw new Error("unknown keybinding tag " + tag); + } + + whenClauses.push((negate ? "!" : "") + match[1]); + break; + } + } } - } - key += remainingKeybinding[0].toUpperCase() + remainingKeybinding.slice(1); + key += remainingKeybinding[0].toUpperCase() + remainingKeybinding.slice(1); - return { - category, - key, - when: whenClauses.join(" && "), - }; + return { + category, + key, + when: whenClauses.join(" && "), + }; + }); }); } diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index c4c21761..530dd9a5 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -64,8 +64,7 @@ edit.case.swap: keys: qwerty: |- `` a-` `` (kakoune: normal) - `` s-` `` (helix: normal) - `` s-` `` (helix: select) + `` s-` `` (helix: normal; helix: select) doc: en: |+ @@ -91,8 +90,7 @@ edit.case.toUpper: keys: qwerty: |- `` s-` `` (kakoune: normal) - `` a-` `` (helix: normal) - `` a-` `` (helix: select) + `` a-` `` (helix: normal; helix: select) doc: en: |+ @@ -131,8 +129,7 @@ edit.deindent.withIncomplete: keys: qwerty: |- - `<` (core: normal) - `<` (helix: select) + `<` (core: normal; helix: select) doc: en: |+ @@ -147,8 +144,7 @@ edit.delete: keys: qwerty: |- - `a-d` (core: normal) - `a-d` (helix: select) + `a-d` (core: normal; helix: select) edit.delete-insert: title: @@ -167,8 +163,7 @@ edit.indent: keys: qwerty: |- - `>` (core: normal) - `>` (helix: select) + `>` (core: normal; helix: select) doc: en: |+ @@ -193,8 +188,7 @@ edit.insert: keys: qwerty: |- `s-a-r` (kakoune: normal) - `s-r` (helix: normal) - `s-r` (helix: select) + `s-r` (helix: normal; helix: select) doc: en: | @@ -224,10 +218,10 @@ edit.insert: | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | - | Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | + | Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | - | Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | - | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | + | Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | + | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | edit.join: @@ -237,8 +231,7 @@ edit.join: keys: qwerty: |- `a-j` (kakoune: normal) - `s-j` (helix: normal) - `s-j` (helix: select) + `s-j` (helix: normal; helix: select) doc: en: |+ @@ -250,8 +243,7 @@ edit.join.select: keys: qwerty: |- - `s-a-j` (core: normal) - `s-a-j` (helix: select) + `s-a-j` (core: normal; helix: select) doc: en: |+ @@ -275,9 +267,9 @@ edit.newLine.above: #### Additional keybindings - | Title | Identifier | Keybinding | Commands | - | ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | - | Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | + | Title | Identifier | Keybinding | Commands | + | ------------------------------------------ | ---------------------- | ------------------------------------| --------------------------------------------------------------------------------- | + | Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal; helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | edit.newLine.above.insert: title: @@ -288,8 +280,7 @@ edit.newLine.above.insert: keys: qwerty: |- - `s-o` (core: normal) - `s-o` (helix: select) + `s-o` (core: normal; helix: select) edit.newLine.below: title: @@ -309,9 +300,9 @@ edit.newLine.below: #### Additional keybindings - | Title | Identifier | Keybinding | Commands | - | ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | - | Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | + | Title | Identifier | Keybinding | Commands | + | ------------------------------------------ | ---------------------- | --------------------------------- | --------------------------------------------------------------------------------- | + | Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal; helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | edit.newLine.below.insert: title: @@ -322,8 +313,7 @@ edit.newLine.below.insert: keys: qwerty: |- - `o` (core: normal) - `o` (helix: select) + `o` (core: normal; helix: select) edit.paste.after: title: @@ -444,8 +434,7 @@ edit.yank-delete: keys: qwerty: |- - `d` (core: normal) - `d` (helix: select) + `d` (core: normal; helix: select) edit.yank-delete-insert: title: @@ -456,8 +445,7 @@ edit.yank-delete-insert: keys: qwerty: |- - `c` (core: normal) - `c` (helix: select) + `c` (core: normal; helix: select) edit.yank-replace: title: @@ -513,8 +501,7 @@ history.redo: keys: qwerty: |- - `s-u` (core: normal) - `s-u` (helix: select) + `s-u` (core: normal; helix: select) doc: en: |+ @@ -541,10 +528,10 @@ history.repeat: Repeat last change. - | Title | Identifier | Keybinding | Commands | - | ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | - | Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek|select|selections)", +count }]` | - | Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | + | Title | Identifier | Keybinding | Commands | + | ---------------------------- | ------------------ | ------------------------------------| ----------------------------------------------------------------------------- | + | Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek|select|selections)", +count }]` | + | Repeat last seek | `repeat.seek` | `a-.` (core: normal; helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | history.repeat.edit: title: @@ -568,8 +555,7 @@ history.repeat.seek: keys: qwerty: |- - `a-.` (core: normal) - `a-.` (helix: select) + `a-.` (core: normal; helix: select) history.repeat.selection: title: @@ -587,8 +573,7 @@ history.undo: keys: qwerty: |- - `u` (core: normal) - `u` (helix: select) + `u` (core: normal; helix: select) doc: en: |+ @@ -642,8 +627,7 @@ modes.insert.after: keys: qwerty: |- - `a` (core: normal) - `a` (helix: select) + `a` (core: normal; helix: select) modes.insert.before: title: @@ -654,8 +638,7 @@ modes.insert.before: keys: qwerty: |- - `i` (core: normal) - `i` (helix: select) + `i` (core: normal; helix: select) modes.insert.lineEnd: title: @@ -666,8 +649,7 @@ modes.insert.lineEnd: keys: qwerty: |- - `s-a` (core: normal) - `s-a` (helix: select) + `s-a` (core: normal; helix: select) modes.insert.lineStart: title: @@ -678,8 +660,7 @@ modes.insert.lineStart: keys: qwerty: |- - `s-i` (core: normal) - `s-i` (helix: select) + `s-i` (core: normal; helix: select) modes.set: title: @@ -691,20 +672,20 @@ modes.set: #### Variants - | Title | Identifier | Keybinding | Command | - | ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | - | Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | - | Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | - | Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | + | Title | Identifier | Keybinding | Command | + | ------------------ | ------------ | ----------------------------------------------------------- | ----------------------------------------------------------- | + | Set mode to Normal | `set.normal` | `escape` (core: insert; helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | + | Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | + | Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | Other variants are provided to switch to insert mode: - | Title | Identifier | Keybinding | Commands | - | -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | - | Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | - | Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | - | Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | + | Title | Identifier | Keybinding | Commands | + | -------------------- | ------------------ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | Insert before | `insert.before` | `i` (core: normal; helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | + | Insert after | `insert.after` | `a` (core: normal; helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | + | Insert at line start | `insert.lineStart` | `s-i` (core: normal; helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | + | Insert at line end | `insert.lineEnd` | `s-a` (core: normal; helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | modes.set.insert: title: @@ -720,15 +701,14 @@ modes.set.normal: title: en: Set mode to Normal - commands: |- - [".modes.set", { mode: "normal" }], ["hideSuggestWidget"] - keys: qwerty: |- - `escape` (core: insert) - `escape` (helix: select) + `escape` (core: insert; helix: select) `v` (helix: select) + commands: |- + [".modes.set", { mode: "normal" }], ["hideSuggestWidget"] + modes.set.select: title: en: Set mode to Select @@ -1584,8 +1564,7 @@ select.buffer: keys: qwerty: |- - `%` (core: normal) - `%` (helix: select) + `%` (core: normal; helix: select) doc: en: |+ @@ -1816,8 +1795,7 @@ select.line.below.extend: keys: qwerty: |- - `x` (helix: normal) - `x` (helix: select) + `x` (helix: normal; helix: select) doc: en: |+ @@ -2066,16 +2044,16 @@ select.vertically: The following keybindings are also defined: - | Keybinding | Command | - | -------------------------------------------| ---------------------------------------------------------------------------- | - | `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | - | `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | - | `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | - | `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | - | `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | - | `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | - | `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | - | `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | + | Keybinding | Command | + | -----------------------------------| ---------------------------------------------------------------------------- | + | `c-f` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | + | `c-d` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | + | `c-b` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | + | `c-u` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | + | `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | + | `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | + | `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | + | `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | selections.changeDirection: title: @@ -2083,8 +2061,7 @@ selections.changeDirection: keys: qwerty: |- - `a-;` (core: normal) - `a-;` (helix: select) + `a-;` (core: normal; helix: select) doc: en: | @@ -2124,8 +2101,7 @@ selections.clear.main: keys: qwerty: |- - `a-,` (core: normal) - `a-,` (helix: select) + `a-,` (core: normal; helix: select) selections.clear.secondary: title: @@ -2136,8 +2112,7 @@ selections.clear.secondary: keys: qwerty: |- - `,` (core: normal) - `,` (helix: select) + `,` (core: normal; helix: select) selections.copy: title: @@ -2145,8 +2120,7 @@ selections.copy: keys: qwerty: |- - `s-c` (core: normal) - `s-c` (helix: select) + `s-c` (core: normal; helix: select) doc: en: | @@ -2155,9 +2129,9 @@ selections.copy: #### Variant - | Title | Identifier | Keybinding | Command | - | --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | - | Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | + | Title | Identifier | Keybinding | Command | + | --------------------- | ------------ | ------------------------------------- | ----------------------------------------- | + | Copy selections above | `copy.above` | `s-a-c` (core: normal; helix: select) | `[".selections.copy", { direction: -1 }]` | selections.copy.above: title: @@ -2168,8 +2142,7 @@ selections.copy.above: keys: qwerty: |- - `s-a-c` (kakoune: normal) - `s-a-c` (helix: select) + `s-a-c` (core: normal; helix: select) selections.expandToLines: title: @@ -2178,8 +2151,7 @@ selections.expandToLines: keys: qwerty: |- `x` (kakoune: normal) - `s-x` (helix: normal) - `s-x` (helix: select) + `s-x` (helix: normal; helix: select) doc: en: |+ @@ -2214,8 +2186,7 @@ selections.filter: keys: qwerty: |- - `$` (core: normal) - `$` (helix: select) + `$` (core: normal; helix: select) doc: en: | @@ -2223,12 +2194,12 @@ selections.filter: #### Variants - | Title | Identifier | Keybinding | Commands | - | -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | - | Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | - | Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | - | Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | - | Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | + | Title | Identifier | Keybinding | Commands | + | -------------------------- | ----------------------- | ------------------------------------- | ------------------------------------------------------------------------ | + | Keep matching selections | `filter.regexp` | `a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | + | Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | + | Clear secondary selections | `clear.secondary` | `,` (core: normal; helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | + | Clear main selections | `clear.main` | `a-,` (core: normal; helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | selections.filter.regexp: title: @@ -2239,8 +2210,7 @@ selections.filter.regexp: keys: qwerty: |- - `a-k` (core: normal) - `a-k` (helix: select) + `a-k` (core: normal; helix: select) selections.filter.regexp.inverse: title: @@ -2248,8 +2218,7 @@ selections.filter.regexp.inverse: keys: qwerty: |- - `s-a-k` (core: normal) - `s-a-k` (helix: select) + `s-a-k` (core: normal; helix: select) commands: |- [".selections.filter", { defaultExpression: "/", inverse: true, $exclude: [] }] @@ -2301,8 +2270,7 @@ selections.pipe: keys: qwerty: |- - `a-|` (core: normal) - `a-|` (helix: select) + `a-|` (core: normal; helix: select) doc: en: | @@ -2315,11 +2283,11 @@ selections.pipe: #### Additional commands - | Title | Identifier | Keybinding | Commands | - | ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | - | Pipe and replace | `pipe.replace` | `|` (core: normal), `|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", ... }]` | - | Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "end" , shift: "select", ... }]` | - | Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "start", shift: "select", ... }]` | + | Title | Identifier | Keybinding | Commands | + | ------------------- | -------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | + | Pipe and replace | `pipe.replace` | `|` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", ... }]` | + | Pipe and append | `pipe.append` | `!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "end" , shift: "select", ... }]` | + | Pipe and prepend | `pipe.prepend` | `a-!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "start", shift: "select", ... }]` | selections.pipe.append: title: @@ -2330,8 +2298,7 @@ selections.pipe.append: keys: qwerty: |- - `!` (core: normal) - `!` (helix: select) + `!` (core: normal; helix: select) selections.pipe.prepend: title: @@ -2342,8 +2309,7 @@ selections.pipe.prepend: keys: qwerty: |- - `a-!` (core: normal) - `a-!` (helix: select) + `a-!` (core: normal; helix: select) selections.pipe.replace: title: @@ -2354,8 +2320,7 @@ selections.pipe.replace: keys: qwerty: |- - `|` (core: normal) - `|` (helix: select) + `|` (core: normal; helix: select) selections.reduce: title: @@ -2363,8 +2328,7 @@ selections.reduce: keys: qwerty: |- - `;` (core: normal) - `;` (helix: select) + `;` (core: normal; helix: select) doc: en: | @@ -2463,14 +2427,13 @@ selections.rotate.contents: The following command is also available: - | Title | Identifier | Keybinding | Command | - | --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | - | Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | + | Title | Identifier | Keybinding | Command | + | --------------------------------------------------- | ------------------ | ------------------------------------ | ---------------------------------------------------- | + | Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal; helix: select) | `[".selections.rotate.contents", { reverse: true }]` | keys: qwerty: |- - `a-)` (helix: normal) - `a-)` (helix: select) + `a-)` (helix: normal; helix: select) selections.rotate.contents.reverse: title: @@ -2478,8 +2441,7 @@ selections.rotate.contents.reverse: keys: qwerty: |- - `a-(` (helix: normal) - `a-(` (helix: select) + `a-(` (helix: normal; helix: select) commands: |- [".selections.rotate.contents", { reverse: true }] @@ -2490,7 +2452,7 @@ selections.rotate.selections: keys: qwerty: |- - `)` (core: normal) + `)` (core: normal; helix: select) doc: en: | @@ -2499,9 +2461,9 @@ selections.rotate.selections: The following keybinding is also available: - | Title | Identifier | Keybinding | Command | - | ----------------------------------------------------- | -------------------- | --------------------------------------- | ------------------------------------------------------ | - | Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal), `(` (helix: select) | `[".selections.rotate.selections", { reverse: true }]` | + | Title | Identifier | Keybinding | Command | + | ----------------------------------------------------- | -------------------- | --------------------------------- | ------------------------------------------------------ | + | Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal; helix: select) | `[".selections.rotate.selections", { reverse: true }]` | selections.rotate.selections.reverse: title: @@ -2512,8 +2474,7 @@ selections.rotate.selections.reverse: keys: qwerty: |- - `(` (core: normal) - `(` (helix: select) + `(` (core: normal; helix: select) selections.save: title: @@ -2533,8 +2494,7 @@ selections.saveText: keys: qwerty: |- - `y` (core: normal) - `y` (helix: select) + `y` (core: normal; helix: select) doc: en: |+ @@ -2550,9 +2510,9 @@ selections.select: #### Variants - | Title | Identifier | Keybinding | Command | - | -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | - | Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | + | Title | Identifier | Keybinding | Command | + | -------------- | --------------- | --------------------------------- | ------------------------------------------------------------------------------------------------- | + | Leap or select | `select.orLeap` | `s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | selections.select.orLeap: title: @@ -2563,8 +2523,7 @@ selections.select.orLeap: keys: qwerty: |- - `s` (core: normal) - `s` (helix: select) + `s` (core: normal; helix: select) selections.showIndices: title: @@ -2588,8 +2547,7 @@ selections.split: keys: qwerty: |- - `s-s` (core: normal) - `s-s` (helix: select) + `s-s` (core: normal; helix: select) doc: en: |+ @@ -2605,9 +2563,9 @@ selections.splitLines: #### Variants - | Title | Identifier | Keybinding | Command | - | ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | - | Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | + | Title | Identifier | Keybinding | Command | + | ----------------------- | ---------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------- | + | Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | selections.splitLines.orLeap.backward: title: @@ -2618,8 +2576,7 @@ selections.splitLines.orLeap.backward: keys: qwerty: |- - `a-s` (core: normal) - `a-s` (helix: select) + `a-s` (core: normal; helix: select) selections.toggleIndices: title: @@ -2627,8 +2584,7 @@ selections.toggleIndices: keys: qwerty: |- - `enter` (core: normal) - `enter` (helix: select) + `enter` (core: normal; helix: select) doc: en: | @@ -2648,8 +2604,7 @@ selections.trimLines: keys: qwerty: |- - `a-x` (core: normal) - `a-x` (helix: select) + `a-x` (core: normal; helix: select) doc: en: |+ @@ -2663,8 +2618,7 @@ selections.trimWhitespace: keys: qwerty: |- - `_` (core: normal) - `_` (helix: select) + `_` (core: normal; helix: select) doc: en: |+ @@ -2701,18 +2655,18 @@ updateCount: #### Additional keybindings - | Title | Keybinding | Command | - | ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | - | Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | - | Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | - | Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | - | Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | - | Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | - | Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | - | Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | - | Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | - | Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | - | Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | + | Title | Keybinding | Command | + | ------------------------------ | -------------------------------------------------------------------------- | ------------------------------------ | + | Add the digit 0 to the counter | `0` (core: normal; helix: select), `NumPad0` (core: normal; helix: select) | `[".updateCount", { addDigits: 0 }]` | + | Add the digit 1 to the counter | `1` (core: normal; helix: select), `NumPad1` (core: normal; helix: select) | `[".updateCount", { addDigits: 1 }]` | + | Add the digit 2 to the counter | `2` (core: normal; helix: select), `NumPad2` (core: normal; helix: select) | `[".updateCount", { addDigits: 2 }]` | + | Add the digit 3 to the counter | `3` (core: normal; helix: select), `NumPad3` (core: normal; helix: select) | `[".updateCount", { addDigits: 3 }]` | + | Add the digit 4 to the counter | `4` (core: normal; helix: select), `NumPad4` (core: normal; helix: select) | `[".updateCount", { addDigits: 4 }]` | + | Add the digit 5 to the counter | `5` (core: normal; helix: select), `NumPad5` (core: normal; helix: select) | `[".updateCount", { addDigits: 5 }]` | + | Add the digit 6 to the counter | `6` (core: normal; helix: select), `NumPad6` (core: normal; helix: select) | `[".updateCount", { addDigits: 6 }]` | + | Add the digit 7 to the counter | `7` (core: normal; helix: select), `NumPad7` (core: normal; helix: select) | `[".updateCount", { addDigits: 7 }]` | + | Add the digit 8 to the counter | `8` (core: normal; helix: select), `NumPad8` (core: normal; helix: select) | `[".updateCount", { addDigits: 8 }]` | + | Add the digit 9 to the counter | `9` (core: normal; helix: select), `NumPad9` (core: normal; helix: select) | `[".updateCount", { addDigits: 9 }]` | updateRegister: title: @@ -2775,8 +2729,7 @@ anonymous: keys: qwerty: |- `v` (kakoune: normal) - `z` (helix: normal) - `z` (helix: select) + `z` (helix: normal; helix: select) - title: en: Show view menu (locked) @@ -2787,8 +2740,7 @@ anonymous: keys: qwerty: |- `s-v` (kakoune: normal) - `s-z` (helix: normal) - `s-z` (helix: select) + `s-z` (helix: normal; helix: select) - commands: |- [".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }] @@ -2802,8 +2754,7 @@ anonymous: keys: qwerty: |- - `c-u` (core: normal) - `c-u` (core: insert) + `c-u` (core: normal; core: insert) - commands: |- [".select.vertically", { direction: -1, by: "page" , shift: "extend" }] @@ -2817,8 +2768,7 @@ anonymous: keys: qwerty: |- - `c-b` (core: normal) - `c-b` (core: insert) + `c-b` (core: normal; core: insert) - commands: |- [".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }] @@ -2832,8 +2782,7 @@ anonymous: keys: qwerty: |- - `c-d` (core: normal) - `c-d` (core: insert) + `c-d` (core: normal; core: insert) - commands: |- [".select.vertically", { direction: 1, by: "page" , shift: "extend" }] @@ -2847,8 +2796,7 @@ anonymous: keys: qwerty: |- - `c-f` (core: normal) - `c-f` (core: insert) + `c-f` (core: normal; core: insert) - commands: |- [".selections.restore.withCurrent", { reverse: true, $exclude: [] }] @@ -2868,10 +2816,8 @@ anonymous: `s-0` (core: normal) `NumPad0` (core: normal) qwerty: |- - `0` (core: normal) - `NumPad0` (core: normal) - `0` (helix: select) - `NumPad0` (helix: select) + `0` (core: normal; helix: select) + `NumPad0` (core: normal; helix: select) - title: en: Add the digit 1 to the counter @@ -2884,10 +2830,8 @@ anonymous: `s-1` (core: normal) `NumPad1` (core: normal) qwerty: |- - `1` (core: normal) - `NumPad1` (core: normal) - `1` (helix: select) - `NumPad1` (helix: select) + `1` (core: normal; helix: select) + `NumPad1` (core: normal; helix: select) - title: en: Add the digit 2 to the counter @@ -2900,10 +2844,8 @@ anonymous: `s-2` (core: normal) `NumPad2` (core: normal) qwerty: |- - `2` (core: normal) - `NumPad2` (core: normal) - `2` (helix: select) - `NumPad2` (helix: select) + `2` (core: normal; helix: select) + `NumPad2` (core: normal; helix: select) - title: en: Add the digit 3 to the counter @@ -2916,10 +2858,8 @@ anonymous: `s-3` (core: normal) `NumPad3` (core: normal) qwerty: |- - `3` (core: normal) - `NumPad3` (core: normal) - `3` (helix: select) - `NumPad3` (helix: select) + `3` (core: normal; helix: select) + `NumPad3` (core: normal; helix: select) - title: en: Add the digit 4 to the counter @@ -2932,10 +2872,8 @@ anonymous: `s-4` (core: normal) `NumPad4` (core: normal) qwerty: |- - `4` (core: normal) - `NumPad4` (core: normal) - `4` (helix: select) - `NumPad4` (helix: select) + `4` (core: normal; helix: select) + `NumPad4` (core: normal; helix: select) - title: en: Add the digit 5 to the counter @@ -2948,10 +2886,8 @@ anonymous: `s-5` (core: normal) `NumPad5` (core: normal) qwerty: |- - `5` (core: normal) - `NumPad5` (core: normal) - `5` (helix: select) - `NumPad5` (helix: select) + `5` (core: normal; helix: select) + `NumPad5` (core: normal; helix: select) - title: en: Add the digit 6 to the counter @@ -2964,10 +2900,8 @@ anonymous: `s-6` (core: normal) `NumPad6` (core: normal) qwerty: |- - `6` (core: normal) - `NumPad6` (core: normal) - `6` (helix: select) - `NumPad6` (helix: select) + `6` (core: normal; helix: select) + `NumPad6` (core: normal; helix: select) - title: en: Add the digit 7 to the counter @@ -2980,10 +2914,8 @@ anonymous: `s-7` (core: normal) `NumPad7` (core: normal) qwerty: |- - `7` (core: normal) - `NumPad7` (core: normal) - `7` (helix: select) - `NumPad7` (helix: select) + `7` (core: normal; helix: select) + `NumPad7` (core: normal; helix: select) - title: en: Add the digit 8 to the counter @@ -2996,10 +2928,8 @@ anonymous: `s-8` (core: normal) `NumPad8` (core: normal) qwerty: |- - `8` (core: normal) - `NumPad8` (core: normal) - `8` (helix: select) - `NumPad8` (helix: select) + `8` (core: normal; helix: select) + `NumPad8` (core: normal; helix: select) - title: en: Add the digit 9 to the counter @@ -3012,10 +2942,8 @@ anonymous: `s-9` (core: normal) `NumPad9` (core: normal) qwerty: |- - `9` (core: normal) - `NumPad9` (core: normal) - `9` (helix: select) - `NumPad9` (helix: select) + `9` (core: normal; helix: select) + `NumPad9` (core: normal; helix: select) - commands: |- ["workbench.action.showCommands", { $exclude: [] }] diff --git a/src/commands/README.md b/src/commands/README.md index 5604cf76..db495639 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -222,7 +222,7 @@ selections are empty selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.mode == 'select') selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.mode == 'select') -selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal') +selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal')Shift+0 (editorTextFocus && dance.mode == 'select') selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.mode == 'normal') selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.mode == 'select') selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.mode == 'select') @@ -291,10 +291,10 @@ Specify `all` to paste all contents next to each selection. | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | -| Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | +| Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | -| Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | -| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | +| Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | +| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | This command: @@ -308,8 +308,7 @@ This command: - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`. Default keybinding: `s-a-r` (kakoune: normal) -`s-r` (helix: normal) -`s-r` (helix: select) +`s-r` (helix: normal; helix: select) @@ -322,8 +321,7 @@ This command: - takes an argument `separator` of type `string`. Default keybinding: `a-j` (kakoune: normal) -`s-j` (helix: normal) -`s-j` (helix: select) +`s-j` (helix: normal; helix: select) @@ -335,8 +333,7 @@ Join lines and select inserted separators. This command: - takes an argument `separator` of type `string`. -Default keybinding: `s-a-j` (core: normal) -`s-a-j` (helix: select) +Default keybinding: `s-a-j` (core: normal; helix: select) @@ -348,8 +345,7 @@ Indent selected lines. This command: - may be repeated with a given number of repetitions. -Default keybinding: `>` (core: normal) -`>` (helix: select) +Default keybinding: `>` (core: normal; helix: select) @@ -385,8 +381,7 @@ Deindent selected lines (including incomplete indent). This command: - may be repeated with a given number of repetitions. -Default keybinding: `<` (core: normal) -`<` (helix: select) +Default keybinding: `<` (core: normal; helix: select) @@ -408,8 +403,7 @@ Transform to upper case. Default keybinding: `` s-` `` (kakoune: normal) -`` a-` `` (helix: normal) -`` a-` `` (helix: select) +`` a-` `` (helix: normal; helix: select) @@ -420,8 +414,7 @@ Swap case. Default keybinding: `` a-` `` (kakoune: normal) -`` s-` `` (helix: normal) -`` s-` `` (helix: select) +`` s-` `` (helix: normal; helix: select) @@ -478,9 +471,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | -| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | ------------------------------------| --------------------------------------------------------------------------------- | +| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal; helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -500,9 +493,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | -| Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | --------------------------------- | --------------------------------------------------------------------------------- | +| Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal; helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -524,8 +517,7 @@ Undo. This command: - does not require an active text editor. -Default keybinding: `u` (core: normal) -`u` (helix: select) +Default keybinding: `u` (core: normal; helix: select) @@ -537,8 +529,7 @@ Redo. This command: - does not require an active text editor. -Default keybinding: `s-u` (core: normal) -`s-u` (helix: select) +Default keybinding: `s-u` (core: normal; helix: select) @@ -571,10 +562,10 @@ Default keybinding: `s-a-u` (kakoune: normal) Repeat last change. -| Title | Identifier | Keybinding | Commands | -| ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | -| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | -| Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | +| Title | Identifier | Keybinding | Commands | +| ---------------------------- | ------------------ | ------------------------------------| ----------------------------------------------------------------------------- | +| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | +| Repeat last seek | `repeat.seek` | `a-.` (core: normal; helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | This command: - may be repeated with a given number of repetitions. @@ -826,18 +817,18 @@ Update the current counter used to repeat the next command. #### Additional keybindings -| Title | Keybinding | Command | -| ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | -| Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | -| Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | -| Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | -| Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | -| Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | -| Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | -| Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | -| Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | -| Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | -| Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | +| Title | Keybinding | Command | +| ------------------------------ | -------------------------------------------------------------------------- | ------------------------------------ | +| Add the digit 0 to the counter | `0` (core: normal; helix: select), `NumPad0` (core: normal; helix: select) | `[".updateCount", { addDigits: 0 }]` | +| Add the digit 1 to the counter | `1` (core: normal; helix: select), `NumPad1` (core: normal; helix: select) | `[".updateCount", { addDigits: 1 }]` | +| Add the digit 2 to the counter | `2` (core: normal; helix: select), `NumPad2` (core: normal; helix: select) | `[".updateCount", { addDigits: 2 }]` | +| Add the digit 3 to the counter | `3` (core: normal; helix: select), `NumPad3` (core: normal; helix: select) | `[".updateCount", { addDigits: 3 }]` | +| Add the digit 4 to the counter | `4` (core: normal; helix: select), `NumPad4` (core: normal; helix: select) | `[".updateCount", { addDigits: 4 }]` | +| Add the digit 5 to the counter | `5` (core: normal; helix: select), `NumPad5` (core: normal; helix: select) | `[".updateCount", { addDigits: 5 }]` | +| Add the digit 6 to the counter | `6` (core: normal; helix: select), `NumPad6` (core: normal; helix: select) | `[".updateCount", { addDigits: 6 }]` | +| Add the digit 7 to the counter | `7` (core: normal; helix: select), `NumPad7` (core: normal; helix: select) | `[".updateCount", { addDigits: 7 }]` | +| Add the digit 8 to the counter | `8` (core: normal; helix: select), `NumPad8` (core: normal; helix: select) | `[".updateCount", { addDigits: 8 }]` | +| Add the digit 9 to the counter | `9` (core: normal; helix: select), `NumPad9` (core: normal; helix: select) | `[".updateCount", { addDigits: 9 }]` | This command: @@ -910,20 +901,20 @@ Set Dance mode. #### Variants -| Title | Identifier | Keybinding | Command | -| ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | -| Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | -| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | -| Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | +| Title | Identifier | Keybinding | Command | +| ------------------ | ------------ | ----------------------------------------------------------- | ----------------------------------------------------------- | +| Set mode to Normal | `set.normal` | `escape` (core: insert; helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | +| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | +| Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | Other variants are provided to switch to insert mode: -| Title | Identifier | Keybinding | Commands | -| -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | -| Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------- | ------------------ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Insert before | `insert.before` | `i` (core: normal; helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert after | `insert.after` | `a` (core: normal; helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Insert at line start | `insert.lineStart` | `s-i` (core: normal; helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert at line end | `insert.lineEnd` | `s-a` (core: normal; helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | This command: @@ -1189,8 +1180,7 @@ Select whole buffer. -Default keybinding: `%` (core: normal) -`%` (helix: select) +Default keybinding: `%` (core: normal; helix: select) @@ -1210,16 +1200,16 @@ Select vertically. The following keybindings are also defined: -| Keybinding | Command | -| -------------------------------------------| ---------------------------------------------------------------------------- | -| `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | -| `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | -| `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | -| `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | -| `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | -| `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | -| `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | -| `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | +| Keybinding | Command | +| -----------------------------------| ---------------------------------------------------------------------------- | +| `c-f` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | +| `c-d` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | +| `c-b` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | +| `c-u` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | +| `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | +| `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | +| `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | +| `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | This command: - may be repeated with a given number of repetitions. @@ -1285,8 +1275,7 @@ Extend to line below. This command: - may be repeated with a given number of repetitions. -Default keybinding: `x` (helix: normal) -`x` (helix: select) +Default keybinding: `x` (helix: normal; helix: select) @@ -1420,8 +1409,7 @@ Copy selections text. This command: - accepts a register (by default, it uses `dquote`). -Default keybinding: `y` (core: normal) -`y` (helix: select) +Default keybinding: `y` (core: normal; helix: select) @@ -1485,18 +1473,17 @@ See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes #### Additional commands -| Title | Identifier | Keybinding | Commands | -| ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| Pipe and replace | `pipe.replace` | `\|` (core: normal), `\|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | -| Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | -| Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------- | -------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Pipe and replace | `pipe.replace` | `\|` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | +| Pipe and append | `pipe.append` | `!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | +| Pipe and prepend | `pipe.prepend` | `a-!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | This command: - accepts a register (by default, it uses `pipe`). - takes an input `expression` of type `string`. -Default keybinding: `a-|` (core: normal) -`a-|` (helix: select) +Default keybinding: `a-|` (core: normal; helix: select) @@ -1506,12 +1493,12 @@ Filter selections. #### Variants -| Title | Identifier | Keybinding | Commands | -| -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | -| Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | -| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | -| Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | -| Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------------- | ----------------------- | ------------------------------------- | ------------------------------------------------------------------------ | +| Keep matching selections | `filter.regexp` | `a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | +| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | +| Clear secondary selections | `clear.secondary` | `,` (core: normal; helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | +| Clear main selections | `clear.main` | `a-,` (core: normal; helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | This command: - accepts an argument of type `{ expression?: string }`. @@ -1520,8 +1507,7 @@ This command: - takes an argument `interactive` of type `boolean`. - takes an argument `inverse` of type `boolean`. -Default keybinding: `$` (core: normal) -`$` (helix: select) +Default keybinding: `$` (core: normal; helix: select) @@ -1531,9 +1517,9 @@ Select within selections. #### Variants -| Title | Identifier | Keybinding | Command | -| -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | -| Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| -------------- | --------------- | --------------------------------- | ------------------------------------------------------------------------------------------------- | +| Leap or select | `select.orLeap` | `s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | This command: - accepts an argument of type `{ re?: string | RegExp }`. @@ -1551,8 +1537,7 @@ This command: - takes an argument `excludeEmpty` of type `boolean`. - takes an argument `interactive` of type `boolean`. -Default keybinding: `s-s` (core: normal) -`s-s` (helix: select) +Default keybinding: `s-s` (core: normal; helix: select) @@ -1562,9 +1547,9 @@ Split selections at line boundaries. #### Variants -| Title | Identifier | Keybinding | Command | -| ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------- | ---------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | This command: - may be repeated with a given number of repetitions. @@ -1581,8 +1566,7 @@ Expand selections to contain full lines (including end-of-line characters). Default keybinding: `x` (kakoune: normal) -`s-x` (helix: normal) -`s-x` (helix: select) +`s-x` (helix: normal; helix: select) @@ -1594,8 +1578,7 @@ Trim selections to only contain full lines (from start to line break). -Default keybinding: `a-x` (core: normal) -`a-x` (helix: select) +Default keybinding: `a-x` (core: normal; helix: select) @@ -1607,8 +1590,7 @@ Trim whitespace at beginning and end of selections. -Default keybinding: `_` (core: normal) -`_` (helix: select) +Default keybinding: `_` (core: normal; helix: select) @@ -1628,8 +1610,7 @@ This command: - takes an argument `empty` of type `boolean`. - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | "both"`. -Default keybinding: `;` (core: normal) -`;` (helix: select) +Default keybinding: `;` (core: normal; helix: select) @@ -1647,8 +1628,7 @@ Change direction of selections. | Backward selections | `faceBackward` | | `[".selections.changeDirection", { direction: -1 }]` | -Default keybinding: `a-;` (core: normal) -`a-;` (helix: select) +Default keybinding: `a-;` (core: normal; helix: select) @@ -1684,15 +1664,14 @@ Copy selections below. #### Variant -| Title | Identifier | Keybinding | Command | -| --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | -| Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | +| Title | Identifier | Keybinding | Command | +| --------------------- | ------------ | ------------------------------------- | ----------------------------------------- | +| Copy selections above | `copy.above` | `s-a-c` (core: normal; helix: select) | `[".selections.copy", { direction: -1 }]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `s-c` (core: normal) -`s-c` (helix: select) +Default keybinding: `s-c` (core: normal; helix: select) @@ -1728,8 +1707,7 @@ This command: - takes an argument `display` of type `boolean | undefined`. - takes an argument `until` of type `AutoDisposable.Event[]`. -Default keybinding: `enter` (core: normal) -`enter` (helix: select) +Default keybinding: `enter` (core: normal; helix: select) ## [`selections.rotate`](./selections.rotate.ts) @@ -1763,16 +1741,15 @@ Rotate selections clockwise (contents only). The following command is also available: -| Title | Identifier | Keybinding | Command | -| --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | -| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| --------------------------------------------------- | ------------------ | ------------------------------------ | ---------------------------------------------------- | +| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal; helix: select) | `[".selections.rotate.contents", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. -Default keybinding: `a-)` (helix: normal) -`a-)` (helix: select) +Default keybinding: `a-)` (helix: normal; helix: select) @@ -1783,15 +1760,15 @@ Rotate selections clockwise (selections only). The following keybinding is also available: -| Title | Identifier | Keybinding | Command | -| ----------------------------------------------------- | -------------------- | --------------------------------------- | ------------------------------------------------------ | -| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal), `(` (helix: select) | `[".selections.rotate.selections", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------------------------------------- | -------------------- | --------------------------------- | ------------------------------------------------------ | +| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal; helix: select) | `[".selections.rotate.selections", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. -Default keybinding: `)` (core: normal) +Default keybinding: `)` (core: normal; helix: select) ## [`view`](./view.ts) @@ -1799,10 +1776,10 @@ Moving the editor view. #### Predefined keybindings -| Title | Keybinding | Command | -| ----------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- | -| Show view menu | `v` (kakoune: normal), `z` (helix: normal), `z` (helix: select) | `[".openMenu", { menu: "view", ... }]` | -| Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal), `s-z` (helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | +| Title | Keybinding | Command | +| ----------------------- | ------------------------------------------------------------- | ---------------------------------------------------- | +| Show view menu | `v` (kakoune: normal), `z` (helix: normal; helix: select) | `[".openMenu", { menu: "view", ... }]` | +| Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal; helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | diff --git a/src/commands/edit.ts b/src/commands/edit.ts index 46474bf2..031d81e0 100644 --- a/src/commands/edit.ts +++ b/src/commands/edit.ts @@ -25,7 +25,7 @@ declare module "./edit"; * * Specify `all` to paste all contents next to each selection. * - * @keys `s-a-r` (kakoune: normal), `s-r` (helix: normal), `s-r` (helix: select) + * @keys `s-a-r` (kakoune: normal), `s-r` (helix: normal; helix: select) * * #### Additional commands * @@ -40,10 +40,10 @@ declare module "./edit"; * | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | * | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | * | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | - * | Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | + * | Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | * | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | - * | Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | - * | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | + * | Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | + * | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | * | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | */ export async function insert( @@ -133,7 +133,7 @@ export async function insert( /** * Join lines. * - * @keys `a-j` (kakoune: normal), `s-j` (helix: normal), `s-j` (helix: select) + * @keys `a-j` (kakoune: normal), `s-j` (helix: normal; helix: select) */ export function join(_: Context, separator?: Argument) { return joinLines(Selections.lines(), separator); @@ -142,7 +142,7 @@ export function join(_: Context, separator?: Argument) { /** * Join lines and select inserted separators. * - * @keys `s-a-j` (core: normal), `s-a-j` (helix: select) + * @keys `s-a-j` (core: normal; helix: select) */ export async function join_select(_: Context, separator?: Argument) { Selections.set(await joinLines(Selections.lines(), separator)); @@ -151,7 +151,7 @@ export async function join_select(_: Context, separator?: Argument) { /** * Indent selected lines. * - * @keys `>` (core: normal), `>` (helix: select) + * @keys `>` (core: normal; helix: select) */ export function indent(_: Context, repetitions: number) { return indentLines(Selections.lines(), repetitions, /* indentEmpty= */ false); @@ -178,7 +178,7 @@ export function deindent(_: Context, repetitions: number) { /** * Deindent selected lines (including incomplete indent). * - * @keys `<` (core: normal), `<` (helix: select) + * @keys `<` (core: normal; helix: select) */ export function deindent_withIncomplete(_: Context, repetitions: number) { return deindentLines(Selections.lines(), repetitions, /* deindentIncomplete= */ true); @@ -196,7 +196,7 @@ export function case_toLower(_: Context) { /** * Transform to upper case. * - * @keys `` s-` `` (kakoune: normal), `` a-` `` (helix: normal), `` a-` `` (helix: select) + * @keys `` s-` `` (kakoune: normal), `` a-` `` (helix: normal; helix: select) */ export function case_toUpper(_: Context) { return replace((text) => text.toLocaleUpperCase()); @@ -205,7 +205,7 @@ export function case_toUpper(_: Context) { /** * Swap case. * - * @keys `` a-` `` (kakoune: normal), `` s-` `` (helix: normal), `` s-` `` (helix: select) + * @keys `` a-` `` (kakoune: normal), `` s-` `` (helix: normal; helix: select) */ export function case_swap(_: Context) { return replace((text) => { @@ -384,9 +384,9 @@ export function copyIndentation( * * #### Additional keybindings * - * | Title | Identifier | Keybinding | Commands | - * | ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | - * | Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | ------------------------------------------ | ---------------------- | ------------------------------------| --------------------------------------------------------------------------------- | + * | Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal; helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | */ export function newLine_above( _: Context, @@ -422,9 +422,9 @@ export function newLine_above( * * #### Additional keybindings * - * | Title | Identifier | Keybinding | Commands | - * | ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | - * | Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | ------------------------------------------ | ---------------------- | --------------------------------- | --------------------------------------------------------------------------------- | + * | Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal; helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | */ export function newLine_below( _: Context, diff --git a/src/commands/history.ts b/src/commands/history.ts index 1a18670f..44499dff 100644 --- a/src/commands/history.ts +++ b/src/commands/history.ts @@ -15,7 +15,7 @@ declare module "./history"; /** * Undo. * - * @keys `u` (core: normal), `u` (helix: select) + * @keys `u` (core: normal; helix: select) */ export function undo() { return vscode.commands.executeCommand("undo"); @@ -24,7 +24,7 @@ export function undo() { /** * Redo. * - * @keys `s-u` (core: normal), `s-u` (helix: select) + * @keys `s-u` (core: normal; helix: select) */ export function redo() { return vscode.commands.executeCommand("redo"); @@ -53,10 +53,10 @@ export function redo_selections() { * * @noreplay * - * | Title | Identifier | Keybinding | Commands | - * | ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | - * | Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek|select|selections)", +count }]` | - * | Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | + * | Title | Identifier | Keybinding | Commands | + * | ---------------------------- | ------------------ | ------------------------------------| ----------------------------------------------------------------------------- | + * | Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek|select|selections)", +count }]` | + * | Repeat last seek | `repeat.seek` | `a-.` (core: normal; helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | */ export async function repeat( _: Context, diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index da3a919e..cc9e5405 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -207,7 +207,7 @@ selections are empty selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.mode == 'select') selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.mode == 'select') -selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal') +selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal')Shift+0 (editorTextFocus && dance.mode == 'select') selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.mode == 'normal') selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.mode == 'select') selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.mode == 'select') @@ -276,10 +276,10 @@ Specify `all` to paste all contents next to each selection. | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | -| Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | +| Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | -| Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | -| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | +| Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | +| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | This command: @@ -293,8 +293,7 @@ This command: - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`. Default keybinding: `s-a-r` (kakoune: normal) -`s-r` (helix: normal) -`s-r` (helix: select) +`s-r` (helix: normal; helix: select) @@ -307,8 +306,7 @@ This command: - takes an argument `separator` of type `string`. Default keybinding: `a-j` (kakoune: normal) -`s-j` (helix: normal) -`s-j` (helix: select) +`s-j` (helix: normal; helix: select) @@ -320,8 +318,7 @@ Join lines and select inserted separators. This command: - takes an argument `separator` of type `string`. -Default keybinding: `s-a-j` (core: normal) -`s-a-j` (helix: select) +Default keybinding: `s-a-j` (core: normal; helix: select) @@ -333,8 +330,7 @@ Indent selected lines. This command: - may be repeated with a given number of repetitions. -Default keybinding: `>` (core: normal) -`>` (helix: select) +Default keybinding: `>` (core: normal; helix: select) @@ -370,8 +366,7 @@ Deindent selected lines (including incomplete indent). This command: - may be repeated with a given number of repetitions. -Default keybinding: `<` (core: normal) -`<` (helix: select) +Default keybinding: `<` (core: normal; helix: select) @@ -393,8 +388,7 @@ Transform to upper case. Default keybinding: `` s-` `` (kakoune: normal) -`` a-` `` (helix: normal) -`` a-` `` (helix: select) +`` a-` `` (helix: normal; helix: select) @@ -405,8 +399,7 @@ Swap case. Default keybinding: `` a-` `` (kakoune: normal) -`` s-` `` (helix: normal) -`` s-` `` (helix: select) +`` s-` `` (helix: normal; helix: select) @@ -463,9 +456,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | -| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | ------------------------------------| --------------------------------------------------------------------------------- | +| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal; helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -485,9 +478,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | -| Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | --------------------------------- | --------------------------------------------------------------------------------- | +| Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal; helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -509,8 +502,7 @@ Undo. This command: - does not require an active text editor. -Default keybinding: `u` (core: normal) -`u` (helix: select) +Default keybinding: `u` (core: normal; helix: select) @@ -522,8 +514,7 @@ Redo. This command: - does not require an active text editor. -Default keybinding: `s-u` (core: normal) -`s-u` (helix: select) +Default keybinding: `s-u` (core: normal; helix: select) @@ -556,10 +547,10 @@ Default keybinding: `s-a-u` (kakoune: normal) Repeat last change. -| Title | Identifier | Keybinding | Commands | -| ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | -| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | -| Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | +| Title | Identifier | Keybinding | Commands | +| ---------------------------- | ------------------ | ------------------------------------| ----------------------------------------------------------------------------- | +| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | +| Repeat last seek | `repeat.seek` | `a-.` (core: normal; helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | This command: - may be repeated with a given number of repetitions. @@ -811,18 +802,18 @@ Update the current counter used to repeat the next command. #### Additional keybindings -| Title | Keybinding | Command | -| ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | -| Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | -| Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | -| Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | -| Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | -| Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | -| Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | -| Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | -| Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | -| Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | -| Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | +| Title | Keybinding | Command | +| ------------------------------ | -------------------------------------------------------------------------- | ------------------------------------ | +| Add the digit 0 to the counter | `0` (core: normal; helix: select), `NumPad0` (core: normal; helix: select) | `[".updateCount", { addDigits: 0 }]` | +| Add the digit 1 to the counter | `1` (core: normal; helix: select), `NumPad1` (core: normal; helix: select) | `[".updateCount", { addDigits: 1 }]` | +| Add the digit 2 to the counter | `2` (core: normal; helix: select), `NumPad2` (core: normal; helix: select) | `[".updateCount", { addDigits: 2 }]` | +| Add the digit 3 to the counter | `3` (core: normal; helix: select), `NumPad3` (core: normal; helix: select) | `[".updateCount", { addDigits: 3 }]` | +| Add the digit 4 to the counter | `4` (core: normal; helix: select), `NumPad4` (core: normal; helix: select) | `[".updateCount", { addDigits: 4 }]` | +| Add the digit 5 to the counter | `5` (core: normal; helix: select), `NumPad5` (core: normal; helix: select) | `[".updateCount", { addDigits: 5 }]` | +| Add the digit 6 to the counter | `6` (core: normal; helix: select), `NumPad6` (core: normal; helix: select) | `[".updateCount", { addDigits: 6 }]` | +| Add the digit 7 to the counter | `7` (core: normal; helix: select), `NumPad7` (core: normal; helix: select) | `[".updateCount", { addDigits: 7 }]` | +| Add the digit 8 to the counter | `8` (core: normal; helix: select), `NumPad8` (core: normal; helix: select) | `[".updateCount", { addDigits: 8 }]` | +| Add the digit 9 to the counter | `9` (core: normal; helix: select), `NumPad9` (core: normal; helix: select) | `[".updateCount", { addDigits: 9 }]` | This command: @@ -895,20 +886,20 @@ Set Dance mode. #### Variants -| Title | Identifier | Keybinding | Command | -| ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | -| Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | -| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | -| Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | +| Title | Identifier | Keybinding | Command | +| ------------------ | ------------ | ----------------------------------------------------------- | ----------------------------------------------------------- | +| Set mode to Normal | `set.normal` | `escape` (core: insert; helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | +| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | +| Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | Other variants are provided to switch to insert mode: -| Title | Identifier | Keybinding | Commands | -| -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | -| Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------- | ------------------ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Insert before | `insert.before` | `i` (core: normal; helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert after | `insert.after` | `a` (core: normal; helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Insert at line start | `insert.lineStart` | `s-i` (core: normal; helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert at line end | `insert.lineEnd` | `s-a` (core: normal; helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | This command: @@ -1174,8 +1165,7 @@ Select whole buffer. -Default keybinding: `%` (core: normal) -`%` (helix: select) +Default keybinding: `%` (core: normal; helix: select) @@ -1195,16 +1185,16 @@ Select vertically. The following keybindings are also defined: -| Keybinding | Command | -| -------------------------------------------| ---------------------------------------------------------------------------- | -| `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | -| `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | -| `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | -| `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | -| `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | -| `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | -| `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | -| `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | +| Keybinding | Command | +| -----------------------------------| ---------------------------------------------------------------------------- | +| `c-f` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | +| `c-d` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | +| `c-b` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | +| `c-u` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | +| `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | +| `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | +| `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | +| `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | This command: - may be repeated with a given number of repetitions. @@ -1270,8 +1260,7 @@ Extend to line below. This command: - may be repeated with a given number of repetitions. -Default keybinding: `x` (helix: normal) -`x` (helix: select) +Default keybinding: `x` (helix: normal; helix: select) @@ -1405,8 +1394,7 @@ Copy selections text. This command: - accepts a register (by default, it uses `dquote`). -Default keybinding: `y` (core: normal) -`y` (helix: select) +Default keybinding: `y` (core: normal; helix: select) @@ -1470,18 +1458,17 @@ See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes #### Additional commands -| Title | Identifier | Keybinding | Commands | -| ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| Pipe and replace | `pipe.replace` | `\|` (core: normal), `\|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | -| Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | -| Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------- | -------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Pipe and replace | `pipe.replace` | `\|` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | +| Pipe and append | `pipe.append` | `!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | +| Pipe and prepend | `pipe.prepend` | `a-!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | This command: - accepts a register (by default, it uses `pipe`). - takes an input `expression` of type `string`. -Default keybinding: `a-|` (core: normal) -`a-|` (helix: select) +Default keybinding: `a-|` (core: normal; helix: select) @@ -1491,12 +1478,12 @@ Filter selections. #### Variants -| Title | Identifier | Keybinding | Commands | -| -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | -| Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | -| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | -| Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | -| Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------------- | ----------------------- | ------------------------------------- | ------------------------------------------------------------------------ | +| Keep matching selections | `filter.regexp` | `a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | +| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | +| Clear secondary selections | `clear.secondary` | `,` (core: normal; helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | +| Clear main selections | `clear.main` | `a-,` (core: normal; helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | This command: - accepts an argument of type `{ expression?: string }`. @@ -1505,8 +1492,7 @@ This command: - takes an argument `interactive` of type `boolean`. - takes an argument `inverse` of type `boolean`. -Default keybinding: `$` (core: normal) -`$` (helix: select) +Default keybinding: `$` (core: normal; helix: select) @@ -1516,9 +1502,9 @@ Select within selections. #### Variants -| Title | Identifier | Keybinding | Command | -| -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | -| Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| -------------- | --------------- | --------------------------------- | ------------------------------------------------------------------------------------------------- | +| Leap or select | `select.orLeap` | `s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | This command: - accepts an argument of type `{ re?: string | RegExp }`. @@ -1536,8 +1522,7 @@ This command: - takes an argument `excludeEmpty` of type `boolean`. - takes an argument `interactive` of type `boolean`. -Default keybinding: `s-s` (core: normal) -`s-s` (helix: select) +Default keybinding: `s-s` (core: normal; helix: select) @@ -1547,9 +1532,9 @@ Split selections at line boundaries. #### Variants -| Title | Identifier | Keybinding | Command | -| ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------- | ---------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | This command: - may be repeated with a given number of repetitions. @@ -1566,8 +1551,7 @@ Expand selections to contain full lines (including end-of-line characters). Default keybinding: `x` (kakoune: normal) -`s-x` (helix: normal) -`s-x` (helix: select) +`s-x` (helix: normal; helix: select) @@ -1579,8 +1563,7 @@ Trim selections to only contain full lines (from start to line break). -Default keybinding: `a-x` (core: normal) -`a-x` (helix: select) +Default keybinding: `a-x` (core: normal; helix: select) @@ -1592,8 +1575,7 @@ Trim whitespace at beginning and end of selections. -Default keybinding: `_` (core: normal) -`_` (helix: select) +Default keybinding: `_` (core: normal; helix: select) @@ -1613,8 +1595,7 @@ This command: - takes an argument `empty` of type `boolean`. - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | "both"`. -Default keybinding: `;` (core: normal) -`;` (helix: select) +Default keybinding: `;` (core: normal; helix: select) @@ -1632,8 +1613,7 @@ Change direction of selections. | Backward selections | `faceBackward` | | `[".selections.changeDirection", { direction: -1 }]` | -Default keybinding: `a-;` (core: normal) -`a-;` (helix: select) +Default keybinding: `a-;` (core: normal; helix: select) @@ -1669,15 +1649,14 @@ Copy selections below. #### Variant -| Title | Identifier | Keybinding | Command | -| --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | -| Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | +| Title | Identifier | Keybinding | Command | +| --------------------- | ------------ | ------------------------------------- | ----------------------------------------- | +| Copy selections above | `copy.above` | `s-a-c` (core: normal; helix: select) | `[".selections.copy", { direction: -1 }]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `s-c` (core: normal) -`s-c` (helix: select) +Default keybinding: `s-c` (core: normal; helix: select) @@ -1713,8 +1692,7 @@ This command: - takes an argument `display` of type `boolean | undefined`. - takes an argument `until` of type `AutoDisposable.Event[]`. -Default keybinding: `enter` (core: normal) -`enter` (helix: select) +Default keybinding: `enter` (core: normal; helix: select) ## [`selections.rotate`](../selections.rotate.ts) @@ -1748,16 +1726,15 @@ Rotate selections clockwise (contents only). The following command is also available: -| Title | Identifier | Keybinding | Command | -| --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | -| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| --------------------------------------------------- | ------------------ | ------------------------------------ | ---------------------------------------------------- | +| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal; helix: select) | `[".selections.rotate.contents", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. -Default keybinding: `a-)` (helix: normal) -`a-)` (helix: select) +Default keybinding: `a-)` (helix: normal; helix: select) @@ -1768,15 +1745,15 @@ Rotate selections clockwise (selections only). The following keybinding is also available: -| Title | Identifier | Keybinding | Command | -| ----------------------------------------------------- | -------------------- | --------------------------------------- | ------------------------------------------------------ | -| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal), `(` (helix: select) | `[".selections.rotate.selections", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------------------------------------- | -------------------- | --------------------------------- | ------------------------------------------------------ | +| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal; helix: select) | `[".selections.rotate.selections", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. -Default keybinding: `)` (core: normal) +Default keybinding: `)` (core: normal; helix: select) ## [`view`](../view.ts) @@ -1784,10 +1761,10 @@ Moving the editor view. #### Predefined keybindings -| Title | Keybinding | Command | -| ----------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- | -| Show view menu | `v` (kakoune: normal), `z` (helix: normal), `z` (helix: select) | `[".openMenu", { menu: "view", ... }]` | -| Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal), `s-z` (helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | +| Title | Keybinding | Command | +| ----------------------- | ------------------------------------------------------------- | ---------------------------------------------------- | +| Show view menu | `v` (kakoune: normal), `z` (helix: normal; helix: select) | `[".openMenu", { menu: "view", ... }]` | +| Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal; helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index 4b6ec635..08eac5c5 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -207,7 +207,7 @@ selections are empty selections.trimWhitespaceTrim whitespaceShift+- (editorTextFocus && dance.mode == 'normal')Shift+- (editorTextFocus && dance.mode == 'select') selections.rotateselections.rotate.bothRotate selections clockwiseShift+Alt+0 (editorTextFocus && dance.mode == 'normal') selections.rotate.contentsRotate selections clockwise (contents only)Shift+Alt+0 (editorTextFocus && dance.mode == 'normal')Shift+Alt+0 (editorTextFocus && dance.mode == 'select') -selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal') +selections.rotate.selectionsRotate selections clockwise (selections only)Shift+0 (editorTextFocus && dance.mode == 'normal')Shift+0 (editorTextFocus && dance.mode == 'select') selections.rotate.both.reverseRotate selections counter-clockwiseShift+Alt+9 (editorTextFocus && dance.mode == 'normal') selections.rotate.contents.reverseRotate selections counter-clockwise (contents only)Shift+Alt+9 (editorTextFocus && dance.mode == 'normal')Shift+Alt+9 (editorTextFocus && dance.mode == 'select') selections.rotate.selections.reverseRotate selections counter-clockwise (selections only)Shift+9 (editorTextFocus && dance.mode == 'normal')Shift+9 (editorTextFocus && dance.mode == 'select') @@ -276,10 +276,10 @@ Specify `all` to paste all contents next to each selection. | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | -| Delete | `delete` | `a-d` (core: normal), `a-d` (helix: select) | `[".edit.insert", { register: "_", ... }]` | +| Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | -| Copy and delete | `yank-delete` | `d` (core: normal), `d` (helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | -| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal), `c` (helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | +| Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | +| Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | This command: @@ -293,8 +293,7 @@ This command: - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`. Default keybinding: `s-a-r` (kakoune: normal) -`s-r` (helix: normal) -`s-r` (helix: select) +`s-r` (helix: normal; helix: select) @@ -307,8 +306,7 @@ This command: - takes an argument `separator` of type `string`. Default keybinding: `a-j` (kakoune: normal) -`s-j` (helix: normal) -`s-j` (helix: select) +`s-j` (helix: normal; helix: select) @@ -320,8 +318,7 @@ Join lines and select inserted separators. This command: - takes an argument `separator` of type `string`. -Default keybinding: `s-a-j` (core: normal) -`s-a-j` (helix: select) +Default keybinding: `s-a-j` (core: normal; helix: select) @@ -333,8 +330,7 @@ Indent selected lines. This command: - may be repeated with a given number of repetitions. -Default keybinding: `>` (core: normal) -`>` (helix: select) +Default keybinding: `>` (core: normal; helix: select) @@ -370,8 +366,7 @@ Deindent selected lines (including incomplete indent). This command: - may be repeated with a given number of repetitions. -Default keybinding: `<` (core: normal) -`<` (helix: select) +Default keybinding: `<` (core: normal; helix: select) @@ -393,8 +388,7 @@ Transform to upper case. Default keybinding: `` s-` `` (kakoune: normal) -`` a-` `` (helix: normal) -`` a-` `` (helix: select) +`` a-` `` (helix: normal; helix: select) @@ -405,8 +399,7 @@ Swap case. Default keybinding: `` a-` `` (kakoune: normal) -`` s-` `` (helix: normal) -`` s-` `` (helix: select) +`` s-` `` (helix: normal; helix: select) @@ -463,9 +456,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | ------------------------------------------- | --------------------------------------------------------------------------------- | -| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal), `s-o` (helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | ------------------------------------| --------------------------------------------------------------------------------- | +| Insert new line above and switch to insert | `newLine.above.insert` | `s-o` (core: normal; helix: select) | `[".edit.newLine.above", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -485,9 +478,9 @@ keep the current selections. #### Additional keybindings -| Title | Identifier | Keybinding | Commands | -| ------------------------------------------ | ---------------------- | --------------------------------------- | --------------------------------------------------------------------------------- | -| Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal), `o` (helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------------------------------ | ---------------------- | --------------------------------- | --------------------------------------------------------------------------------- | +| Insert new line below and switch to insert | `newLine.below.insert` | `o` (core: normal; helix: select) | `[".edit.newLine.below", { shift: "select" }], [".modes.insert.before", { ... }]` | This command: - may be repeated with a given number of repetitions. @@ -509,8 +502,7 @@ Undo. This command: - does not require an active text editor. -Default keybinding: `u` (core: normal) -`u` (helix: select) +Default keybinding: `u` (core: normal; helix: select) @@ -522,8 +514,7 @@ Redo. This command: - does not require an active text editor. -Default keybinding: `s-u` (core: normal) -`s-u` (helix: select) +Default keybinding: `s-u` (core: normal; helix: select) @@ -556,10 +547,10 @@ Default keybinding: `s-a-u` (kakoune: normal) Repeat last change. -| Title | Identifier | Keybinding | Commands | -| ---------------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | -| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | -| Repeat last seek | `repeat.seek` | `a-.` (core: normal), `a-.` (helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | +| Title | Identifier | Keybinding | Commands | +| ---------------------------- | ------------------ | ------------------------------------| ----------------------------------------------------------------------------- | +| Repeat last selection change | `repeat.selection` | | `[".history.repeat", { filter: "dance\\.(seek\|select\|selections)", +count }]` | +| Repeat last seek | `repeat.seek` | `a-.` (core: normal; helix: select) | `[".history.repeat", { filter: "dance\\.seek", +count }]` | This command: - may be repeated with a given number of repetitions. @@ -811,18 +802,18 @@ Update the current counter used to repeat the next command. #### Additional keybindings -| Title | Keybinding | Command | -| ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | -| Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | -| Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | -| Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | -| Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | -| Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | -| Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | -| Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | -| Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | -| Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | -| Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | +| Title | Keybinding | Command | +| ------------------------------ | -------------------------------------------------------------------------- | ------------------------------------ | +| Add the digit 0 to the counter | `0` (core: normal; helix: select), `NumPad0` (core: normal; helix: select) | `[".updateCount", { addDigits: 0 }]` | +| Add the digit 1 to the counter | `1` (core: normal; helix: select), `NumPad1` (core: normal; helix: select) | `[".updateCount", { addDigits: 1 }]` | +| Add the digit 2 to the counter | `2` (core: normal; helix: select), `NumPad2` (core: normal; helix: select) | `[".updateCount", { addDigits: 2 }]` | +| Add the digit 3 to the counter | `3` (core: normal; helix: select), `NumPad3` (core: normal; helix: select) | `[".updateCount", { addDigits: 3 }]` | +| Add the digit 4 to the counter | `4` (core: normal; helix: select), `NumPad4` (core: normal; helix: select) | `[".updateCount", { addDigits: 4 }]` | +| Add the digit 5 to the counter | `5` (core: normal; helix: select), `NumPad5` (core: normal; helix: select) | `[".updateCount", { addDigits: 5 }]` | +| Add the digit 6 to the counter | `6` (core: normal; helix: select), `NumPad6` (core: normal; helix: select) | `[".updateCount", { addDigits: 6 }]` | +| Add the digit 7 to the counter | `7` (core: normal; helix: select), `NumPad7` (core: normal; helix: select) | `[".updateCount", { addDigits: 7 }]` | +| Add the digit 8 to the counter | `8` (core: normal; helix: select), `NumPad8` (core: normal; helix: select) | `[".updateCount", { addDigits: 8 }]` | +| Add the digit 9 to the counter | `9` (core: normal; helix: select), `NumPad9` (core: normal; helix: select) | `[".updateCount", { addDigits: 9 }]` | This command: @@ -895,20 +886,20 @@ Set Dance mode. #### Variants -| Title | Identifier | Keybinding | Command | -| ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | -| Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | -| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | -| Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | +| Title | Identifier | Keybinding | Command | +| ------------------ | ------------ | ----------------------------------------------------------- | ----------------------------------------------------------- | +| Set mode to Normal | `set.normal` | `escape` (core: insert; helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | +| Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | +| Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | Other variants are provided to switch to insert mode: -| Title | Identifier | Keybinding | Commands | -| -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | -| Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | -| Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------- | ------------------ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Insert before | `insert.before` | `i` (core: normal; helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert after | `insert.after` | `a` (core: normal; helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | +| Insert at line start | `insert.lineStart` | `s-i` (core: normal; helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | +| Insert at line end | `insert.lineEnd` | `s-a` (core: normal; helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | This command: @@ -1174,8 +1165,7 @@ Select whole buffer. -Default keybinding: `%` (core: normal) -`%` (helix: select) +Default keybinding: `%` (core: normal; helix: select) @@ -1195,16 +1185,16 @@ Select vertically. The following keybindings are also defined: -| Keybinding | Command | -| -------------------------------------------| ---------------------------------------------------------------------------- | -| `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | -| `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | -| `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | -| `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | -| `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | -| `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | -| `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | -| `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | +| Keybinding | Command | +| -----------------------------------| ---------------------------------------------------------------------------- | +| `c-f` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | +| `c-d` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | +| `c-b` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | +| `c-u` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | +| `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | +| `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | +| `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | +| `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | This command: - may be repeated with a given number of repetitions. @@ -1270,8 +1260,7 @@ Extend to line below. This command: - may be repeated with a given number of repetitions. -Default keybinding: `x` (helix: normal) -`x` (helix: select) +Default keybinding: `x` (helix: normal; helix: select) @@ -1405,8 +1394,7 @@ Copy selections text. This command: - accepts a register (by default, it uses `dquote`). -Default keybinding: `y` (core: normal) -`y` (helix: select) +Default keybinding: `y` (core: normal; helix: select) @@ -1470,18 +1458,17 @@ See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes #### Additional commands -| Title | Identifier | Keybinding | Commands | -| ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| Pipe and replace | `pipe.replace` | `\|` (core: normal), `\|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | -| Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | -| Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | +| Title | Identifier | Keybinding | Commands | +| ------------------- | -------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Pipe and replace | `pipe.replace` | `\|` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", ... }]` | +| Pipe and append | `pipe.append` | `!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "end" , shift: "select", ... }]` | +| Pipe and prepend | `pipe.prepend` | `a-!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "\|", where: "start", shift: "select", ... }]` | This command: - accepts a register (by default, it uses `pipe`). - takes an input `expression` of type `string`. -Default keybinding: `a-|` (core: normal) -`a-|` (helix: select) +Default keybinding: `a-|` (core: normal; helix: select) @@ -1491,12 +1478,12 @@ Filter selections. #### Variants -| Title | Identifier | Keybinding | Commands | -| -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | -| Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | -| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | -| Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | -| Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | +| Title | Identifier | Keybinding | Commands | +| -------------------------- | ----------------------- | ------------------------------------- | ------------------------------------------------------------------------ | +| Keep matching selections | `filter.regexp` | `a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | +| Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | +| Clear secondary selections | `clear.secondary` | `,` (core: normal; helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | +| Clear main selections | `clear.main` | `a-,` (core: normal; helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | This command: - accepts an argument of type `{ expression?: string }`. @@ -1505,8 +1492,7 @@ This command: - takes an argument `interactive` of type `boolean`. - takes an argument `inverse` of type `boolean`. -Default keybinding: `$` (core: normal) -`$` (helix: select) +Default keybinding: `$` (core: normal; helix: select) @@ -1516,9 +1502,9 @@ Select within selections. #### Variants -| Title | Identifier | Keybinding | Command | -| -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | -| Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| -------------- | --------------- | --------------------------------- | ------------------------------------------------------------------------------------------------- | +| Leap or select | `select.orLeap` | `s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | This command: - accepts an argument of type `{ re?: string | RegExp }`. @@ -1536,8 +1522,7 @@ This command: - takes an argument `excludeEmpty` of type `boolean`. - takes an argument `interactive` of type `boolean`. -Default keybinding: `s-s` (core: normal) -`s-s` (helix: select) +Default keybinding: `s-s` (core: normal; helix: select) @@ -1547,9 +1532,9 @@ Split selections at line boundaries. #### Variants -| Title | Identifier | Keybinding | Command | -| ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------- | ---------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | This command: - may be repeated with a given number of repetitions. @@ -1566,8 +1551,7 @@ Expand selections to contain full lines (including end-of-line characters). Default keybinding: `x` (kakoune: normal) -`s-x` (helix: normal) -`s-x` (helix: select) +`s-x` (helix: normal; helix: select) @@ -1579,8 +1563,7 @@ Trim selections to only contain full lines (from start to line break). -Default keybinding: `a-x` (core: normal) -`a-x` (helix: select) +Default keybinding: `a-x` (core: normal; helix: select) @@ -1592,8 +1575,7 @@ Trim whitespace at beginning and end of selections. -Default keybinding: `_` (core: normal) -`_` (helix: select) +Default keybinding: `_` (core: normal; helix: select) @@ -1613,8 +1595,7 @@ This command: - takes an argument `empty` of type `boolean`. - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | "both"`. -Default keybinding: `;` (core: normal) -`;` (helix: select) +Default keybinding: `;` (core: normal; helix: select) @@ -1632,8 +1613,7 @@ Change direction of selections. | Backward selections | `faceBackward` | | `[".selections.changeDirection", { direction: -1 }]` | -Default keybinding: `a-;` (core: normal) -`a-;` (helix: select) +Default keybinding: `a-;` (core: normal; helix: select) @@ -1669,15 +1649,14 @@ Copy selections below. #### Variant -| Title | Identifier | Keybinding | Command | -| --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | -| Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | +| Title | Identifier | Keybinding | Command | +| --------------------- | ------------ | ------------------------------------- | ----------------------------------------- | +| Copy selections above | `copy.above` | `s-a-c` (core: normal; helix: select) | `[".selections.copy", { direction: -1 }]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `s-c` (core: normal) -`s-c` (helix: select) +Default keybinding: `s-c` (core: normal; helix: select) @@ -1713,8 +1692,7 @@ This command: - takes an argument `display` of type `boolean | undefined`. - takes an argument `until` of type `AutoDisposable.Event[]`. -Default keybinding: `enter` (core: normal) -`enter` (helix: select) +Default keybinding: `enter` (core: normal; helix: select) ## [`selections.rotate`](../selections.rotate.ts) @@ -1748,16 +1726,15 @@ Rotate selections clockwise (contents only). The following command is also available: -| Title | Identifier | Keybinding | Command | -| --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | -| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| --------------------------------------------------- | ------------------ | ------------------------------------ | ---------------------------------------------------- | +| Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal; helix: select) | `[".selections.rotate.contents", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. -Default keybinding: `a-)` (helix: normal) -`a-)` (helix: select) +Default keybinding: `a-)` (helix: normal; helix: select) @@ -1768,15 +1745,15 @@ Rotate selections clockwise (selections only). The following keybinding is also available: -| Title | Identifier | Keybinding | Command | -| ----------------------------------------------------- | -------------------- | --------------------------------------- | ------------------------------------------------------ | -| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal), `(` (helix: select) | `[".selections.rotate.selections", { reverse: true }]` | +| Title | Identifier | Keybinding | Command | +| ----------------------------------------------------- | -------------------- | --------------------------------- | ------------------------------------------------------ | +| Rotate selections counter-clockwise (selections only) | `selections.reverse` | `(` (core: normal; helix: select) | `[".selections.rotate.selections", { reverse: true }]` | This command: - may be repeated with a given number of repetitions. - takes an argument `reverse` of type `boolean`. -Default keybinding: `)` (core: normal) +Default keybinding: `)` (core: normal; helix: select) ## [`view`](../view.ts) @@ -1784,10 +1761,10 @@ Moving the editor view. #### Predefined keybindings -| Title | Keybinding | Command | -| ----------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- | -| Show view menu | `v` (kakoune: normal), `z` (helix: normal), `z` (helix: select) | `[".openMenu", { menu: "view", ... }]` | -| Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal), `s-z` (helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | +| Title | Keybinding | Command | +| ----------------------- | ------------------------------------------------------------- | ---------------------------------------------------- | +| Show view menu | `v` (kakoune: normal), `z` (helix: normal; helix: select) | `[".openMenu", { menu: "view", ... }]` | +| Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal; helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | diff --git a/src/commands/misc.ts b/src/commands/misc.ts index 7bb49301..dfee5eca 100644 --- a/src/commands/misc.ts +++ b/src/commands/misc.ts @@ -256,18 +256,18 @@ export async function updateRegister( * * #### Additional keybindings * - * | Title | Keybinding | Command | - * | ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | - * | Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | - * | Add the digit 1 to the counter | `1` (core: normal), `NumPad1` (core: normal), `1` (helix: select), `NumPad1` (helix: select) | `[".updateCount", { addDigits: 1 }]` | - * | Add the digit 2 to the counter | `2` (core: normal), `NumPad2` (core: normal), `2` (helix: select), `NumPad2` (helix: select) | `[".updateCount", { addDigits: 2 }]` | - * | Add the digit 3 to the counter | `3` (core: normal), `NumPad3` (core: normal), `3` (helix: select), `NumPad3` (helix: select) | `[".updateCount", { addDigits: 3 }]` | - * | Add the digit 4 to the counter | `4` (core: normal), `NumPad4` (core: normal), `4` (helix: select), `NumPad4` (helix: select) | `[".updateCount", { addDigits: 4 }]` | - * | Add the digit 5 to the counter | `5` (core: normal), `NumPad5` (core: normal), `5` (helix: select), `NumPad5` (helix: select) | `[".updateCount", { addDigits: 5 }]` | - * | Add the digit 6 to the counter | `6` (core: normal), `NumPad6` (core: normal), `6` (helix: select), `NumPad6` (helix: select) | `[".updateCount", { addDigits: 6 }]` | - * | Add the digit 7 to the counter | `7` (core: normal), `NumPad7` (core: normal), `7` (helix: select), `NumPad7` (helix: select) | `[".updateCount", { addDigits: 7 }]` | - * | Add the digit 8 to the counter | `8` (core: normal), `NumPad8` (core: normal), `8` (helix: select), `NumPad8` (helix: select) | `[".updateCount", { addDigits: 8 }]` | - * | Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal), `9` (helix: select), `NumPad9` (helix: select) | `[".updateCount", { addDigits: 9 }]` | + * | Title | Keybinding | Command | + * | ------------------------------ | -------------------------------------------------------------------------- | ------------------------------------ | + * | Add the digit 0 to the counter | `0` (core: normal; helix: select), `NumPad0` (core: normal; helix: select) | `[".updateCount", { addDigits: 0 }]` | + * | Add the digit 1 to the counter | `1` (core: normal; helix: select), `NumPad1` (core: normal; helix: select) | `[".updateCount", { addDigits: 1 }]` | + * | Add the digit 2 to the counter | `2` (core: normal; helix: select), `NumPad2` (core: normal; helix: select) | `[".updateCount", { addDigits: 2 }]` | + * | Add the digit 3 to the counter | `3` (core: normal; helix: select), `NumPad3` (core: normal; helix: select) | `[".updateCount", { addDigits: 3 }]` | + * | Add the digit 4 to the counter | `4` (core: normal; helix: select), `NumPad4` (core: normal; helix: select) | `[".updateCount", { addDigits: 4 }]` | + * | Add the digit 5 to the counter | `5` (core: normal; helix: select), `NumPad5` (core: normal; helix: select) | `[".updateCount", { addDigits: 5 }]` | + * | Add the digit 6 to the counter | `6` (core: normal; helix: select), `NumPad6` (core: normal; helix: select) | `[".updateCount", { addDigits: 6 }]` | + * | Add the digit 7 to the counter | `7` (core: normal; helix: select), `NumPad7` (core: normal; helix: select) | `[".updateCount", { addDigits: 7 }]` | + * | Add the digit 8 to the counter | `8` (core: normal; helix: select), `NumPad8` (core: normal; helix: select) | `[".updateCount", { addDigits: 8 }]` | + * | Add the digit 9 to the counter | `9` (core: normal; helix: select), `NumPad9` (core: normal; helix: select) | `[".updateCount", { addDigits: 9 }]` | * * @noreplay */ diff --git a/src/commands/modes.ts b/src/commands/modes.ts index 2cd42c99..9c491e82 100644 --- a/src/commands/modes.ts +++ b/src/commands/modes.ts @@ -11,20 +11,20 @@ declare module "./modes"; * * #### Variants * - * | Title | Identifier | Keybinding | Command | - * | ------------------ | ------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------- | - * | Set mode to Normal | `set.normal` | `escape` (core: insert), `escape` (helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | - * | Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | - * | Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | + * | Title | Identifier | Keybinding | Command | + * | ------------------ | ------------ | ----------------------------------------------------------- | ----------------------------------------------------------- | + * | Set mode to Normal | `set.normal` | `escape` (core: insert; helix: select), `v` (helix: select) | `[".modes.set", { mode: "normal" }], ["hideSuggestWidget"]` | + * | Set mode to Insert | `set.insert` | | `[".modes.set", { mode: "insert" }]` | + * | Set mode to Select | `set.select` | `v` (helix: normal) | `[".modes.set", { mode: "select" }]` | * * Other variants are provided to switch to insert mode: * - * | Title | Identifier | Keybinding | Commands | - * | -------------------- | ------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - * | Insert before | `insert.before` | `i` (core: normal), `i` (helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | - * | Insert after | `insert.after` | `a` (core: normal), `a` (helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | - * | Insert at line start | `insert.lineStart` | `s-i` (core: normal), `s-i` (helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | - * | Insert at line end | `insert.lineEnd` | `s-a` (core: normal), `s-a` (helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | -------------------- | ------------------ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + * | Insert before | `insert.before` | `i` (core: normal; helix: select) | `[".selections.faceBackward", { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | + * | Insert after | `insert.after` | `a` (core: normal; helix: select) | `[".selections.faceForward" , { record: false }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | + * | Insert at line start | `insert.lineStart` | `s-i` (core: normal; helix: select) | `[".select.lineStart", { shift: "jump", skipBlank: true }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "start", record: false, empty: true, ... }]` | + * | Insert at line end | `insert.lineEnd` | `s-a` (core: normal; helix: select) | `[".select.lineEnd" , { shift: "jump" }], [".modes.set", { mode: "insert", +mode }], [".selections.reduce", { where: "end" , record: false, empty: true, ... }]` | * * @noreplay */ diff --git a/src/commands/select.ts b/src/commands/select.ts index 620a259f..67642c6f 100644 --- a/src/commands/select.ts +++ b/src/commands/select.ts @@ -13,7 +13,7 @@ declare module "./select"; /** * Select whole buffer. * - * @keys `%` (core: normal), `%` (helix: select) + * @keys `%` (core: normal; helix: select) */ export function buffer(_: Context) { Selections.set([Selections.wholeBuffer()]); @@ -45,16 +45,16 @@ const preferredColumnsToken = * * The following keybindings are also defined: * - * | Keybinding | Command | - * | -------------------------------------------| ---------------------------------------------------------------------------- | - * | `c-f` (core: normal), `c-f` (core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | - * | `c-d` (core: normal), `c-d` (core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | - * | `c-b` (core: normal), `c-b` (core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | - * | `c-u` (core: normal), `c-u` (core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | - * | `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | - * | `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | - * | `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | - * | `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | + * | Keybinding | Command | + * | -----------------------------------| ---------------------------------------------------------------------------- | + * | `c-f` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "page" , shift: "jump" }]` | + * | `c-d` (core: normal; core: insert) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "jump" }]` | + * | `c-b` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "page" , shift: "jump" }]` | + * | `c-u` (core: normal; core: insert) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "jump" }]` | + * | `c-f` (helix: select) | `[".select.vertically", { direction: 1, by: "page" , shift: "extend" }]` | + * | `c-d` (helix: select) | `[".select.vertically", { direction: 1, by: "halfPage", shift: "extend" }]` | + * | `c-b` (helix: select) | `[".select.vertically", { direction: -1, by: "page" , shift: "extend" }]` | + * | `c-u` (helix: select) | `[".select.vertically", { direction: -1, by: "halfPage", shift: "extend" }]` | */ export function vertically( _: Context, @@ -346,7 +346,7 @@ export function line_below(_: Context, count: number) { /** * Extend to line below. * - * @keys `x` (helix: normal), `x` (helix: select) + * @keys `x` (helix: normal; helix: select) */ export function line_below_extend(_: Context, count: number) { if (count === 0 || count === 1) { diff --git a/src/commands/selections.rotate.ts b/src/commands/selections.rotate.ts index 36b40267..c7ba01e0 100644 --- a/src/commands/selections.rotate.ts +++ b/src/commands/selections.rotate.ts @@ -28,13 +28,13 @@ export function both(_: Context, repetitions: number, reverse: Argument /** * Rotate selections clockwise (contents only). * - * @keys `a-)` (helix: normal), `a-)` (helix: select) + * @keys `a-)` (helix: normal; helix: select) * * The following command is also available: * - * | Title | Identifier | Keybinding | Command | - * | --------------------------------------------------- | ------------------ | -------------------------------------------- | ---------------------------------------------------- | - * | Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal), `a-(` (helix: select) | `[".selections.rotate.contents", { reverse: true }]` | + * | Title | Identifier | Keybinding | Command | + * | --------------------------------------------------- | ------------------ | ------------------------------------ | ---------------------------------------------------- | + * | Rotate selections counter-clockwise (contents only) | `contents.reverse` | `a-(` (helix: normal; helix: select) | `[".selections.rotate.contents", { reverse: true }]` | */ export function contents(_: Context, repetitions: number, reverse: Argument = false) { if (reverse) { @@ -47,13 +47,13 @@ export function contents(_: Context, repetitions: number, reverse: Argument = false) { if (reverse) { diff --git a/src/commands/selections.ts b/src/commands/selections.ts index 0eaee934..f9842622 100644 --- a/src/commands/selections.ts +++ b/src/commands/selections.ts @@ -21,7 +21,7 @@ declare module "./selections"; /** * Copy selections text. * - * @keys `y` (core: normal), `y` (helix: select) + * @keys `y` (core: normal; helix: select) */ export function saveText( document: vscode.TextDocument, @@ -244,16 +244,16 @@ const pipeHistory: string[] = []; * Run the specified command or code with the contents of each selection, and * save the result to a register. * - * @keys `a-|` (core: normal), `a-|` (helix: select) + * @keys `a-|` (core: normal; helix: select) * See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes-through-external-programs * * #### Additional commands * - * | Title | Identifier | Keybinding | Commands | - * | ------------------- | -------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | - * | Pipe and replace | `pipe.replace` | `|` (core: normal), `|` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", ... }]` | - * | Pipe and append | `pipe.append` | `!` (core: normal), `!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "end" , shift: "select", ... }]` | - * | Pipe and prepend | `pipe.prepend` | `a-!` (core: normal), `a-!` (helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "start", shift: "select", ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | ------------------- | -------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | + * | Pipe and replace | `pipe.replace` | `|` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", ... }]` | + * | Pipe and append | `pipe.append` | `!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "end" , shift: "select", ... }]` | + * | Pipe and prepend | `pipe.prepend` | `a-!` (core: normal; helix: select) | `[".selections.pipe", { +expression,register }], [".edit.insert", { register: "|", where: "start", shift: "select", ... }]` | */ export async function pipe( _: Context, @@ -290,15 +290,15 @@ const filterHistory: string[] = []; /** * Filter selections. * - * @keys `$` (core: normal), `$` (helix: select) + * @keys `$` (core: normal; helix: select) * #### Variants * - * | Title | Identifier | Keybinding | Commands | - * | -------------------------- | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | - * | Keep matching selections | `filter.regexp` | `a-k` (core: normal), `a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | - * | Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal), `s-a-k` (helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | - * | Clear secondary selections | `clear.secondary` | `,` (core: normal), `,` (helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | - * | Clear main selections | `clear.main` | `a-,` (core: normal), `a-,` (helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | + * | Title | Identifier | Keybinding | Commands | + * | -------------------------- | ----------------------- | ------------------------------------- | ------------------------------------------------------------------------ | + * | Keep matching selections | `filter.regexp` | `a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/" , ... }]` | + * | Clear matching selections | `filter.regexp.inverse` | `s-a-k` (core: normal; helix: select) | `[".selections.filter", { defaultExpression: "/", inverse: true, ... }]` | + * | Clear secondary selections | `clear.secondary` | `,` (core: normal; helix: select) | `[".selections.filter", { expression: "i === count" , ... }]` | + * | Clear main selections | `clear.main` | `a-,` (core: normal; helix: select) | `[".selections.filter", { expression: "i !== count" , ... }]` | */ export function filter( _: Context, @@ -346,9 +346,9 @@ export function filter( * * #### Variants * - * | Title | Identifier | Keybinding | Command | - * | -------------- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------- | - * | Leap or select | `select.orLeap` | `s` (core: normal), `s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | + * | Title | Identifier | Keybinding | Command | + * | -------------- | --------------- | --------------------------------- | ------------------------------------------------------------------------------------------------- | + * | Leap or select | `select.orLeap` | `s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { ... }]], otherwise: [[".selections.select", { ... }]] }]` | */ export function select( _: Context, @@ -377,7 +377,7 @@ export function select( /** * Split selections. * - * @keys `s-s` (core: normal), `s-s` (helix: select) + * @keys `s-s` (core: normal; helix: select) */ export function split( _: Context, @@ -415,9 +415,9 @@ export function split( * * #### Variants * - * | Title | Identifier | Keybinding | Command | - * | ----------------------- | ---------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | - * | Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal), `a-s` (helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | + * | Title | Identifier | Keybinding | Command | + * | ----------------------- | ---------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------- | + * | Leap or select backward | `splitLines.orLeap.backward` | `a-s` (core: normal; helix: select) | `[".ifEmpty", { then: [[".seek.leap", { direction: -1, ... }]], otherwise: [[".selections.splitLines", { ... }]] }]` | */ export function splitLines( _: Context, @@ -474,7 +474,7 @@ export function splitLines( * * Expand selections to contain full lines (including end-of-line characters). * - * @keys `x` (kakoune: normal), `s-x` (helix: normal), `s-x` (helix: select) + * @keys `x` (kakoune: normal), `s-x` (helix: normal; helix: select) */ export function expandToLines(_: Context) { return Selections.updateByIndex((_i, selection, document) => { @@ -508,7 +508,7 @@ export function expandToLines(_: Context) { * * Trim selections to only contain full lines (from start to line break). * - * @keys `a-x` (core: normal), `a-x` (helix: select) + * @keys `a-x` (core: normal; helix: select) */ export function trimLines(_: Context) { return Selections.updateByIndex((_, selection) => { @@ -540,7 +540,7 @@ export function trimLines(_: Context) { * * Trim whitespace at beginning and end of selections. * - * @keys `_` (core: normal), `_` (helix: select) + * @keys `_` (core: normal; helix: select) */ export function trimWhitespace(_: Context) { const blank = getCharacters(CharSet.Blank, _.document), @@ -567,7 +567,7 @@ export function trimWhitespace(_: Context) { * @param where Which edge each selection should be reduced to; defaults to * "active". * - * @keys `;` (core: normal), `;` (helix: select) + * @keys `;` (core: normal; helix: select) * * #### Variant * @@ -648,7 +648,7 @@ export function reduce( * @param direction If unspecified, flips each direction. Otherwise, ensures * that all selections face the given direction. * - * @keys `a-;` (core: normal), `a-;` (helix: select) + * @keys `a-;` (core: normal; helix: select) * * #### Variants * @@ -797,13 +797,13 @@ export async function sort( /** * Copy selections below. * - * @keys `s-c` (core: normal), `s-c` (helix: select) + * @keys `s-c` (core: normal; helix: select) * * #### Variant * - * | Title | Identifier | Keybinding | Command | - * | --------------------- | ------------ | -------------------------------------------------- | ----------------------------------------- | - * | Copy selections above | `copy.above` | `s-a-c` (kakoune: normal), `s-a-c` (helix: select) | `[".selections.copy", { direction: -1 }]` | + * | Title | Identifier | Keybinding | Command | + * | --------------------- | ------------ | ------------------------------------- | ----------------------------------------- | + * | Copy selections above | `copy.above` | `s-a-c` (core: normal; helix: select) | `[".selections.copy", { direction: -1 }]` | */ export function copy( _: Context, @@ -874,7 +874,7 @@ const indicesToken = PerEditorState.registerState(/* isDisposabl /** * Toggle selection indices. * - * @keys `enter` (core: normal), `enter` (helix: select) + * @keys `enter` (core: normal; helix: select) * * #### Variants * diff --git a/src/commands/view.ts b/src/commands/view.ts index 2bccc51b..76c5e3e4 100644 --- a/src/commands/view.ts +++ b/src/commands/view.ts @@ -8,10 +8,10 @@ import { Context, Selections } from "../api"; * * #### Predefined keybindings * - * | Title | Keybinding | Command | - * | ----------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- | - * | Show view menu | `v` (kakoune: normal), `z` (helix: normal), `z` (helix: select) | `[".openMenu", { menu: "view", ... }]` | - * | Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal), `s-z` (helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | + * | Title | Keybinding | Command | + * | ----------------------- | ------------------------------------------------------------- | ---------------------------------------------------- | + * | Show view menu | `v` (kakoune: normal), `z` (helix: normal; helix: select) | `[".openMenu", { menu: "view", ... }]` | + * | Show view menu (locked) | `s-v` (kakoune: normal), `s-z` (helix: normal; helix: select) | `[".openMenu", { menu: "view", locked: true, ... }]` | */ declare module "./view"; From 77882fdf5051b729c81088b325ac85e11660fa1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Geis?= Date: Sat, 17 Aug 2024 00:12:51 +0900 Subject: [PATCH 12/16] use symlinks --- extensions/helix/LICENSE | 6 +----- extensions/helix/README.md | 1 + extensions/helix/assets | 1 + extensions/helix/dance.png | Bin 14536 -> 0 bytes extensions/helix/package.build.ts | 20 +------------------- extensions/helix/package.json | 17 +---------------- 6 files changed, 5 insertions(+), 40 deletions(-) mode change 100644 => 120000 extensions/helix/LICENSE create mode 120000 extensions/helix/README.md create mode 120000 extensions/helix/assets delete mode 100644 extensions/helix/dance.png diff --git a/extensions/helix/LICENSE b/extensions/helix/LICENSE deleted file mode 100644 index 3155ccf3..00000000 --- a/extensions/helix/LICENSE +++ /dev/null @@ -1,5 +0,0 @@ -Copyright 2020-2021 Grégoire Geis - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/extensions/helix/LICENSE b/extensions/helix/LICENSE new file mode 120000 index 00000000..30cff740 --- /dev/null +++ b/extensions/helix/LICENSE @@ -0,0 +1 @@ +../../LICENSE \ No newline at end of file diff --git a/extensions/helix/README.md b/extensions/helix/README.md new file mode 120000 index 00000000..fe840054 --- /dev/null +++ b/extensions/helix/README.md @@ -0,0 +1 @@ +../../README.md \ No newline at end of file diff --git a/extensions/helix/assets b/extensions/helix/assets new file mode 120000 index 00000000..41aef43f --- /dev/null +++ b/extensions/helix/assets @@ -0,0 +1 @@ +../../assets \ No newline at end of file diff --git a/extensions/helix/dance.png b/extensions/helix/dance.png deleted file mode 100644 index 7ca6bb3fca603160afc69f9b6033e7fad99534af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14536 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 diff --git a/extensions/helix/package.build.ts b/extensions/helix/package.build.ts index da79d9e3..61efe198 100644 --- a/extensions/helix/package.build.ts +++ b/extensions/helix/package.build.ts @@ -44,7 +44,7 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ publisher: "gregoire", categories: ["Keymaps", "Other"], readme: "README.md", - icon: "dance.png", + icon: "assets/dance.png", extensionKind: ["ui", "workspace"], scripts: { @@ -58,21 +58,6 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ configurationDefaults: { "dance.defaultMode": "helix/normal", "dance.modes": { - "": { - hiddenSelectionsIndicatorsDecoration: { - after: { - color: "$list.warningForeground", - }, - backgroundColor: "$inputValidation.warningBackground", - borderColor: "$inputValidation.warningBorder", - borderStyle: "solid", - borderWidth: "1px", - isWholeLine: true, - }, - }, - "input": { - cursorStyle: "underline-thin", - }, "helix/insert": { onLeaveMode: [ [".selections.save", { @@ -202,7 +187,6 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ keybindings.filter(key => key.when.includes(whenMode)), whenMode, )); - } return [ @@ -210,8 +194,6 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ ...ignoredKeybindings, ]; })(), - - }, }); diff --git a/extensions/helix/package.json b/extensions/helix/package.json index d5e33753..7262414e 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -30,7 +30,7 @@ "Other" ], "readme": "README.md", - "icon": "dance.png", + "icon": "assets/dance.png", "extensionKind": [ "ui", "workspace" @@ -45,21 +45,6 @@ "configurationDefaults": { "dance.defaultMode": "helix/normal", "dance.modes": { - "": { - "hiddenSelectionsIndicatorsDecoration": { - "after": { - "color": "$list.warningForeground" - }, - "backgroundColor": "$inputValidation.warningBackground", - "borderColor": "$inputValidation.warningBorder", - "borderStyle": "solid", - "borderWidth": "1px", - "isWholeLine": true - } - }, - "input": { - "cursorStyle": "underline-thin" - }, "helix/insert": { "onLeaveMode": [ [ From e9089469093a2d984ed4562c45fbe7255badf5ea Mon Sep 17 00:00:00 2001 From: Strackeror Date: Fri, 23 Aug 2024 21:57:52 +0200 Subject: [PATCH 13/16] Fix invalid pre-release version string It's not consistent, but vscode sometimes gives me errors about the semver for the helix package not being valid, and indeed it seems leading zeroes are not valid semver, so switching to a tag to mark the prerelease --- extensions/helix/package.build.ts | 2 +- extensions/helix/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/helix/package.build.ts b/extensions/helix/package.build.ts index 61efe198..ed8a07c9 100644 --- a/extensions/helix/package.build.ts +++ b/extensions/helix/package.build.ts @@ -7,7 +7,7 @@ import { extensionId } from "../../src/utils/constants"; const version = "0.1.0", preRelease = 1, - preReleaseVersion = version.replace(/\d+$/, "$&" + preRelease.toString().padStart(3, "0")); + preReleaseVersion = `${version}-pre${preRelease}`; export const pkg = (modules: Builder.ParsedModule[]) => ({ diff --git a/extensions/helix/package.json b/extensions/helix/package.json index 7262414e..e9885300 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -38,8 +38,8 @@ "scripts": { "package": "vsce package --allow-star-activation", "publish": "vsce publish --allow-star-activation", - "package:pre": "vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.1.0001", - "publish:pre": "vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.1.0001" + "package:pre": "vsce package --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.1.0-pre1", + "publish:pre": "vsce publish --allow-star-activation --pre-release --no-git-tag-version --no-update-package-json 0.1.0-pre1" }, "contributes": { "configurationDefaults": { From 943ffc1076d712c37f80563f1d06dff74512c13f Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid <7303830+kabouzeid@users.noreply.github.com> Date: Sun, 23 Feb 2025 15:35:59 +0100 Subject: [PATCH 14/16] fix go to menu items --- extensions/helix/package.build.ts | 4 ++-- extensions/helix/package.json | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/extensions/helix/package.build.ts b/extensions/helix/package.build.ts index ed8a07c9..762702c9 100644 --- a/extensions/helix/package.build.ts +++ b/extensions/helix/package.build.ts @@ -145,12 +145,12 @@ export const pkg = (modules: Builder.ParsedModule[]) => ({ goto: { title: "Goto", items: { - "g": { text: "to line number else file start", command: "dance.select.lineStart" }, + "g": { text: "to line number else file start", command: "dance.select.lineStart", "args": [{ "count": 1 }] }, "e": { text: "to last line", command: "dance.select.lineEnd", args: [{ count: 2 ** 31 - 1 }] }, "f": { text: "to file/URLs in selections", command: "dance.selections.open" }, "h": { text: "to line start", command: "dance.select.lineStart" }, "l": { text: "to line end", command: "dance.select.lineEnd" }, - "i": { text: "to first non-blank in line", command: "dance.select.lineStart", args: [{ skipBlank: true }] }, + "s": { text: "to first non-blank in line", command: "dance.select.lineStart", args: [{ skipBlank: true }] }, "d": { text: "to definition", command: "editor.action.revealDefinition" }, "r": { text: "to references", command: "editor.action.goToReferences" }, "j": { text: "to last line", command: "dance.select.lastLine" }, diff --git a/extensions/helix/package.json b/extensions/helix/package.json index e9885300..173d68d6 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -321,7 +321,12 @@ "items": { "g": { "text": "to line number else file start", - "command": "dance.select.lineStart" + "command": "dance.select.lineStart", + "args": [ + { + "count": 1 + } + ] }, "e": { "text": "to last line", @@ -344,7 +349,7 @@ "text": "to line end", "command": "dance.select.lineEnd" }, - "i": { + "s": { "text": "to first non-blank in line", "command": "dance.select.lineStart", "args": [ From f09050ac183171bd6c6ac019380a45c483373a5e Mon Sep 17 00:00:00 2001 From: Strackeror Date: Tue, 3 Sep 2024 13:54:48 +0200 Subject: [PATCH 15/16] Keymap: Add switch back to normal mode on some keybinds --- extensions/helix/package.json | 251 +++++++++++++++++++++--------- meta.ts | 4 +- src/api/data/commands.yaml | 202 ++++++++++++++++-------- src/commands/README.md | 177 ++++++++++++--------- src/commands/edit.ts | 43 +++-- src/commands/layouts/azerty.fr.md | 177 ++++++++++++--------- src/commands/layouts/qwerty.md | 177 ++++++++++++--------- src/commands/selections.ts | 5 +- 8 files changed, 660 insertions(+), 376 deletions(-) diff --git a/extensions/helix/package.json b/extensions/helix/package.json index 173d68d6..8196ed9a 100644 --- a/extensions/helix/package.json +++ b/extensions/helix/package.json @@ -424,84 +424,42 @@ "title": "Swap case", "command": "dance.edit.case.swap" }, - { - "key": "Shift+`", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Swap case", - "command": "dance.edit.case.swap" - }, { "key": "`", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Transform to lower case", "command": "dance.edit.case.toLower" }, - { - "key": "`", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Transform to lower case", - "command": "dance.edit.case.toLower" - }, { "key": "Alt+`", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Transform to upper case", "command": "dance.edit.case.toUpper" }, - { - "key": "Alt+`", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Transform to upper case", - "command": "dance.edit.case.toUpper" - }, { "key": "Shift+,", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Deindent selected lines (including incomplete indent)", "command": "dance.edit.deindent.withIncomplete" }, - { - "key": "Shift+,", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Deindent selected lines (including incomplete indent)", - "command": "dance.edit.deindent.withIncomplete" - }, { "key": "Alt+D", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Delete", "command": "dance.edit.delete" }, - { - "key": "Alt+D", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Delete", - "command": "dance.edit.delete" - }, { "key": "Shift+.", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Indent selected lines", "command": "dance.edit.indent" }, - { - "key": "Shift+.", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Indent selected lines", - "command": "dance.edit.indent" - }, { "key": "Shift+R", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Insert contents of register", "command": "dance.edit.insert" }, - { - "key": "Shift+R", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Insert contents of register", - "command": "dance.edit.insert" - }, { "key": "Shift+J", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -550,24 +508,12 @@ "title": "Insert new line below and switch to insert", "command": "dance.edit.newLine.below.insert" }, - { - "key": "P", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Paste after", - "command": "dance.edit.paste.after" - }, { "key": "P", "when": "editorTextFocus && dance.mode == 'helix/normal'", "title": "Paste after and select", "command": "dance.edit.paste.after.select" }, - { - "key": "Shift+P", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Paste before", - "command": "dance.edit.paste.before" - }, { "key": "Shift+P", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -586,12 +532,6 @@ "title": "Copy and delete", "command": "dance.edit.yank-delete" }, - { - "key": "D", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Copy and delete", - "command": "dance.edit.yank-delete" - }, { "key": "C", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -604,6 +544,171 @@ "title": "Copy, delete and switch to Insert", "command": "dance.edit.yank-delete-insert" }, + { + "key": "Shift+R", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.insert" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "Alt+D", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.delete" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "D", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.yank-delete" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "Shift+P", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.paste.before" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "P", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.paste.after" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "Shift+.", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.indent" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "Shift+,", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.deindent" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "`", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.case.toLower" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "Alt+`", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.case.toUpper" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "Shift+`", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.case.swap" + ], + [ + ".modes.set.normal" + ] + ] + } + }, + { + "key": "R", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".edit.replaceCharacters" + ], + [ + ".modes.set.normal" + ] + ] + } + }, { "key": "Shift+U", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -1623,6 +1728,21 @@ "shift": "extend" } }, + { + "key": "Y", + "when": "editorTextFocus && dance.mode == 'helix/select'", + "command": "dance.run", + "args": { + "commands": [ + [ + ".selections.saveText" + ], + [ + ".modes.set.normal" + ] + ] + } + }, { "key": "Alt+;", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -1797,12 +1917,6 @@ "title": "Copy selections text", "command": "dance.selections.saveText" }, - { - "key": "Y", - "when": "editorTextFocus && dance.mode == 'helix/select'", - "title": "Copy selections text", - "command": "dance.selections.saveText" - }, { "key": "S", "when": "editorTextFocus && dance.mode == 'helix/normal'", @@ -2095,11 +2209,6 @@ "command": "dance.ignore", "when": "editorTextFocus && dance.mode == 'helix/select'" }, - { - "key": "R", - "command": "dance.ignore", - "when": "editorTextFocus && dance.mode == 'helix/select'" - }, { "key": "Shift+D", "command": "dance.ignore", diff --git a/meta.ts b/meta.ts index df59c95c..46c1b541 100644 --- a/meta.ts +++ b/meta.ts @@ -114,7 +114,9 @@ function parseAdditional(qualificationPrefix: string, text: string, textStartLin const key = keys[j], value = valueConverter[key](values[j].trim()); - (obj as Record)[key] = value; + if (value.length !== 0) { + (obj as Record)[key] = value; + } } if ("identifier" in obj) { diff --git a/src/api/data/commands.yaml b/src/api/data/commands.yaml index 530dd9a5..e4fbbb3f 100644 --- a/src/api/data/commands.yaml +++ b/src/api/data/commands.yaml @@ -64,12 +64,16 @@ edit.case.swap: keys: qwerty: |- `` a-` `` (kakoune: normal) - `` s-` `` (helix: normal; helix: select) + `` s-` `` (helix: normal) doc: - en: |+ + en: | Swap case. + | Keybindings | Commands | + | ----------- | -------- | + | `` s-` `` (helix: select) | `[".edit.case.swap"], [".modes.set.normal"]` | + edit.case.toLower: title: en: Transform to lower case @@ -77,12 +81,15 @@ edit.case.toLower: keys: qwerty: |- `` ` `` (core: normal) - `` ` `` (helix: select) doc: - en: |+ + en: | Transform to lower case. + | Keybindings | Commands | + | ----------- | -------- | + | `` ` `` (helix: select) | `[".edit.case.toLower"], [".modes.set.normal"]` | + edit.case.toUpper: title: en: Transform to upper case @@ -90,12 +97,16 @@ edit.case.toUpper: keys: qwerty: |- `` s-` `` (kakoune: normal) - `` a-` `` (helix: normal; helix: select) + `` a-` `` (helix: normal) doc: - en: |+ + en: | Transform to upper case. + | Keybindings | Commands | + | ----------- | -------- | + | `` a-` `` (helix: select) | `[".edit.case.toUpper"], [".modes.set.normal"]` | + edit.copyIndentation: title: en: Copy indentation @@ -129,12 +140,16 @@ edit.deindent.withIncomplete: keys: qwerty: |- - `<` (core: normal; helix: select) + `<` (core: normal) doc: - en: |+ + en: | Deindent selected lines (including incomplete indent). + | Keybindings | Commands | + | ----------- | -------- | + | `<` (helix: select) | `[".edit.deindent"], [".modes.set.normal"]` | + edit.delete: title: en: Delete @@ -144,7 +159,7 @@ edit.delete: keys: qwerty: |- - `a-d` (core: normal; helix: select) + `a-d` (core: normal) edit.delete-insert: title: @@ -163,12 +178,16 @@ edit.indent: keys: qwerty: |- - `>` (core: normal; helix: select) + `>` (core: normal) doc: - en: |+ + en: | Indent selected lines. + | Keybindings | Commands | + | ----------- | -------- | + | `>` (helix: select) | `[".edit.indent"], [".modes.set.normal"]` | + edit.indent.withEmpty: title: en: Indent selected lines (including empty lines) @@ -188,7 +207,7 @@ edit.insert: keys: qwerty: |- `s-a-r` (kakoune: normal) - `s-r` (helix: normal; helix: select) + `s-r` (helix: normal) doc: en: | @@ -210,19 +229,24 @@ edit.insert: | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | - | Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | - | Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | + | Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | + | Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | - | Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | + | Delete | `delete` | `a-d` (core: normal) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | - | Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | + | Copy and delete | `yank-delete` | `d` (core: normal) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | + | | | `s-r` (helix: select) | `[".edit.insert"], [".modes.set.normal"]` | + | | | `a-d` (helix: select) | `[".edit.delete"], [".modes.set.normal"]` | + | | | `d` (helix: select) | `[".edit.yank-delete"], [".modes.set.normal"]` | + | | | `s-p` (helix: select) | `[".edit.paste.before"], [".modes.set.normal"]` | + | | | `p` (helix: select) | `[".edit.paste.after"], [".modes.set.normal"]` | edit.join: title: @@ -322,10 +346,6 @@ edit.paste.after: commands: |- [".edit.insert", { handleNewLine: true, where: "end" , $exclude: [] }] - keys: - qwerty: |- - `p` (helix: select) - edit.paste.after.select: title: en: Paste after and select @@ -344,10 +364,6 @@ edit.paste.before: commands: |- [".edit.insert", { handleNewLine: true, where: "start", $exclude: [] }] - keys: - qwerty: |- - `s-p` (helix: select) - edit.paste.before.select: title: en: Paste before and select @@ -366,9 +382,6 @@ edit.pasteAll.after: commands: |- [".edit.insert", { handleNewLine: true, where: "end" , all: true, $exclude: [] }] - keys: - qwerty: "" - edit.pasteAll.after.select: title: en: Paste all after and select @@ -387,9 +400,6 @@ edit.pasteAll.before: commands: |- [".edit.insert", { handleNewLine: true, where: "start", all: true, $exclude: [] }] - keys: - qwerty: "" - edit.pasteAll.before.select: title: en: Paste all before and select @@ -410,9 +420,13 @@ edit.replaceCharacters: `r` (core: normal) doc: - en: |+ + en: | Replace characters. + | Keybindings | Commands | + | ----------- | -------- | + | `r` (helix: select) | `[".edit.replaceCharacters"], [".modes.set.normal"]` | + edit.selectRegister-insert: title: en: Pick register and replace @@ -427,14 +441,14 @@ edit.selectRegister-insert: edit.yank-delete: title: - en: Copy and delete + en: "Copy and delete" commands: |- [".selections.saveText", { $include: ["register"] }], [".edit.insert", { register: "_", $exclude: ["register"] }] keys: qwerty: |- - `d` (core: normal; helix: select) + `d` (core: normal) edit.yank-delete-insert: title: @@ -564,9 +578,6 @@ history.repeat.selection: commands: |- [".history.repeat", { filter: "dance\\.(seek|select|selections)", $include: ["count"] }] - keys: - qwerty: "" - history.undo: title: en: Undo @@ -694,9 +705,6 @@ modes.set.insert: commands: |- [".modes.set", { mode: "insert" }] - keys: - qwerty: "" - modes.set.normal: title: en: Set mode to Normal @@ -1577,9 +1585,6 @@ select.documentEnd.extend: commands: |- [".select.lineEnd", { count: 2147483647, shift: "extend", $exclude: [] }] - keys: - qwerty: "" - select.documentEnd.jump: title: en: Jump to last character @@ -1587,9 +1592,6 @@ select.documentEnd.jump: commands: |- [".select.lineEnd", { count: 2147483647, shift: "jump" , $exclude: [] }] - keys: - qwerty: "" - select.down.extend: title: en: Extend down @@ -1622,9 +1624,6 @@ select.firstLine.extend: commands: |- [".select.lineStart", { count: 0, shift: "extend", $exclude: [] }] - keys: - qwerty: "" - select.firstLine.jump: title: en: Jump to first line @@ -1632,9 +1631,6 @@ select.firstLine.jump: commands: |- [".select.lineStart", { count: 0, shift: "jump" , $exclude: [] }] - keys: - qwerty: "" - select.firstVisibleLine: title: en: Select to first visible line @@ -1882,9 +1878,6 @@ select.lineStart.jump: commands: |- [".select.lineStart", { shift: "jump" , $exclude: [] }] - keys: - qwerty: "" - select.lineStart.skipBlank.extend: title: en: Extend to line start (skip blank) @@ -1892,9 +1885,6 @@ select.lineStart.skipBlank.extend: commands: |- [".select.lineStart", { skipBlank: true, shift: "extend", $exclude: [] }] - keys: - qwerty: "" - select.lineStart.skipBlank.jump: title: en: Jump to line start (skip blank) @@ -1902,9 +1892,6 @@ select.lineStart.skipBlank.jump: commands: |- [".select.lineStart", { skipBlank: true, shift: "jump" , $exclude: [] }] - keys: - qwerty: "" - select.middleVisibleLine: title: en: Select to middle visible line @@ -2166,9 +2153,6 @@ selections.faceBackward: commands: |- [".selections.changeDirection", { direction: -1 }] - keys: - qwerty: "" - selections.faceForward: title: en: Forward selections @@ -2494,12 +2478,16 @@ selections.saveText: keys: qwerty: |- - `y` (core: normal; helix: select) + `y` (core: normal) doc: - en: |+ + en: | Copy selections text. + | Keybindings | Commands | + | ----------- | -------- | + | `y` (helix: select) | `[".selections.saveText"], [".modes.set.normal"]` | + selections.select: title: en: Select within selections @@ -2700,6 +2688,83 @@ anonymous: qwerty: |- `up` (core: prompt) + - commands: |- + [".edit.case.swap"], [".modes.set.normal"] + + keys: + qwerty: |- + `` s-` `` (helix: select) + + - commands: |- + [".edit.case.toLower"], [".modes.set.normal"] + + keys: + qwerty: |- + `` ` `` (helix: select) + + - commands: |- + [".edit.case.toUpper"], [".modes.set.normal"] + + keys: + qwerty: |- + `` a-` `` (helix: select) + + - commands: |- + [".edit.deindent"], [".modes.set.normal"] + + keys: + qwerty: |- + `<` (helix: select) + + - commands: |- + [".edit.delete"], [".modes.set.normal"] + + keys: + qwerty: |- + `a-d` (helix: select) + + - commands: |- + [".edit.indent"], [".modes.set.normal"] + + keys: + qwerty: |- + `>` (helix: select) + + - commands: |- + [".edit.insert"], [".modes.set.normal"] + + keys: + qwerty: |- + `s-r` (helix: select) + + - commands: |- + [".edit.paste.after"], [".modes.set.normal"] + + keys: + qwerty: |- + `p` (helix: select) + + - commands: |- + [".edit.paste.before"], [".modes.set.normal"] + + keys: + qwerty: |- + `s-p` (helix: select) + + - commands: |- + [".edit.replaceCharacters"], [".modes.set.normal"] + + keys: + qwerty: |- + `r` (helix: select) + + - commands: |- + [".edit.yank-delete"], [".modes.set.normal"] + + keys: + qwerty: |- + `d` (helix: select) + - title: en: Open match menu @@ -2805,6 +2870,13 @@ anonymous: qwerty: |- `s-a-z` (kakoune: normal) + - commands: |- + [".selections.saveText"], [".modes.set.normal"] + + keys: + qwerty: |- + `y` (helix: select) + - title: en: Add the digit 0 to the counter diff --git a/src/commands/README.md b/src/commands/README.md index db495639..227c38bd 100644 --- a/src/commands/README.md +++ b/src/commands/README.md @@ -27,31 +27,31 @@ depending on the keyboard layout. The following layouts _will be_\* supported: devdev.copyLastErrorMessageCopies the last encountered error message dev.setSelectionBehaviorSet the selection behavior of the specified mode editedit.alignAlign selectionsShift+7 (editorTextFocus && dance.mode == 'normal') -edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'select') -edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.mode == 'select') -edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'select') +edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'normal') +edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal') +edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'normal') edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.mode == 'normal') edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.mode == 'normal') -edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.mode == 'select') -edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.mode == 'select') +edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal') +edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal') edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.mode == 'normal') -edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.mode == 'select') -edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.mode == 'select') -edit.paste.afterPaste afterP (editorTextFocus && dance.mode == 'select') +edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.mode == 'select') +edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.mode == 'select') +edit.paste.afterPaste after edit.paste.after.selectPaste after and selectP (editorTextFocus && dance.mode == 'normal') -edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.mode == 'select') +edit.paste.beforePaste before edit.paste.before.selectPaste before and selectShift+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.afterPaste all after edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.beforePaste all before edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.mode == 'normal') edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.mode == 'insert') -edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.mode == 'select') +edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal') edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.mode == 'select') edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') -edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.mode == 'select') +edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal') edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'select') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'normal') edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'select') edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.mode == 'select') edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') @@ -195,25 +195,25 @@ selections are empty selections.restoreRestore selectionsZ (editorTextFocus && dance.mode == 'normal') selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.mode == 'normal') selections.saveSave selectionsShift+Z (editorTextFocus && dance.mode == 'normal') -selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.mode == 'select') +selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal') selections.selectSelect within selections -selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') -selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal')Shift+Alt+C (editorTextFocus && dance.mode == 'select') -selections.faceBackwardBackward selections -selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') -selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') -selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.mode == 'select') -selections.hideIndicesHide selection indices -selections.orderAscendingOrder selections ascending -selections.orderDescendingOrder selections descending -selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.mode == 'select') -selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.mode == 'select') -selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.mode == 'select') -selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') -selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.mode == 'select') -selections.showIndicesShow selection indices -selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.mode == 'select') +selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') +selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal')Shift+Alt+C (editorTextFocus && dance.mode == 'select') +selections.faceBackwardBackward selections +selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') +selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') +selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.mode == 'select') +selections.hideIndicesHide selection indices +selections.orderAscendingOrder selections ascending +selections.orderDescendingOrder selections descending +selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.mode == 'select') +selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') +selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.mode == 'select') +selections.showIndicesShow selection indices +selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.mode == 'select') selections.sortSort selections selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries @@ -263,7 +263,7 @@ See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes -### [`edit.insert`](./edit.ts#L15-L61) +### [`edit.insert`](./edit.ts#L15-L66) Insert contents of register. @@ -283,19 +283,24 @@ Specify `all` to paste all contents next to each selection. | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | -| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | -| Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | +| Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | +| Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | -| Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | +| Delete | `delete` | `a-d` (core: normal) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | -| Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | +| Copy and delete | `yank-delete` | `d` (core: normal) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | +| | | `s-r` (helix: select) | `[".edit.insert"], [".modes.set.normal"]` | +| | | `a-d` (helix: select) | `[".edit.delete"], [".modes.set.normal"]` | +| | | `d` (helix: select) | `[".edit.yank-delete"], [".modes.set.normal"]` | +| | | `s-p` (helix: select) | `[".edit.paste.before"], [".modes.set.normal"]` | +| | | `p` (helix: select) | `[".edit.paste.after"], [".modes.set.normal"]` | This command: - accepts a register (by default, it uses `dquote`). @@ -308,11 +313,11 @@ This command: - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`. Default keybinding: `s-a-r` (kakoune: normal) -`s-r` (helix: normal; helix: select) +`s-r` (helix: normal) -### [`edit.join`](./edit.ts#L133-L138) +### [`edit.join`](./edit.ts#L138-L143) Join lines. @@ -325,7 +330,7 @@ Default keybinding: `a-j` (kakoune: normal) -### [`edit.join.select`](./edit.ts#L142-L147) +### [`edit.join.select`](./edit.ts#L147-L152) Join lines and select inserted separators. @@ -337,19 +342,22 @@ Default keybinding: `s-a-j` (core: normal; helix: select) -### [`edit.indent`](./edit.ts#L151-L156) +### [`edit.indent`](./edit.ts#L156-L164) Indent selected lines. +| Keybindings | Commands | +| ----------- | -------- | +| `>` (helix: select) | `[".edit.indent"], [".modes.set.normal"]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `>` (core: normal; helix: select) +Default keybinding: `>` (core: normal) -### [`edit.indent.withEmpty`](./edit.ts#L160-L165) +### [`edit.indent.withEmpty`](./edit.ts#L168-L173) Indent selected lines (including empty lines). @@ -361,7 +369,7 @@ Default keybinding: `a->` (kakoune: normal) -### [`edit.deindent`](./edit.ts#L169-L174) +### [`edit.deindent`](./edit.ts#L177-L182) Deindent selected lines. @@ -373,55 +381,69 @@ Default keybinding: `a-<` (kakoune: normal) -### [`edit.deindent.withIncomplete`](./edit.ts#L178-L183) +### [`edit.deindent.withIncomplete`](./edit.ts#L186-L194) Deindent selected lines (including incomplete indent). +| Keybindings | Commands | +| ----------- | -------- | +| `<` (helix: select) | `[".edit.deindent"], [".modes.set.normal"]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `<` (core: normal; helix: select) +Default keybinding: `<` (core: normal) -### [`edit.case.toLower`](./edit.ts#L187-L192) +### [`edit.case.toLower`](./edit.ts#L198-L206) Transform to lower case. +| Keybindings | Commands | +| ----------- | -------- | +| `` ` `` (helix: select) | `[".edit.case.toLower"], [".modes.set.normal"]` | Default keybinding: `` ` `` (core: normal) -`` ` `` (helix: select) -### [`edit.case.toUpper`](./edit.ts#L196-L201) +### [`edit.case.toUpper`](./edit.ts#L210-L218) Transform to upper case. +| Keybindings | Commands | +| ----------- | -------- | +| `` a-` `` (helix: select) | `[".edit.case.toUpper"], [".modes.set.normal"]` | Default keybinding: `` s-` `` (kakoune: normal) -`` a-` `` (helix: normal; helix: select) +`` a-` `` (helix: normal) -### [`edit.case.swap`](./edit.ts#L205-L210) +### [`edit.case.swap`](./edit.ts#L222-L230) Swap case. +| Keybindings | Commands | +| ----------- | -------- | +| `` s-` `` (helix: select) | `[".edit.case.swap"], [".modes.set.normal"]` | Default keybinding: `` a-` `` (kakoune: normal) -`` s-` `` (helix: normal; helix: select) +`` s-` `` (helix: normal) -### [`edit.replaceCharacters`](./edit.ts#L225-L234) +### [`edit.replaceCharacters`](./edit.ts#L245-L257) Replace characters. +| Keybindings | Commands | +| ----------- | -------- | +| `r` (helix: select) | `[".edit.replaceCharacters"], [".modes.set.normal"]` | This command: - may be repeated with a given number of repetitions. @@ -431,7 +453,7 @@ Default keybinding: `r` (core: normal) -### [`edit.align`](./edit.ts#L277-L285) +### [`edit.align`](./edit.ts#L300-L308) Align selections. @@ -446,7 +468,7 @@ Default keybinding: `&` (core: normal) -### [`edit.copyIndentation`](./edit.ts#L335-L348) +### [`edit.copyIndentation`](./edit.ts#L358-L371) Copy indentation. @@ -461,7 +483,7 @@ Default keybinding: `a-&` (kakoune: normal) -### [`edit.newLine.above`](./edit.ts#L377-L395) +### [`edit.newLine.above`](./edit.ts#L400-L418) Insert new line above each selection. @@ -483,7 +505,7 @@ Default keybinding: `s-a-o` (kakoune: normal) -### [`edit.newLine.below`](./edit.ts#L415-L433) +### [`edit.newLine.below`](./edit.ts#L438-L456) Insert new line below each selection. @@ -1401,19 +1423,22 @@ Interacting with selections. -### [`selections.saveText`](./selections.ts#L21-L30) +### [`selections.saveText`](./selections.ts#L21-L33) Copy selections text. +| Keybindings | Commands | +| ----------- | -------- | +| `y` (helix: select) | `[".selections.saveText"], [".modes.set.normal"]` | This command: - accepts a register (by default, it uses `dquote`). -Default keybinding: `y` (core: normal; helix: select) +Default keybinding: `y` (core: normal) -### [`selections.save`](./selections.ts#L34-L48) +### [`selections.save`](./selections.ts#L37-L51) Save selections. @@ -1428,7 +1453,7 @@ Default keybinding: `s-z` (kakoune: normal) -### [`selections.restore`](./selections.ts#L95-L103) +### [`selections.restore`](./selections.ts#L98-L106) Restore selections. @@ -1440,7 +1465,7 @@ Default keybinding: `z` (kakoune: normal) -### [`selections.restore.withCurrent`](./selections.ts#L115-L135) +### [`selections.restore.withCurrent`](./selections.ts#L118-L138) Combine register selections with current ones. @@ -1462,7 +1487,7 @@ Default keybinding: `a-z` (kakoune: normal) -### [`selections.pipe`](./selections.ts#L241-L262) +### [`selections.pipe`](./selections.ts#L244-L265) Pipe selections. @@ -1487,7 +1512,7 @@ Default keybinding: `a-|` (core: normal; helix: select) -### [`selections.filter`](./selections.ts#L290-L311) +### [`selections.filter`](./selections.ts#L293-L314) Filter selections. @@ -1511,7 +1536,7 @@ Default keybinding: `$` (core: normal; helix: select) -### [`selections.select`](./selections.ts#L344-L358) +### [`selections.select`](./selections.ts#L347-L361) Select within selections. @@ -1527,7 +1552,7 @@ This command: -### [`selections.split`](./selections.ts#L377-L388) +### [`selections.split`](./selections.ts#L380-L391) Split selections. @@ -1541,7 +1566,7 @@ Default keybinding: `s-s` (core: normal; helix: select) -### [`selections.splitLines`](./selections.ts#L413-L429) +### [`selections.splitLines`](./selections.ts#L416-L432) Split selections at line boundaries. @@ -1557,7 +1582,7 @@ This command: -### [`selections.expandToLines`](./selections.ts#L472-L479) +### [`selections.expandToLines`](./selections.ts#L475-L482) Expand to lines. @@ -1570,7 +1595,7 @@ Default keybinding: `x` (kakoune: normal) -### [`selections.trimLines`](./selections.ts#L506-L513) +### [`selections.trimLines`](./selections.ts#L509-L516) Trim lines. @@ -1582,7 +1607,7 @@ Default keybinding: `a-x` (core: normal; helix: select) -### [`selections.trimWhitespace`](./selections.ts#L538-L545) +### [`selections.trimWhitespace`](./selections.ts#L541-L548) Trim whitespace. @@ -1594,7 +1619,7 @@ Default keybinding: `_` (core: normal; helix: select) -### [`selections.reduce`](./selections.ts#L564-L583) +### [`selections.reduce`](./selections.ts#L567-L586) Reduce selections to their cursor. @@ -1614,7 +1639,7 @@ Default keybinding: `;` (core: normal; helix: select) -### [`selections.changeDirection`](./selections.ts#L645-L660) +### [`selections.changeDirection`](./selections.ts#L648-L663) Change direction of selections. @@ -1632,7 +1657,7 @@ Default keybinding: `a-;` (core: normal; helix: select) -### [`selections.changeOrder`](./selections.ts#L685-L699) +### [`selections.changeOrder`](./selections.ts#L688-L702) Reverse selections. @@ -1646,7 +1671,7 @@ Reverse selections. -### [`selections.sort`](./selections.ts#L712-L724) +### [`selections.sort`](./selections.ts#L715-L727) Sort selections. @@ -1657,7 +1682,7 @@ This command: -### [`selections.copy`](./selections.ts#L797-L815) +### [`selections.copy`](./selections.ts#L800-L818) Copy selections below. @@ -1675,7 +1700,7 @@ Default keybinding: `s-c` (core: normal; helix: select) -### [`selections.merge`](./selections.ts#L849-L854) +### [`selections.merge`](./selections.ts#L852-L857) Merge contiguous selections. @@ -1685,13 +1710,13 @@ Default keybinding: `a-_` (kakoune: normal) -### [`selections.open`](./selections.ts#L858-L861) +### [`selections.open`](./selections.ts#L861-L864) Open selected file. -### [`selections.toggleIndices`](./selections.ts#L874-L891) +### [`selections.toggleIndices`](./selections.ts#L877-L894) Toggle selection indices. diff --git a/src/commands/edit.ts b/src/commands/edit.ts index 031d81e0..f41ce14e 100644 --- a/src/commands/edit.ts +++ b/src/commands/edit.ts @@ -25,26 +25,31 @@ declare module "./edit"; * * Specify `all` to paste all contents next to each selection. * - * @keys `s-a-r` (kakoune: normal), `s-r` (helix: normal; helix: select) + * @keys `s-a-r` (kakoune: normal), `s-r` (helix: normal) * * #### Additional commands * * | Title | Identifier | Keybinding | Commands | * | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | * | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | - * | Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | - * | Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | + * | Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | + * | Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | * | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | * | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | * | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | * | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | * | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | * | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | - * | Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | + * | Delete | `delete` | `a-d` (core: normal) | `[".edit.insert", { register: "_", ... }]` | * | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | - * | Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | + * | Copy and delete | `yank-delete` | `d` (core: normal) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | * | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | * | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | + * | | | `s-r` (helix: select) | `[".edit.insert"], [".modes.set.normal"]` | + * | | | `a-d` (helix: select) | `[".edit.delete"], [".modes.set.normal"]` | + * | | | `d` (helix: select) | `[".edit.yank-delete"], [".modes.set.normal"]` | + * | | | `s-p` (helix: select) | `[".edit.paste.before"], [".modes.set.normal"]` | + * | | | `p` (helix: select) | `[".edit.paste.after"], [".modes.set.normal"]` | */ export async function insert( _: Context, @@ -151,7 +156,10 @@ export async function join_select(_: Context, separator?: Argument) { /** * Indent selected lines. * - * @keys `>` (core: normal; helix: select) + * @keys `>` (core: normal) + * | Keybindings | Commands | + * | ----------- | -------- | + * | `>` (helix: select) | `[".edit.indent"], [".modes.set.normal"]` | */ export function indent(_: Context, repetitions: number) { return indentLines(Selections.lines(), repetitions, /* indentEmpty= */ false); @@ -178,7 +186,10 @@ export function deindent(_: Context, repetitions: number) { /** * Deindent selected lines (including incomplete indent). * - * @keys `<` (core: normal; helix: select) + * @keys `<` (core: normal) + * | Keybindings | Commands | + * | ----------- | -------- | + * | `<` (helix: select) | `[".edit.deindent"], [".modes.set.normal"]` | */ export function deindent_withIncomplete(_: Context, repetitions: number) { return deindentLines(Selections.lines(), repetitions, /* deindentIncomplete= */ true); @@ -187,7 +198,10 @@ export function deindent_withIncomplete(_: Context, repetitions: number) { /** * Transform to lower case. * - * @keys `` ` `` (core: normal), `` ` `` (helix: select) + * @keys `` ` `` (core: normal) + * | Keybindings | Commands | + * | ----------- | -------- | + * | `` ` `` (helix: select) | `[".edit.case.toLower"], [".modes.set.normal"]` | */ export function case_toLower(_: Context) { return replace((text) => text.toLocaleLowerCase()); @@ -196,7 +210,10 @@ export function case_toLower(_: Context) { /** * Transform to upper case. * - * @keys `` s-` `` (kakoune: normal), `` a-` `` (helix: normal; helix: select) + * @keys `` s-` `` (kakoune: normal), `` a-` `` (helix: normal) + * | Keybindings | Commands | + * | ----------- | -------- | + * | `` a-` `` (helix: select) | `[".edit.case.toUpper"], [".modes.set.normal"]` | */ export function case_toUpper(_: Context) { return replace((text) => text.toLocaleUpperCase()); @@ -205,7 +222,10 @@ export function case_toUpper(_: Context) { /** * Swap case. * - * @keys `` a-` `` (kakoune: normal), `` s-` `` (helix: normal; helix: select) + * @keys `` a-` `` (kakoune: normal), `` s-` `` (helix: normal) + * | Keybindings | Commands | + * | ----------- | -------- | + * | `` s-` `` (helix: select) | `[".edit.case.swap"], [".modes.set.normal"]` | */ export function case_swap(_: Context) { return replace((text) => { @@ -226,6 +246,9 @@ export function case_swap(_: Context) { * Replace characters. * * @keys `r` (core: normal) + * | Keybindings | Commands | + * | ----------- | -------- | + * | `r` (helix: select) | `[".edit.replaceCharacters"], [".modes.set.normal"]` | */ export async function replaceCharacters( _: Context, diff --git a/src/commands/layouts/azerty.fr.md b/src/commands/layouts/azerty.fr.md index cc9e5405..1d5f48a5 100644 --- a/src/commands/layouts/azerty.fr.md +++ b/src/commands/layouts/azerty.fr.md @@ -12,31 +12,31 @@ devdev.copyLastErrorMessageCopies the last encountered error message dev.setSelectionBehaviorSet the selection behavior of the specified mode editedit.alignAlign selectionsShift+7 (editorTextFocus && dance.mode == 'normal') -edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'select') -edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.mode == 'select') -edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'select') +edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'normal') +edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal') +edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'normal') edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.mode == 'normal') edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.mode == 'normal') -edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.mode == 'select') -edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.mode == 'select') +edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal') +edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal') edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.mode == 'normal') -edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.mode == 'select') -edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.mode == 'select') -edit.paste.afterPaste afterP (editorTextFocus && dance.mode == 'select') +edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.mode == 'select') +edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.mode == 'select') +edit.paste.afterPaste after edit.paste.after.selectPaste after and selectP (editorTextFocus && dance.mode == 'normal') -edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.mode == 'select') +edit.paste.beforePaste before edit.paste.before.selectPaste before and selectShift+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.afterPaste all after edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.beforePaste all before edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.mode == 'normal') edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.mode == 'insert') -edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.mode == 'select') +edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal') edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.mode == 'select') edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') -edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.mode == 'select') +edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal') edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'select') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'normal') edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'select') edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.mode == 'select') edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') @@ -180,25 +180,25 @@ selections are empty selections.restoreRestore selectionsZ (editorTextFocus && dance.mode == 'normal') selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.mode == 'normal') selections.saveSave selectionsShift+Z (editorTextFocus && dance.mode == 'normal') -selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.mode == 'select') +selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal') selections.selectSelect within selections -selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') -selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal')Shift+Alt+C (editorTextFocus && dance.mode == 'select') -selections.faceBackwardBackward selections -selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') -selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') -selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.mode == 'select') -selections.hideIndicesHide selection indices -selections.orderAscendingOrder selections ascending -selections.orderDescendingOrder selections descending -selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.mode == 'select') -selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.mode == 'select') -selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.mode == 'select') -selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') -selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.mode == 'select') -selections.showIndicesShow selection indices -selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.mode == 'select') +selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') +selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal')Shift+Alt+C (editorTextFocus && dance.mode == 'select') +selections.faceBackwardBackward selections +selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') +selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') +selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.mode == 'select') +selections.hideIndicesHide selection indices +selections.orderAscendingOrder selections ascending +selections.orderDescendingOrder selections descending +selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.mode == 'select') +selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') +selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.mode == 'select') +selections.showIndicesShow selection indices +selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.mode == 'select') selections.sortSort selections selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries @@ -248,7 +248,7 @@ See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes -### [`edit.insert`](../edit.ts#L15-L61) +### [`edit.insert`](../edit.ts#L15-L66) Insert contents of register. @@ -268,19 +268,24 @@ Specify `all` to paste all contents next to each selection. | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | -| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | -| Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | +| Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | +| Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | -| Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | +| Delete | `delete` | `a-d` (core: normal) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | -| Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | +| Copy and delete | `yank-delete` | `d` (core: normal) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | +| | | `s-r` (helix: select) | `[".edit.insert"], [".modes.set.normal"]` | +| | | `a-d` (helix: select) | `[".edit.delete"], [".modes.set.normal"]` | +| | | `d` (helix: select) | `[".edit.yank-delete"], [".modes.set.normal"]` | +| | | `s-p` (helix: select) | `[".edit.paste.before"], [".modes.set.normal"]` | +| | | `p` (helix: select) | `[".edit.paste.after"], [".modes.set.normal"]` | This command: - accepts a register (by default, it uses `dquote`). @@ -293,11 +298,11 @@ This command: - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`. Default keybinding: `s-a-r` (kakoune: normal) -`s-r` (helix: normal; helix: select) +`s-r` (helix: normal) -### [`edit.join`](../edit.ts#L133-L138) +### [`edit.join`](../edit.ts#L138-L143) Join lines. @@ -310,7 +315,7 @@ Default keybinding: `a-j` (kakoune: normal) -### [`edit.join.select`](../edit.ts#L142-L147) +### [`edit.join.select`](../edit.ts#L147-L152) Join lines and select inserted separators. @@ -322,19 +327,22 @@ Default keybinding: `s-a-j` (core: normal; helix: select) -### [`edit.indent`](../edit.ts#L151-L156) +### [`edit.indent`](../edit.ts#L156-L164) Indent selected lines. +| Keybindings | Commands | +| ----------- | -------- | +| `>` (helix: select) | `[".edit.indent"], [".modes.set.normal"]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `>` (core: normal; helix: select) +Default keybinding: `>` (core: normal) -### [`edit.indent.withEmpty`](../edit.ts#L160-L165) +### [`edit.indent.withEmpty`](../edit.ts#L168-L173) Indent selected lines (including empty lines). @@ -346,7 +354,7 @@ Default keybinding: `a->` (kakoune: normal) -### [`edit.deindent`](../edit.ts#L169-L174) +### [`edit.deindent`](../edit.ts#L177-L182) Deindent selected lines. @@ -358,55 +366,69 @@ Default keybinding: `a-<` (kakoune: normal) -### [`edit.deindent.withIncomplete`](../edit.ts#L178-L183) +### [`edit.deindent.withIncomplete`](../edit.ts#L186-L194) Deindent selected lines (including incomplete indent). +| Keybindings | Commands | +| ----------- | -------- | +| `<` (helix: select) | `[".edit.deindent"], [".modes.set.normal"]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `<` (core: normal; helix: select) +Default keybinding: `<` (core: normal) -### [`edit.case.toLower`](../edit.ts#L187-L192) +### [`edit.case.toLower`](../edit.ts#L198-L206) Transform to lower case. +| Keybindings | Commands | +| ----------- | -------- | +| `` ` `` (helix: select) | `[".edit.case.toLower"], [".modes.set.normal"]` | Default keybinding: `` ` `` (core: normal) -`` ` `` (helix: select) -### [`edit.case.toUpper`](../edit.ts#L196-L201) +### [`edit.case.toUpper`](../edit.ts#L210-L218) Transform to upper case. +| Keybindings | Commands | +| ----------- | -------- | +| `` a-` `` (helix: select) | `[".edit.case.toUpper"], [".modes.set.normal"]` | Default keybinding: `` s-` `` (kakoune: normal) -`` a-` `` (helix: normal; helix: select) +`` a-` `` (helix: normal) -### [`edit.case.swap`](../edit.ts#L205-L210) +### [`edit.case.swap`](../edit.ts#L222-L230) Swap case. +| Keybindings | Commands | +| ----------- | -------- | +| `` s-` `` (helix: select) | `[".edit.case.swap"], [".modes.set.normal"]` | Default keybinding: `` a-` `` (kakoune: normal) -`` s-` `` (helix: normal; helix: select) +`` s-` `` (helix: normal) -### [`edit.replaceCharacters`](../edit.ts#L225-L234) +### [`edit.replaceCharacters`](../edit.ts#L245-L257) Replace characters. +| Keybindings | Commands | +| ----------- | -------- | +| `r` (helix: select) | `[".edit.replaceCharacters"], [".modes.set.normal"]` | This command: - may be repeated with a given number of repetitions. @@ -416,7 +438,7 @@ Default keybinding: `r` (core: normal) -### [`edit.align`](../edit.ts#L277-L285) +### [`edit.align`](../edit.ts#L300-L308) Align selections. @@ -431,7 +453,7 @@ Default keybinding: `&` (core: normal) -### [`edit.copyIndentation`](../edit.ts#L335-L348) +### [`edit.copyIndentation`](../edit.ts#L358-L371) Copy indentation. @@ -446,7 +468,7 @@ Default keybinding: `a-&` (kakoune: normal) -### [`edit.newLine.above`](../edit.ts#L377-L395) +### [`edit.newLine.above`](../edit.ts#L400-L418) Insert new line above each selection. @@ -468,7 +490,7 @@ Default keybinding: `s-a-o` (kakoune: normal) -### [`edit.newLine.below`](../edit.ts#L415-L433) +### [`edit.newLine.below`](../edit.ts#L438-L456) Insert new line below each selection. @@ -1386,19 +1408,22 @@ Interacting with selections. -### [`selections.saveText`](../selections.ts#L21-L30) +### [`selections.saveText`](../selections.ts#L21-L33) Copy selections text. +| Keybindings | Commands | +| ----------- | -------- | +| `y` (helix: select) | `[".selections.saveText"], [".modes.set.normal"]` | This command: - accepts a register (by default, it uses `dquote`). -Default keybinding: `y` (core: normal; helix: select) +Default keybinding: `y` (core: normal) -### [`selections.save`](../selections.ts#L34-L48) +### [`selections.save`](../selections.ts#L37-L51) Save selections. @@ -1413,7 +1438,7 @@ Default keybinding: `s-z` (kakoune: normal) -### [`selections.restore`](../selections.ts#L95-L103) +### [`selections.restore`](../selections.ts#L98-L106) Restore selections. @@ -1425,7 +1450,7 @@ Default keybinding: `z` (kakoune: normal) -### [`selections.restore.withCurrent`](../selections.ts#L115-L135) +### [`selections.restore.withCurrent`](../selections.ts#L118-L138) Combine register selections with current ones. @@ -1447,7 +1472,7 @@ Default keybinding: `a-z` (kakoune: normal) -### [`selections.pipe`](../selections.ts#L241-L262) +### [`selections.pipe`](../selections.ts#L244-L265) Pipe selections. @@ -1472,7 +1497,7 @@ Default keybinding: `a-|` (core: normal; helix: select) -### [`selections.filter`](../selections.ts#L290-L311) +### [`selections.filter`](../selections.ts#L293-L314) Filter selections. @@ -1496,7 +1521,7 @@ Default keybinding: `$` (core: normal; helix: select) -### [`selections.select`](../selections.ts#L344-L358) +### [`selections.select`](../selections.ts#L347-L361) Select within selections. @@ -1512,7 +1537,7 @@ This command: -### [`selections.split`](../selections.ts#L377-L388) +### [`selections.split`](../selections.ts#L380-L391) Split selections. @@ -1526,7 +1551,7 @@ Default keybinding: `s-s` (core: normal; helix: select) -### [`selections.splitLines`](../selections.ts#L413-L429) +### [`selections.splitLines`](../selections.ts#L416-L432) Split selections at line boundaries. @@ -1542,7 +1567,7 @@ This command: -### [`selections.expandToLines`](../selections.ts#L472-L479) +### [`selections.expandToLines`](../selections.ts#L475-L482) Expand to lines. @@ -1555,7 +1580,7 @@ Default keybinding: `x` (kakoune: normal) -### [`selections.trimLines`](../selections.ts#L506-L513) +### [`selections.trimLines`](../selections.ts#L509-L516) Trim lines. @@ -1567,7 +1592,7 @@ Default keybinding: `a-x` (core: normal; helix: select) -### [`selections.trimWhitespace`](../selections.ts#L538-L545) +### [`selections.trimWhitespace`](../selections.ts#L541-L548) Trim whitespace. @@ -1579,7 +1604,7 @@ Default keybinding: `_` (core: normal; helix: select) -### [`selections.reduce`](../selections.ts#L564-L583) +### [`selections.reduce`](../selections.ts#L567-L586) Reduce selections to their cursor. @@ -1599,7 +1624,7 @@ Default keybinding: `;` (core: normal; helix: select) -### [`selections.changeDirection`](../selections.ts#L645-L660) +### [`selections.changeDirection`](../selections.ts#L648-L663) Change direction of selections. @@ -1617,7 +1642,7 @@ Default keybinding: `a-;` (core: normal; helix: select) -### [`selections.changeOrder`](../selections.ts#L685-L699) +### [`selections.changeOrder`](../selections.ts#L688-L702) Reverse selections. @@ -1631,7 +1656,7 @@ Reverse selections. -### [`selections.sort`](../selections.ts#L712-L724) +### [`selections.sort`](../selections.ts#L715-L727) Sort selections. @@ -1642,7 +1667,7 @@ This command: -### [`selections.copy`](../selections.ts#L797-L815) +### [`selections.copy`](../selections.ts#L800-L818) Copy selections below. @@ -1660,7 +1685,7 @@ Default keybinding: `s-c` (core: normal; helix: select) -### [`selections.merge`](../selections.ts#L849-L854) +### [`selections.merge`](../selections.ts#L852-L857) Merge contiguous selections. @@ -1670,13 +1695,13 @@ Default keybinding: `a-_` (kakoune: normal) -### [`selections.open`](../selections.ts#L858-L861) +### [`selections.open`](../selections.ts#L861-L864) Open selected file. -### [`selections.toggleIndices`](../selections.ts#L874-L891) +### [`selections.toggleIndices`](../selections.ts#L877-L894) Toggle selection indices. diff --git a/src/commands/layouts/qwerty.md b/src/commands/layouts/qwerty.md index 08eac5c5..c6d3dc77 100644 --- a/src/commands/layouts/qwerty.md +++ b/src/commands/layouts/qwerty.md @@ -12,31 +12,31 @@ devdev.copyLastErrorMessageCopies the last encountered error message dev.setSelectionBehaviorSet the selection behavior of the specified mode editedit.alignAlign selectionsShift+7 (editorTextFocus && dance.mode == 'normal') -edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'select') -edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal')` (editorTextFocus && dance.mode == 'select') -edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'select') +edit.case.swapSwap caseAlt+` (editorTextFocus && dance.mode == 'normal')Shift+` (editorTextFocus && dance.mode == 'normal') +edit.case.toLowerTransform to lower case` (editorTextFocus && dance.mode == 'normal') +edit.case.toUpperTransform to upper caseShift+` (editorTextFocus && dance.mode == 'normal')Alt+` (editorTextFocus && dance.mode == 'normal') edit.copyIndentationCopy indentationShift+Alt+7 (editorTextFocus && dance.mode == 'normal') edit.deindentDeindent selected linesShift+Alt+, (editorTextFocus && dance.mode == 'normal') -edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal')Shift+, (editorTextFocus && dance.mode == 'select') -edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal')Alt+D (editorTextFocus && dance.mode == 'select') +edit.deindent.withIncompleteDeindent selected lines (including incomplete indent)Shift+, (editorTextFocus && dance.mode == 'normal') +edit.deleteDeleteAlt+D (editorTextFocus && dance.mode == 'normal') edit.delete-insertDelete and switch to InsertAlt+C (editorTextFocus && dance.mode == 'normal') -edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.mode == 'select') -edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.mode == 'select') -edit.paste.afterPaste afterP (editorTextFocus && dance.mode == 'select') +edit.newLine.above.insertInsert new line above and switch to insertShift+O (editorTextFocus && dance.mode == 'normal')Shift+O (editorTextFocus && dance.mode == 'select') +edit.newLine.below.insertInsert new line below and switch to insertO (editorTextFocus && dance.mode == 'normal')O (editorTextFocus && dance.mode == 'select') +edit.paste.afterPaste after edit.paste.after.selectPaste after and selectP (editorTextFocus && dance.mode == 'normal') -edit.paste.beforePaste beforeShift+P (editorTextFocus && dance.mode == 'select') +edit.paste.beforePaste before edit.paste.before.selectPaste before and selectShift+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.afterPaste all after edit.pasteAll.after.selectPaste all after and selectAlt+P (editorTextFocus && dance.mode == 'normal') edit.pasteAll.beforePaste all before edit.pasteAll.before.selectPaste all before and selectShift+Alt+P (editorTextFocus && dance.mode == 'normal') edit.selectRegister-insertPick register and replaceCtrl+R (editorTextFocus && dance.mode == 'normal')Ctrl+R (editorTextFocus && dance.mode == 'insert') -edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal')D (editorTextFocus && dance.mode == 'select') +edit.yank-deleteCopy and deleteD (editorTextFocus && dance.mode == 'normal') edit.yank-delete-insertCopy, delete and switch to InsertC (editorTextFocus && dance.mode == 'normal')C (editorTextFocus && dance.mode == 'select') edit.yank-replaceCopy and replaceShift+R (editorTextFocus && dance.mode == 'normal') -edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal')Shift+. (editorTextFocus && dance.mode == 'select') +edit.indentIndent selected linesShift+. (editorTextFocus && dance.mode == 'normal') edit.indent.withEmptyIndent selected lines (including empty lines)Shift+Alt+. (editorTextFocus && dance.mode == 'normal') -edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'select') +edit.insertInsert contents of registerShift+Alt+R (editorTextFocus && dance.mode == 'normal')Shift+R (editorTextFocus && dance.mode == 'normal') edit.joinJoin linesAlt+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'normal')Shift+J (editorTextFocus && dance.mode == 'select') edit.join.selectJoin lines and select inserted separatorsShift+Alt+J (editorTextFocus && dance.mode == 'normal')Shift+Alt+J (editorTextFocus && dance.mode == 'select') edit.newLine.aboveInsert new line above each selectionShift+Alt+O (editorTextFocus && dance.mode == 'normal') @@ -180,25 +180,25 @@ selections are empty selections.restoreRestore selectionsZ (editorTextFocus && dance.mode == 'normal') selections.restore.withCurrentCombine register selections with current onesAlt+Z (editorTextFocus && dance.mode == 'normal') selections.saveSave selectionsShift+Z (editorTextFocus && dance.mode == 'normal') -selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal')Y (editorTextFocus && dance.mode == 'select') +selections.saveTextCopy selections textY (editorTextFocus && dance.mode == 'normal') selections.selectSelect within selections -selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') -selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') -selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal')Shift+Alt+C (editorTextFocus && dance.mode == 'select') -selections.faceBackwardBackward selections -selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') -selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') -selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.mode == 'select') -selections.hideIndicesHide selection indices -selections.orderAscendingOrder selections ascending -selections.orderDescendingOrder selections descending -selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.mode == 'select') -selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.mode == 'select') -selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.mode == 'select') -selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') -selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.mode == 'select') -selections.showIndicesShow selection indices -selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.mode == 'select') +selections.clear.mainClear main selectionsAlt+, (editorTextFocus && dance.mode == 'normal')Alt+, (editorTextFocus && dance.mode == 'select') +selections.clear.secondaryClear secondary selections, (editorTextFocus && dance.mode == 'normal'), (editorTextFocus && dance.mode == 'select') +selections.copy.aboveCopy selections aboveShift+Alt+C (editorTextFocus && dance.mode == 'normal')Shift+Alt+C (editorTextFocus && dance.mode == 'select') +selections.faceBackwardBackward selections +selections.faceForwardForward selectionsShift+Alt+; (editorTextFocus && dance.mode == 'normal') +selections.filter.regexpKeep matching selectionsAlt+K (editorTextFocus && dance.mode == 'normal')Alt+K (editorTextFocus && dance.mode == 'select') +selections.filter.regexp.inverseClear matching selectionsShift+Alt+K (editorTextFocus && dance.mode == 'normal')Shift+Alt+K (editorTextFocus && dance.mode == 'select') +selections.hideIndicesHide selection indices +selections.orderAscendingOrder selections ascending +selections.orderDescendingOrder selections descending +selections.pipe.appendPipe and appendShift+1 (editorTextFocus && dance.mode == 'normal')Shift+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.prependPipe and prependShift+Alt+1 (editorTextFocus && dance.mode == 'normal')Shift+Alt+1 (editorTextFocus && dance.mode == 'select') +selections.pipe.replacePipe and replaceShift+\ (editorTextFocus && dance.mode == 'normal')Shift+\ (editorTextFocus && dance.mode == 'select') +selections.reduce.edgesReduce selections to their endsShift+Alt+S (editorTextFocus && dance.mode == 'normal') +selections.select.orLeapLeap or selectS (editorTextFocus && dance.mode == 'normal')S (editorTextFocus && dance.mode == 'select') +selections.showIndicesShow selection indices +selections.splitLines.orLeap.backwardLeap or select backwardAlt+S (editorTextFocus && dance.mode == 'normal')Alt+S (editorTextFocus && dance.mode == 'select') selections.sortSort selections selections.splitSplit selectionsShift+S (editorTextFocus && dance.mode == 'normal')Shift+S (editorTextFocus && dance.mode == 'select') selections.splitLinesSplit selections at line boundaries @@ -248,7 +248,7 @@ See https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc#changes -### [`edit.insert`](../edit.ts#L15-L61) +### [`edit.insert`](../edit.ts#L15-L66) Insert contents of register. @@ -268,19 +268,24 @@ Specify `all` to paste all contents next to each selection. | Title | Identifier | Keybinding | Commands | | ---------------------------------- | ------------------------ | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | Pick register and replace | `selectRegister-insert` | `c-r` (kakoune: normal), `c-r` (kakoune: insert) | `[".selectRegister", { +register }], [".edit.insert", { ... }]` | -| Paste before | `paste.before` | `s-p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | -| Paste after | `paste.after` | `p` (helix: select) | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | +| Paste before | `paste.before` | | `[".edit.insert", { handleNewLine: true, where: "start", ... }]` | +| Paste after | `paste.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , ... }]` | | Paste before and select | `paste.before.select` | `s-p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "start", shift: "select", ... }]` | | Paste after and select | `paste.after.select` | `p` (core: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , shift: "select", ... }]` | | Paste all before | `pasteAll.before` | | `[".edit.insert", { handleNewLine: true, where: "start", all: true, ... }]` | | Paste all after | `pasteAll.after` | | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, ... }]` | | Paste all before and select | `pasteAll.before.select` | `s-a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "start", all: true, shift: "select", ... }]` | | Paste all after and select | `pasteAll.after.select` | `a-p` (kakoune: normal) | `[".edit.insert", { handleNewLine: true, where: "end" , all: true, shift: "select", ... }]` | -| Delete | `delete` | `a-d` (core: normal; helix: select) | `[".edit.insert", { register: "_", ... }]` | +| Delete | `delete` | `a-d` (core: normal) | `[".edit.insert", { register: "_", ... }]` | | Delete and switch to Insert | `delete-insert` | `a-c` (kakoune: normal) | `[".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | -| Copy and delete | `yank-delete` | `d` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | +| Copy and delete | `yank-delete` | `d` (core: normal) | `[".selections.saveText", { +register }], [".edit.insert", { register: "_", ... }]` | | Copy, delete and switch to Insert | `yank-delete-insert` | `c` (core: normal; helix: select) | `[".selections.saveText", { +register }], [".modes.set", { mode: "insert", +mode }], [".edit.insert", { register: "_", ... }]` | | Copy and replace | `yank-replace` | `s-r` (kakoune: normal) | `[".selections.saveText", { register: "tmp" }], [".edit.insert"], [".updateRegister", { copyFrom: "tmp", ... }]` | +| | | `s-r` (helix: select) | `[".edit.insert"], [".modes.set.normal"]` | +| | | `a-d` (helix: select) | `[".edit.delete"], [".modes.set.normal"]` | +| | | `d` (helix: select) | `[".edit.yank-delete"], [".modes.set.normal"]` | +| | | `s-p` (helix: select) | `[".edit.paste.before"], [".modes.set.normal"]` | +| | | `p` (helix: select) | `[".edit.paste.after"], [".modes.set.normal"]` | This command: - accepts a register (by default, it uses `dquote`). @@ -293,11 +298,11 @@ This command: - takes an argument `where` of type `"active" | "anchor" | "start" | "end" | undefined`. Default keybinding: `s-a-r` (kakoune: normal) -`s-r` (helix: normal; helix: select) +`s-r` (helix: normal) -### [`edit.join`](../edit.ts#L133-L138) +### [`edit.join`](../edit.ts#L138-L143) Join lines. @@ -310,7 +315,7 @@ Default keybinding: `a-j` (kakoune: normal) -### [`edit.join.select`](../edit.ts#L142-L147) +### [`edit.join.select`](../edit.ts#L147-L152) Join lines and select inserted separators. @@ -322,19 +327,22 @@ Default keybinding: `s-a-j` (core: normal; helix: select) -### [`edit.indent`](../edit.ts#L151-L156) +### [`edit.indent`](../edit.ts#L156-L164) Indent selected lines. +| Keybindings | Commands | +| ----------- | -------- | +| `>` (helix: select) | `[".edit.indent"], [".modes.set.normal"]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `>` (core: normal; helix: select) +Default keybinding: `>` (core: normal) -### [`edit.indent.withEmpty`](../edit.ts#L160-L165) +### [`edit.indent.withEmpty`](../edit.ts#L168-L173) Indent selected lines (including empty lines). @@ -346,7 +354,7 @@ Default keybinding: `a->` (kakoune: normal) -### [`edit.deindent`](../edit.ts#L169-L174) +### [`edit.deindent`](../edit.ts#L177-L182) Deindent selected lines. @@ -358,55 +366,69 @@ Default keybinding: `a-<` (kakoune: normal) -### [`edit.deindent.withIncomplete`](../edit.ts#L178-L183) +### [`edit.deindent.withIncomplete`](../edit.ts#L186-L194) Deindent selected lines (including incomplete indent). +| Keybindings | Commands | +| ----------- | -------- | +| `<` (helix: select) | `[".edit.deindent"], [".modes.set.normal"]` | This command: - may be repeated with a given number of repetitions. -Default keybinding: `<` (core: normal; helix: select) +Default keybinding: `<` (core: normal) -### [`edit.case.toLower`](../edit.ts#L187-L192) +### [`edit.case.toLower`](../edit.ts#L198-L206) Transform to lower case. +| Keybindings | Commands | +| ----------- | -------- | +| `` ` `` (helix: select) | `[".edit.case.toLower"], [".modes.set.normal"]` | Default keybinding: `` ` `` (core: normal) -`` ` `` (helix: select) -### [`edit.case.toUpper`](../edit.ts#L196-L201) +### [`edit.case.toUpper`](../edit.ts#L210-L218) Transform to upper case. +| Keybindings | Commands | +| ----------- | -------- | +| `` a-` `` (helix: select) | `[".edit.case.toUpper"], [".modes.set.normal"]` | Default keybinding: `` s-` `` (kakoune: normal) -`` a-` `` (helix: normal; helix: select) +`` a-` `` (helix: normal) -### [`edit.case.swap`](../edit.ts#L205-L210) +### [`edit.case.swap`](../edit.ts#L222-L230) Swap case. +| Keybindings | Commands | +| ----------- | -------- | +| `` s-` `` (helix: select) | `[".edit.case.swap"], [".modes.set.normal"]` | Default keybinding: `` a-` `` (kakoune: normal) -`` s-` `` (helix: normal; helix: select) +`` s-` `` (helix: normal) -### [`edit.replaceCharacters`](../edit.ts#L225-L234) +### [`edit.replaceCharacters`](../edit.ts#L245-L257) Replace characters. +| Keybindings | Commands | +| ----------- | -------- | +| `r` (helix: select) | `[".edit.replaceCharacters"], [".modes.set.normal"]` | This command: - may be repeated with a given number of repetitions. @@ -416,7 +438,7 @@ Default keybinding: `r` (core: normal) -### [`edit.align`](../edit.ts#L277-L285) +### [`edit.align`](../edit.ts#L300-L308) Align selections. @@ -431,7 +453,7 @@ Default keybinding: `&` (core: normal) -### [`edit.copyIndentation`](../edit.ts#L335-L348) +### [`edit.copyIndentation`](../edit.ts#L358-L371) Copy indentation. @@ -446,7 +468,7 @@ Default keybinding: `a-&` (kakoune: normal) -### [`edit.newLine.above`](../edit.ts#L377-L395) +### [`edit.newLine.above`](../edit.ts#L400-L418) Insert new line above each selection. @@ -468,7 +490,7 @@ Default keybinding: `s-a-o` (kakoune: normal) -### [`edit.newLine.below`](../edit.ts#L415-L433) +### [`edit.newLine.below`](../edit.ts#L438-L456) Insert new line below each selection. @@ -1386,19 +1408,22 @@ Interacting with selections. -### [`selections.saveText`](../selections.ts#L21-L30) +### [`selections.saveText`](../selections.ts#L21-L33) Copy selections text. +| Keybindings | Commands | +| ----------- | -------- | +| `y` (helix: select) | `[".selections.saveText"], [".modes.set.normal"]` | This command: - accepts a register (by default, it uses `dquote`). -Default keybinding: `y` (core: normal; helix: select) +Default keybinding: `y` (core: normal) -### [`selections.save`](../selections.ts#L34-L48) +### [`selections.save`](../selections.ts#L37-L51) Save selections. @@ -1413,7 +1438,7 @@ Default keybinding: `s-z` (kakoune: normal) -### [`selections.restore`](../selections.ts#L95-L103) +### [`selections.restore`](../selections.ts#L98-L106) Restore selections. @@ -1425,7 +1450,7 @@ Default keybinding: `z` (kakoune: normal) -### [`selections.restore.withCurrent`](../selections.ts#L115-L135) +### [`selections.restore.withCurrent`](../selections.ts#L118-L138) Combine register selections with current ones. @@ -1447,7 +1472,7 @@ Default keybinding: `a-z` (kakoune: normal) -### [`selections.pipe`](../selections.ts#L241-L262) +### [`selections.pipe`](../selections.ts#L244-L265) Pipe selections. @@ -1472,7 +1497,7 @@ Default keybinding: `a-|` (core: normal; helix: select) -### [`selections.filter`](../selections.ts#L290-L311) +### [`selections.filter`](../selections.ts#L293-L314) Filter selections. @@ -1496,7 +1521,7 @@ Default keybinding: `$` (core: normal; helix: select) -### [`selections.select`](../selections.ts#L344-L358) +### [`selections.select`](../selections.ts#L347-L361) Select within selections. @@ -1512,7 +1537,7 @@ This command: -### [`selections.split`](../selections.ts#L377-L388) +### [`selections.split`](../selections.ts#L380-L391) Split selections. @@ -1526,7 +1551,7 @@ Default keybinding: `s-s` (core: normal; helix: select) -### [`selections.splitLines`](../selections.ts#L413-L429) +### [`selections.splitLines`](../selections.ts#L416-L432) Split selections at line boundaries. @@ -1542,7 +1567,7 @@ This command: -### [`selections.expandToLines`](../selections.ts#L472-L479) +### [`selections.expandToLines`](../selections.ts#L475-L482) Expand to lines. @@ -1555,7 +1580,7 @@ Default keybinding: `x` (kakoune: normal) -### [`selections.trimLines`](../selections.ts#L506-L513) +### [`selections.trimLines`](../selections.ts#L509-L516) Trim lines. @@ -1567,7 +1592,7 @@ Default keybinding: `a-x` (core: normal; helix: select) -### [`selections.trimWhitespace`](../selections.ts#L538-L545) +### [`selections.trimWhitespace`](../selections.ts#L541-L548) Trim whitespace. @@ -1579,7 +1604,7 @@ Default keybinding: `_` (core: normal; helix: select) -### [`selections.reduce`](../selections.ts#L564-L583) +### [`selections.reduce`](../selections.ts#L567-L586) Reduce selections to their cursor. @@ -1599,7 +1624,7 @@ Default keybinding: `;` (core: normal; helix: select) -### [`selections.changeDirection`](../selections.ts#L645-L660) +### [`selections.changeDirection`](../selections.ts#L648-L663) Change direction of selections. @@ -1617,7 +1642,7 @@ Default keybinding: `a-;` (core: normal; helix: select) -### [`selections.changeOrder`](../selections.ts#L685-L699) +### [`selections.changeOrder`](../selections.ts#L688-L702) Reverse selections. @@ -1631,7 +1656,7 @@ Reverse selections. -### [`selections.sort`](../selections.ts#L712-L724) +### [`selections.sort`](../selections.ts#L715-L727) Sort selections. @@ -1642,7 +1667,7 @@ This command: -### [`selections.copy`](../selections.ts#L797-L815) +### [`selections.copy`](../selections.ts#L800-L818) Copy selections below. @@ -1660,7 +1685,7 @@ Default keybinding: `s-c` (core: normal; helix: select) -### [`selections.merge`](../selections.ts#L849-L854) +### [`selections.merge`](../selections.ts#L852-L857) Merge contiguous selections. @@ -1670,13 +1695,13 @@ Default keybinding: `a-_` (kakoune: normal) -### [`selections.open`](../selections.ts#L858-L861) +### [`selections.open`](../selections.ts#L861-L864) Open selected file. -### [`selections.toggleIndices`](../selections.ts#L874-L891) +### [`selections.toggleIndices`](../selections.ts#L877-L894) Toggle selection indices. diff --git a/src/commands/selections.ts b/src/commands/selections.ts index f9842622..e2424b38 100644 --- a/src/commands/selections.ts +++ b/src/commands/selections.ts @@ -21,7 +21,10 @@ declare module "./selections"; /** * Copy selections text. * - * @keys `y` (core: normal; helix: select) + * @keys `y` (core: normal) + * | Keybindings | Commands | + * | ----------- | -------- | + * | `y` (helix: select) | `[".selections.saveText"], [".modes.set.normal"]` | */ export function saveText( document: vscode.TextDocument, From 257713d74c9a845eb9afdade33aec65e3c6628c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Geis?= Date: Sat, 8 Mar 2025 19:53:54 +0900 Subject: [PATCH 16/16] remove symlinks And: - Update LICENSE to ~2025. - Add purple Dance logo for Helix. --- LICENSE | 2 +- extensions/helix/LICENSE | 6 +++++- extensions/helix/README.md | 4 +++- extensions/helix/assets | 1 - extensions/helix/assets/dance.png | Bin 0 -> 137075 bytes 5 files changed, 9 insertions(+), 4 deletions(-) mode change 120000 => 100644 extensions/helix/LICENSE mode change 120000 => 100644 extensions/helix/README.md delete mode 120000 extensions/helix/assets create mode 100644 extensions/helix/assets/dance.png diff --git a/LICENSE b/LICENSE index 3155ccf3..827ae984 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2020-2021 Grégoire Geis +Copyright 2020-2025 Grégoire Geis Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. diff --git a/extensions/helix/LICENSE b/extensions/helix/LICENSE deleted file mode 120000 index 30cff740..00000000 --- a/extensions/helix/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../LICENSE \ No newline at end of file diff --git a/extensions/helix/LICENSE b/extensions/helix/LICENSE new file mode 100644 index 00000000..827ae984 --- /dev/null +++ b/extensions/helix/LICENSE @@ -0,0 +1,5 @@ +Copyright 2020-2025 Grégoire Geis + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/extensions/helix/README.md b/extensions/helix/README.md deleted file mode 120000 index fe840054..00000000 --- a/extensions/helix/README.md +++ /dev/null @@ -1 +0,0 @@ -../../README.md \ No newline at end of file diff --git a/extensions/helix/README.md b/extensions/helix/README.md new file mode 100644 index 00000000..7cec1dcd --- /dev/null +++ b/extensions/helix/README.md @@ -0,0 +1,3 @@ +# Dance - Helix keybindings + +Helix keybindings for VS Code based on [Dance](https://github.com/71/dance). diff --git a/extensions/helix/assets b/extensions/helix/assets deleted file mode 120000 index 41aef43f..00000000 --- a/extensions/helix/assets +++ /dev/null @@ -1 +0,0 @@ -../../assets \ No newline at end of file diff --git a/extensions/helix/assets/dance.png b/extensions/helix/assets/dance.png new file mode 100644 index 0000000000000000000000000000000000000000..7a9cd74c5621caa28455801ea25248e97aa41d69 GIT binary patch literal 137075 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