Skip to content

Commit 33e2bc8

Browse files
authored
keyboard: Support "inside" and "bounds" (#2417)
- Fixes #993 ## Checklist - [x] I have added [tests](https://www.cursorless.org/docs/contributing/test-case-recorder/) - [-] I have updated the [docs](https://github.com/cursorless-dev/cursorless/tree/main/docs) and [cheatsheet](https://github.com/cursorless-dev/cursorless/tree/main/cursorless-talon/src/cheatsheet) - [-] I have not broken the cheatsheet
1 parent 5f94e08 commit 33e2bc8

File tree

7 files changed

+33
-2
lines changed

7 files changed

+33
-2
lines changed

packages/cursorless-vscode-e2e/src/suite/keyboard/basic.vscode.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ const testCases: TestCase[] = [
6262
keySequence: ["dw", "wj", "c"],
6363
finalContent: "a + + b",
6464
},
65+
{
66+
name: "inside",
67+
initialContent: "(aaa)",
68+
// change inside air
69+
keySequence: ["da", "mi", "c"],
70+
finalContent: "()",
71+
},
6572
{
6673
name: "wrap",
6774
initialContent: "a",

packages/cursorless-vscode/src/keyboard/TokenTypes.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export interface SectionTypes {
2020
vscodeCommand: ModalVscodeCommandDescriptor;
2121
modifier: ModifierType;
2222
}
23-
type ModifierType = "nextPrev" | "every";
23+
type ModifierType = "nextPrev" | "every" | "interiorOnly" | "excludeInterior";
2424
export type MiscValue =
2525
| "combineColorAndShape"
2626
| "makeRange"
@@ -65,6 +65,7 @@ export interface TokenTypeValueMap {
6565
// modifier config section
6666
nextPrev: "nextPrev";
6767
every: "every";
68+
simpleModifier: "interiorOnly" | "excludeInterior";
6869

6970
digit: number;
7071
}

packages/cursorless-vscode/src/keyboard/getTokenTypeKeyMaps.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ export function getTokenTypeKeyMaps(
6868
// modifier config section
6969
every: config.getTokenKeyMap("every", "modifier", only("every")),
7070
nextPrev: config.getTokenKeyMap("nextPrev", "modifier", only("nextPrev")),
71+
simpleModifier: config.getTokenKeyMap(
72+
"simpleModifier",
73+
"modifier",
74+
only("interiorOnly", "excludeInterior"),
75+
),
7176

7277
digit: Object.fromEntries(
7378
range(10).map((value) => [

packages/cursorless-vscode/src/keyboard/grammar/generated/grammar.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ declare var simpleAction: any;
99
declare var wrap: any;
1010
declare var pairedDelimiter: any;
1111
declare var vscodeCommand: any;
12+
declare var simpleModifier: any;
1213
declare var every: any;
1314
declare var nextPrev: any;
1415
declare var simpleScopeTypeType: any;
@@ -69,6 +70,7 @@ const grammar: Grammar = {
6970
command("performWrapActionOnTarget", ["actionDescriptor", "delimiter"])
7071
},
7172
{"name": "main", "symbols": [(keyboardLexer.has("vscodeCommand") ? {type: "vscodeCommand"} : vscodeCommand)], "postprocess": command("vscodeCommand", ["command"])},
73+
{"name": "modifier", "symbols": [(keyboardLexer.has("simpleModifier") ? {type: "simpleModifier"} : simpleModifier)], "postprocess": capture({ type: $0 })},
7274
{"name": "modifier", "symbols": ["scopeType"], "postprocess": capture({ type: "containingScope", scopeType: $0 })},
7375
{"name": "modifier", "symbols": [(keyboardLexer.has("every") ? {type: "every"} : every), "scopeType"], "postprocess": capture({ type: "everyScope", scopeType: $1 })},
7476
{"name": "modifier$ebnf$1", "symbols": ["offset"], "postprocess": id},

packages/cursorless-vscode/src/keyboard/grammar/grammar.ne

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ main -> %vscodeCommand {% command("vscodeCommand", ["command"]) %}
4747

4848
# --------------------------- Modifiers ---------------------------
4949

50+
# "inside", "bounds"
51+
modifier -> %simpleModifier {% capture({ type: $0 }) %}
52+
5053
# "funk"
5154
modifier -> scopeType {% capture({ type: "containingScope", scopeType: $0 }) %}
5255

packages/cursorless-vscode/src/keyboard/grammar/grammar.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,17 @@ const testCases: TestCase[] = [
128128
type: "modifyTarget",
129129
},
130130
},
131+
{
132+
tokens: [{ type: "simpleModifier", value: "excludeInterior" }],
133+
expected: {
134+
arg: {
135+
modifier: {
136+
type: "excludeInterior",
137+
},
138+
},
139+
type: "modifyTarget",
140+
},
141+
},
131142
{
132143
tokens: [
133144
{

packages/cursorless-vscode/src/keyboard/keyboard-config.fixture.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@
6767
},
6868
"cursorless.experimental.keyboard.modal.keybindings.modifier": {
6969
"n": "nextPrev",
70-
"*": "every"
70+
"*": "every",
71+
"mi": "interiorOnly",
72+
"mb": "excludeInterior"
7173
},
7274
"cursorless.experimental.keyboard.modal.keybindings.vscodeCommand": {
7375
"va": "editor.action.addCommentLine",

0 commit comments

Comments
 (0)