Skip to content

Commit 02e0b02

Browse files
Fixed bug with line number inference (#1774)
Fixes #1773 ## 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 --------- Co-authored-by: Pokey Rule <[email protected]>
1 parent 4588044 commit 02e0b02

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

packages/cursorless-engine/src/core/inferFullTargetDescriptor.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ function inferPrimitiveTarget(
110110
const modifiers =
111111
getPreservedModifiers(target) ??
112112
getPreviousPreservedModifiers(previousTargets) ??
113+
getPreviousLineNumberMarkModifiers(previousTargets) ??
113114
[];
114115

115116
return {
@@ -142,10 +143,15 @@ function getPreservedModifiers(
142143
target.modifiers?.filter(
143144
(modifier) => modifier.type !== "inferPreviousMark",
144145
) ?? [];
145-
if (preservedModifiers.length !== 0) {
146-
return preservedModifiers;
147-
}
148-
// In the absence of any other modifiers line number marks are infer as a containing line scope
146+
return preservedModifiers.length !== 0 ? preservedModifiers : undefined;
147+
}
148+
149+
/**
150+
* `"row five past air"` => `"row five past line air"`
151+
*/
152+
function getLineNumberMarkModifiers(
153+
target: PartialPrimitiveTargetDescriptor,
154+
): Modifier[] | undefined {
149155
if (isLineNumberMark(target)) {
150156
return [
151157
{
@@ -190,6 +196,15 @@ function getPreviousPreservedModifiers(
190196
return getPreviousTargetAttribute(previousTargets, getPreservedModifiers);
191197
}
192198

199+
function getPreviousLineNumberMarkModifiers(
200+
previousTargets: PartialTargetDescriptor[],
201+
): Modifier[] | undefined {
202+
return getPreviousTargetAttribute(
203+
previousTargets,
204+
getLineNumberMarkModifiers,
205+
);
206+
}
207+
193208
/**
194209
* Walks backward through the given targets and their descendants trying to find
195210
* the first target for which the given attribute extractor returns a
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
languageId: plaintext
2+
command:
3+
version: 6
4+
spokenForm: bring air to end of row two and row three
5+
action:
6+
name: replaceWithTarget
7+
source:
8+
type: primitive
9+
mark: {type: decoratedSymbol, symbolColor: default, character: a}
10+
destination:
11+
type: primitive
12+
insertionMode: to
13+
target:
14+
type: list
15+
elements:
16+
- type: primitive
17+
mark: {type: lineNumber, lineNumberType: modulo100, lineNumber: 1}
18+
modifiers:
19+
- {type: endOf}
20+
- type: primitive
21+
mark: {type: lineNumber, lineNumberType: modulo100, lineNumber: 2}
22+
usePrePhraseSnapshot: true
23+
initialState:
24+
documentContents: |
25+
a
26+
b
27+
c
28+
selections:
29+
- anchor: {line: 3, character: 0}
30+
active: {line: 3, character: 0}
31+
marks:
32+
default.a:
33+
start: {line: 0, character: 0}
34+
end: {line: 0, character: 1}
35+
finalState:
36+
documentContents: |
37+
a
38+
ba
39+
ca
40+
selections:
41+
- anchor: {line: 3, character: 0}
42+
active: {line: 3, character: 0}

0 commit comments

Comments
 (0)