Skip to content

Commit 945d5aa

Browse files
authored
Add simple headTail modifier (#2428)
- Fixes #2093 Only supports "head" applied to a single modifier. Eg doesn't support "head inside curly". Let's see how annoying that is in practice ## 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 d9fed92 commit 945d5aa

File tree

6 files changed

+45
-2
lines changed

6 files changed

+45
-2
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,13 @@ export interface SectionTypes {
2020
vscodeCommand: ModalVscodeCommandDescriptor;
2121
modifier: ModifierType;
2222
}
23-
type ModifierType = "nextPrev" | "every" | "interiorOnly" | "excludeInterior";
23+
type ModifierType =
24+
| "nextPrev"
25+
| "every"
26+
| "interiorOnly"
27+
| "excludeInterior"
28+
| "extendThroughStartOf"
29+
| "extendThroughEndOf";
2430
export type MiscValue =
2531
| "combineColorAndShape"
2632
| "makeRange"
@@ -65,6 +71,7 @@ export interface TokenTypeValueMap {
6571
// modifier config section
6672
nextPrev: "nextPrev";
6773
every: "every";
74+
headTail: "extendThroughStartOf" | "extendThroughEndOf";
6875
simpleModifier: "interiorOnly" | "excludeInterior";
6976

7077
digit: number;

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+
headTail: config.getTokenKeyMap(
72+
"headTail",
73+
"modifier",
74+
only("extendThroughStartOf", "extendThroughEndOf"),
75+
),
7176
simpleModifier: config.getTokenKeyMap(
7277
"simpleModifier",
7378
"modifier",

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ declare var wrap: any;
1010
declare var pairedDelimiter: any;
1111
declare var vscodeCommand: any;
1212
declare var simpleModifier: any;
13+
declare var headTail: any;
1314
declare var every: any;
1415
declare var nextPrev: any;
1516
declare var simpleScopeTypeType: any;
@@ -73,6 +74,9 @@ const grammar: Grammar = {
7374
},
7475
{"name": "main", "symbols": [(keyboardLexer.has("vscodeCommand") ? {type: "vscodeCommand"} : vscodeCommand)], "postprocess": command("vscodeCommand", ["command"])},
7576
{"name": "modifier", "symbols": [(keyboardLexer.has("simpleModifier") ? {type: "simpleModifier"} : simpleModifier)], "postprocess": capture({ type: $0 })},
77+
{"name": "modifier", "symbols": [(keyboardLexer.has("headTail") ? {type: "headTail"} : headTail), "modifier"], "postprocess":
78+
([type, modifier]) => ({ type, modifiers: [modifier] })
79+
},
7680
{"name": "modifier", "symbols": ["scopeType"], "postprocess": capture({ type: "containingScope", scopeType: $0 })},
7781
{"name": "modifier", "symbols": [(keyboardLexer.has("every") ? {type: "every"} : every), "scopeType"], "postprocess": capture({ type: "everyScope", scopeType: $1 })},
7882
{"name": "modifier$ebnf$1", "symbols": ["offset"], "postprocess": id},

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ main -> %vscodeCommand {% command("vscodeCommand", ["command"]) %}
5252
# "inside", "bounds"
5353
modifier -> %simpleModifier {% capture({ type: $0 }) %}
5454

55+
# "head" / "tail"
56+
# FIXME: Support "head inside curly" (ie multiple modifiers)
57+
modifier -> %headTail modifier {%
58+
([type, modifier]) => ({ type, modifiers: [modifier] })
59+
%}
60+
5561
# "funk"
5662
modifier -> scopeType {% capture({ type: "containingScope", scopeType: $0 }) %}
5763

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,25 @@ const testCases: TestCase[] = [
139139
type: "modifyTarget",
140140
},
141141
},
142+
{
143+
tokens: [
144+
{ type: "headTail", value: "extendThroughStartOf" },
145+
{ type: "simpleModifier", value: "excludeInterior" },
146+
],
147+
expected: {
148+
arg: {
149+
modifier: {
150+
type: "extendThroughStartOf",
151+
modifiers: [
152+
{
153+
type: "excludeInterior",
154+
},
155+
],
156+
},
157+
},
158+
type: "modifyTarget",
159+
},
160+
},
142161
{
143162
tokens: [
144163
{

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@
6969
"n": "nextPrev",
7070
"*": "every",
7171
"mi": "interiorOnly",
72-
"mb": "excludeInterior"
72+
"mb": "excludeInterior",
73+
"mh": "extendThroughStartOf",
74+
"mt": "extendThroughEndOf"
7375
},
7476
"cursorless.experimental.keyboard.modal.keybindings.vscodeCommand": {
7577
"va": "editor.action.addCommentLine",

0 commit comments

Comments
 (0)