From eb733d6b19c7f3a7e99469aab49ae7bb449c4ac7 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 5 Dec 2023 15:39:38 +0100 Subject: [PATCH 1/5] Added visible modifier --- cursorless-talon/src/spoken_forms.json | 3 +- .../command/PartialTargetDescriptor.types.ts | 5 +++ .../ModifierStageFactoryImpl.ts | 3 ++ .../processTargets/modifiers/VisibleStage.ts | 19 +++++++++++ .../spokenForms/defaultSpokenFormMapCore.ts | 1 + .../recorded/modifiers/changeVisible.yml | 29 ++++++++++++++++ .../recorded/modifiers/changeVisible2.yml | 33 +++++++++++++++++++ 7 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 packages/cursorless-engine/src/processTargets/modifiers/VisibleStage.ts create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible2.yml diff --git a/cursorless-talon/src/spoken_forms.json b/cursorless-talon/src/spoken_forms.json index 886a5d38b6..47bbfa6081 100644 --- a/cursorless-talon/src/spoken_forms.json +++ b/cursorless-talon/src/spoken_forms.json @@ -76,7 +76,8 @@ "trailing": "trailing", "content": "keepContentFilter", "empty": "keepEmptyFilter", - "its": "inferPreviousMark" + "its": "inferPreviousMark", + "visible": "visible" }, "simple_scope_modifier": { "every": "every" }, "interior_modifier": { diff --git a/packages/common/src/types/command/PartialTargetDescriptor.types.ts b/packages/common/src/types/command/PartialTargetDescriptor.types.ts index b6a35d243e..0a5293046e 100644 --- a/packages/common/src/types/command/PartialTargetDescriptor.types.ts +++ b/packages/common/src/types/command/PartialTargetDescriptor.types.ts @@ -232,6 +232,10 @@ export interface ExcludeInteriorModifier { type: "excludeInterior"; } +export interface VisibleModifier { + type: "visible"; +} + export interface ContainingScopeModifier { type: "containingScope"; scopeType: ScopeType; @@ -375,6 +379,7 @@ export type Modifier = | EndOfModifier | InteriorOnlyModifier | ExcludeInteriorModifier + | VisibleModifier | ContainingScopeModifier | EveryScopeModifier | OrdinalScopeModifier diff --git a/packages/cursorless-engine/src/processTargets/ModifierStageFactoryImpl.ts b/packages/cursorless-engine/src/processTargets/ModifierStageFactoryImpl.ts index 7f8c7ae2f5..24e0bd3a70 100644 --- a/packages/cursorless-engine/src/processTargets/ModifierStageFactoryImpl.ts +++ b/packages/cursorless-engine/src/processTargets/ModifierStageFactoryImpl.ts @@ -30,6 +30,7 @@ import { RangeModifierStage } from "./modifiers/RangeModifierStage"; import { RawSelectionStage } from "./modifiers/RawSelectionStage"; import { RelativeScopeStage } from "./modifiers/RelativeScopeStage"; import { SurroundingPairStage } from "./modifiers/SurroundingPairStage"; +import { VisibleStage } from "./modifiers/VisibleStage"; import { ScopeHandlerFactory } from "./modifiers/scopeHandlers/ScopeHandlerFactory"; import { BoundedNonWhitespaceSequenceStage } from "./modifiers/scopeTypeStages/BoundedNonWhitespaceStage"; import { @@ -68,6 +69,8 @@ export class ModifierStageFactoryImpl implements ModifierStageFactory { return new LeadingStage(this, modifier); case "trailing": return new TrailingStage(this, modifier); + case "visible": + return new VisibleStage(modifier); case "containingScope": return new ContainingScopeStage( this, diff --git a/packages/cursorless-engine/src/processTargets/modifiers/VisibleStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/VisibleStage.ts new file mode 100644 index 0000000000..f5cd56fdc1 --- /dev/null +++ b/packages/cursorless-engine/src/processTargets/modifiers/VisibleStage.ts @@ -0,0 +1,19 @@ +import { VisibleModifier } from "@cursorless/common"; +import { Target } from "../../typings/target.types"; +import { ModifierStage } from "../PipelineStages.types"; +import { PlainTarget } from "../targets"; + +export class VisibleStage implements ModifierStage { + constructor(private modifier: VisibleModifier) {} + + run(target: Target): Target[] { + return target.editor.visibleRanges.map( + (range) => + new PlainTarget({ + editor: target.editor, + isReversed: target.isReversed, + contentRange: range, + }), + ); + } +} diff --git a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts b/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts index e5ab822428..15b4e5ee2b 100644 --- a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts +++ b/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts @@ -117,6 +117,7 @@ export const defaultSpokenFormMapCore: DefaultSpokenFormMapDefinition = { startOf: "start of", endOf: "end of", interiorOnly: "inside", + visible: "visible", extendThroughStartOf: "head", extendThroughEndOf: "tail", everyScope: "every", diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml new file mode 100644 index 0000000000..8f827d6216 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml @@ -0,0 +1,29 @@ +languageId: typescript +command: + version: 6 + spokenForm: change visible + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - {type: visible} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + // Hello + + function helloWorld() { + // Hello + } + + // Hello + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: "" + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible2.yml new file mode 100644 index 0000000000..240ccd3426 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible2.yml @@ -0,0 +1,33 @@ +languageId: typescript +command: + version: 6 + spokenForm: change visible + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - {type: visible} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + // Hello + + function helloWorld() { + // Hello + } + + // Hello + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: |2 + + // Hello + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + - anchor: {line: 2, character: 0} + active: {line: 2, character: 0} From 624f77cc5852167af31003dafd2d60ee6a7e0cd8 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 5 Dec 2023 15:50:17 +0100 Subject: [PATCH 2/5] Remove test --- .../recorded/modifiers/changeVisible.yml | 6 ++-- .../recorded/modifiers/changeVisible2.yml | 33 ------------------- 2 files changed, 3 insertions(+), 36 deletions(-) delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible2.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml index 8f827d6216..2223bf4c43 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml @@ -11,13 +11,13 @@ command: usePrePhraseSnapshot: true initialState: documentContents: |- - // Hello + // 1 function helloWorld() { - // Hello + // 2 } - // Hello + // 3 selections: - anchor: {line: 0, character: 0} active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible2.yml deleted file mode 100644 index 240ccd3426..0000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change visible - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - {type: visible} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - // Hello - - function helloWorld() { - // Hello - } - - // Hello - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |2 - - // Hello - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 2, character: 0} - active: {line: 2, character: 0} From 39324009e34a729b964fc1bd53e89a06ad22a98c Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 5 Dec 2023 16:15:08 +0100 Subject: [PATCH 3/5] Added manual test --- .../recorded/modifiers/changeVisible.yml | 29 --------- .../src/suite/visible.vscode.test.ts | 65 +++++++++++++++++++ 2 files changed, 65 insertions(+), 29 deletions(-) delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml deleted file mode 100644 index 2223bf4c43..0000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change visible - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - {type: visible} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - // 1 - - function helloWorld() { - // 2 - } - - // 3 - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: "" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts new file mode 100644 index 0000000000..c78bd3874e --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts @@ -0,0 +1,65 @@ +import * as assert from "assert"; +import * as vscode from "vscode"; +import { openNewEditor } from "@cursorless/vscode-common"; +import { endToEndTestSetup } from "../endToEndTestSetup"; +import { runCursorlessCommand } from "@cursorless/vscode-common"; + +suite("visible", async function () { + endToEndTestSetup(this); + + test("visible single region", testSingleRegion); + test("visible multiple regions", testMultipleRegions); +}); + +async function testSingleRegion() { + const editor = await openEditor(); + + await clearVisible(); + + assert.equal(editor.document.getText(), ""); +} + +async function testMultipleRegions() { + const editor = await openEditor(); + + await foldRegion(); + + assert.equal(editor.visibleRanges.length, 2); + + await clearVisible(); + + assert.equal(editor.selections.length, 2); + + assert.equal(editor.document.getText(), "\n\t// 2\n"); +} + +function openEditor() { + return openNewEditor("// 1\n\nfunction myFunk() {\n\t// 2\n}\n\n// 3", { + languageId: "typescript", + }); +} + +function foldRegion() { + return vscode.commands.executeCommand("editor.fold", { + levels: 1, + direction: "down", + selectionLines: [2], + }); +} + +function clearVisible() { + return runCursorlessCommand({ + version: 6, + usePrePhraseSnapshot: false, + action: { + name: "clearAndSetSelection", + target: { + type: "primitive", + mark: { + type: "cursor", + }, + modifiers: [{ type: "visible" }], + }, + }, + }); +} From 031ad094d51a38b8dc9ba1d41a9d70f9a1042b5b Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 5 Dec 2023 16:29:30 +0100 Subject: [PATCH 4/5] Update test --- .../src/suite/visible.vscode.test.ts | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts index c78bd3874e..0567aa4936 100644 --- a/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts +++ b/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts @@ -7,18 +7,9 @@ import { runCursorlessCommand } from "@cursorless/vscode-common"; suite("visible", async function () { endToEndTestSetup(this); - test("visible single region", testSingleRegion); test("visible multiple regions", testMultipleRegions); }); -async function testSingleRegion() { - const editor = await openEditor(); - - await clearVisible(); - - assert.equal(editor.document.getText(), ""); -} - async function testMultipleRegions() { const editor = await openEditor(); @@ -30,11 +21,21 @@ async function testMultipleRegions() { assert.equal(editor.selections.length, 2); - assert.equal(editor.document.getText(), "\n\t// 2\n"); + assert.equal(editor.document.getText(), "\n // 2\n"); } +const content = ` +// 1 + +function myFunk() { + // 2 +} + +// 3 +`; + function openEditor() { - return openNewEditor("// 1\n\nfunction myFunk() {\n\t// 2\n}\n\n// 3", { + return openNewEditor(content, { languageId: "typescript", }); } @@ -43,7 +44,7 @@ function foldRegion() { return vscode.commands.executeCommand("editor.fold", { levels: 1, direction: "down", - selectionLines: [2], + selectionLines: [3], }); } From 9fb2ce4e40d7bc427fea339628771b2fc1330a85 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 5 Dec 2023 16:31:11 +0100 Subject: [PATCH 5/5] Added test --- .../recorded/modifiers/changeVisible.yml | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml new file mode 100644 index 0000000000..8f827d6216 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml @@ -0,0 +1,29 @@ +languageId: typescript +command: + version: 6 + spokenForm: change visible + action: + name: clearAndSetSelection + target: + type: primitive + modifiers: + - {type: visible} + usePrePhraseSnapshot: true +initialState: + documentContents: |- + // Hello + + function helloWorld() { + // Hello + } + + // Hello + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: "" + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0}