Skip to content

Commit 11037ef

Browse files
jarestypokey
andauthored
Split define action (#2392)
This pull request adds a command to split the window and follow in one command. ## 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 97d8ee8 commit 11037ef

File tree

12 files changed

+108
-54
lines changed

12 files changed

+108
-54
lines changed

cursorless-talon/src/spoken_forms.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"float": "insertEmptyLineAfter",
2424
"fold": "foldRegion",
2525
"follow": "followLink",
26+
"follow split": "followLinkAside",
2627
"give": "deselect",
2728
"highlight": "highlight",
2829
"hover": "showHover",
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
languageId: typescript
2+
command:
3+
version: 7
4+
spokenForm: follow split vest
5+
action:
6+
name: followLinkAside
7+
target:
8+
type: primitive
9+
mark: {type: decoratedSymbol, symbolColor: default, character: v}
10+
usePrePhraseSnapshot: true
11+
initialState:
12+
documentContents: |2-
13+
const value = "value";
14+
console.log(value);
15+
selections:
16+
- anchor: {line: 1, character: 23}
17+
active: {line: 1, character: 23}
18+
marks:
19+
default.v:
20+
start: {line: 1, character: 16}
21+
end: {line: 1, character: 21}
22+
finalState:
23+
documentContents: |2-
24+
const value = "value";
25+
console.log(value);
26+
selections:
27+
- anchor: {line: 0, character: 10}
28+
active: {line: 0, character: 10}
29+
thatMark:
30+
- type: UntypedTarget
31+
contentRange:
32+
start: {line: 1, character: 16}
33+
end: {line: 1, character: 21}
34+
isReversed: false
35+
hasExplicitRange: true

packages/cheatsheet/src/lib/sampleSpokenFormInfos/defaults.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,16 @@
158158
}
159159
]
160160
},
161+
{
162+
"id": "followLinkAside",
163+
"type": "action",
164+
"variations": [
165+
{
166+
"spokenForm": "follow split <target>",
167+
"description": "Follow link aside"
168+
}
169+
]
170+
},
161171
{
162172
"id": "generateSnippet",
163173
"type": "action",

packages/common/src/types/TextEditor.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type {
22
Edit,
3-
Position,
43
Range,
54
RevealLineAt,
65
Selection,
@@ -58,6 +57,10 @@ export interface SetSelectionsOpts {
5857
revealRange?: boolean;
5958
}
6059

60+
export type OpenLinkOptions = {
61+
openAside: boolean;
62+
};
63+
6164
export interface EditableTextEditor extends TextEditor {
6265
/**
6366
* Set the selections in this text editor, optionally focusing the editor
@@ -122,9 +125,9 @@ export interface EditableTextEditor extends TextEditor {
122125
/**
123126
* Open link at location.
124127
* @param location Position or range
125-
* @return True if a link was opened
128+
* @param options Options for opening the link.
126129
*/
127-
openLink(location?: Position | Range): Promise<boolean>;
130+
openLink(range: Range, options?: OpenLinkOptions): Promise<void>;
128131

129132
/**
130133
* Fold ranges

packages/common/src/types/command/ActionDescriptor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const simpleActionNames = [
2222
"findInWorkspace",
2323
"foldRegion",
2424
"followLink",
25+
"followLinkAside",
2526
"increment",
2627
"indentLine",
2728
"insertCopyAfter",

packages/cursorless-engine/src/CommandHistory.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ function sanitizeActionInPlace(action: ActionDescriptor): void {
153153
case "findInWorkspace":
154154
case "foldRegion":
155155
case "followLink":
156+
case "followLinkAside":
156157
case "increment":
157158
case "indentLine":
158159
case "insertCopyAfter":

packages/cursorless-engine/src/actions/Actions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ export class Actions implements ActionRecord {
9494
findInDocument = new FindInDocument(this);
9595
findInWorkspace = new FindInWorkspace(this);
9696
foldRegion = new Fold(this.rangeUpdater);
97-
followLink = new FollowLink(this);
97+
followLink = new FollowLink({ openAside: false });
98+
followLinkAside = new FollowLink({ openAside: true });
9899
generateSnippet = new GenerateSnippet();
99100
getText = new GetText();
100101
highlight = new Highlight();

packages/cursorless-engine/src/actions/FollowLink.ts

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
import { FlashStyle } from "@cursorless/common";
1+
import { FlashStyle, OpenLinkOptions } from "@cursorless/common";
22
import { ide } from "../singletons/ide.singleton";
33
import { Target } from "../typings/target.types";
44
import {
55
createThatMark,
66
ensureSingleTarget,
77
flashTargets,
88
} from "../util/targetUtils";
9-
import { Actions } from "./Actions";
10-
import { SimpleAction, ActionReturnValue } from "./actions.types";
9+
import { ActionReturnValue, SimpleAction } from "./actions.types";
1110

1211
export default class FollowLink implements SimpleAction {
13-
constructor(private actions: Actions) {
12+
constructor(private options: OpenLinkOptions) {
1413
this.run = this.run.bind(this);
1514
}
1615

@@ -19,17 +18,9 @@ export default class FollowLink implements SimpleAction {
1918

2019
await flashTargets(ide(), targets, FlashStyle.referenced);
2120

22-
const openedLink = await ide()
21+
await ide()
2322
.getEditableTextEditor(target.editor)
24-
.openLink(target.contentRange);
25-
26-
if (!openedLink) {
27-
await this.actions.executeCommand.run(
28-
targets,
29-
"editor.action.revealDefinition",
30-
{ restoreSelection: false },
31-
);
32-
}
23+
.openLink(target.contentRange, this.options);
3324

3425
return {
3526
thatSelections: createThatMark(targets),

packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/actions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export const actions = {
2525
insertEmptyLineAfter: "float",
2626
foldRegion: "fold",
2727
followLink: "follow",
28+
followLinkAside: "follow split",
2829
deselect: "give",
2930
highlight: "highlight",
3031
showHover: "hover",

packages/cursorless-vscode/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,7 @@
883883
"findInWorkspace",
884884
"foldRegion",
885885
"followLink",
886+
"followLinkAside",
886887
"generateSnippet",
887888
"getText",
888889
"highlight",
@@ -943,6 +944,7 @@
943944
"findInWorkspace",
944945
"foldRegion",
945946
"followLink",
947+
"followLinkAside",
946948
"generateSnippet",
947949
"getText",
948950
"highlight",

0 commit comments

Comments
 (0)