diff --git a/cursorless-talon/src/spoken_forms.json b/cursorless-talon/src/spoken_forms.json index 249b75abcf..013857a84b 100644 --- a/cursorless-talon/src/spoken_forms.json +++ b/cursorless-talon/src/spoken_forms.json @@ -23,6 +23,7 @@ "drink": "editNewLineBefore", "drop": "insertEmptyLineBefore", "extract": "extractVariable", + "flash": "flashTargets", "float": "insertEmptyLineAfter", "fold": "foldRegion", "follow split": "followLinkAside", diff --git a/data/fixtures/recorded/actions/flashToken.yml b/data/fixtures/recorded/actions/flashToken.yml new file mode 100644 index 0000000000..2439c42d0a --- /dev/null +++ b/data/fixtures/recorded/actions/flashToken.yml @@ -0,0 +1,30 @@ +languageId: plaintext +command: + version: 7 + spokenForm: flash token + action: + name: flashTargets + target: + type: primitive + modifiers: + - type: containingScope + scopeType: {type: token} + usePrePhraseSnapshot: false +initialState: + documentContents: foo + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: foo + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + thatMark: + - type: TokenTarget + contentRange: + start: {line: 0, character: 0} + end: {line: 0, character: 3} + isReversed: false + hasExplicitRange: true diff --git a/packages/common/src/types/command/ActionDescriptor.ts b/packages/common/src/types/command/ActionDescriptor.ts index 8b067b37f2..c27a35f7ad 100644 --- a/packages/common/src/types/command/ActionDescriptor.ts +++ b/packages/common/src/types/command/ActionDescriptor.ts @@ -23,6 +23,7 @@ export const simpleActionNames = [ "extractVariable", "findInDocument", "findInWorkspace", + "flashTargets", "foldRegion", "followLink", "followLinkAside", diff --git a/packages/cursorless-engine/src/CommandHistory.ts b/packages/cursorless-engine/src/CommandHistory.ts index 65a148539c..4162f03b3a 100644 --- a/packages/cursorless-engine/src/CommandHistory.ts +++ b/packages/cursorless-engine/src/CommandHistory.ts @@ -134,19 +134,26 @@ function sanitizeActionInPlace(action: ActionDescriptor): void { case "addSelectionAfter": case "addSelectionBefore": case "breakLine": + case "callAsFunction": case "clearAndSetSelection": case "copyToClipboard": case "cutToClipboard": case "decrement": case "deselect": + case "editNew": case "editNewLineAfter": case "editNewLineBefore": case "experimental.setInstanceReference": case "extractVariable": + case "findInDocument": case "findInWorkspace": + case "flashTargets": case "foldRegion": case "followLink": case "followLinkAside": + case "generateSnippet": + case "getText": + case "highlight": case "increment": case "indentLine": case "insertCopyAfter": @@ -155,13 +162,21 @@ function sanitizeActionInPlace(action: ActionDescriptor): void { case "insertEmptyLineBefore": case "insertEmptyLinesAround": case "joinLines": + case "moveToTarget": case "outdentLine": + case "parsed": + case "pasteFromClipboard": + case "private.getTargets": + case "private.setKeyboardTarget": + case "private.showParseTree": case "randomizeTargets": case "remove": case "rename": + case "replaceWithTarget": case "revealDefinition": case "revealTypeDefinition": case "reverseTargets": + case "rewrapWithPairedDelimiter": case "scrollToBottom": case "scrollToCenter": case "scrollToTop": @@ -173,25 +188,11 @@ function sanitizeActionInPlace(action: ActionDescriptor): void { case "showQuickFix": case "showReferences": case "sortTargets": + case "swapTargets": case "toggleLineBreakpoint": case "toggleLineComment": case "unfoldRegion": - case "private.showParseTree": - case "private.getTargets": - case "callAsFunction": - case "editNew": - case "generateSnippet": - case "getText": - case "highlight": - case "moveToTarget": - case "pasteFromClipboard": - case "replaceWithTarget": - case "rewrapWithPairedDelimiter": - case "swapTargets": case "wrapWithPairedDelimiter": - case "findInDocument": - case "private.setKeyboardTarget": - case "parsed": break; default: { diff --git a/packages/cursorless-engine/src/actions/Actions.ts b/packages/cursorless-engine/src/actions/Actions.ts index 3bdd24e28c..3566916a68 100644 --- a/packages/cursorless-engine/src/actions/Actions.ts +++ b/packages/cursorless-engine/src/actions/Actions.ts @@ -13,6 +13,7 @@ import { EditNew } from "./EditNew"; import { EditNewAfter, EditNewBefore } from "./EditNewLineAction"; import ExecuteCommand from "./ExecuteCommand"; import { FindInDocument, FindInWorkspace } from "./Find"; +import { FlashTargets } from "./FlashTargets"; import FollowLink from "./FollowLink"; import GenerateSnippet from "./GenerateSnippet"; import GetTargets from "./GetTargets"; @@ -98,6 +99,7 @@ export class Actions implements ActionRecord { extractVariable = new ExtractVariable(this.rangeUpdater); findInDocument = new FindInDocument(this); findInWorkspace = new FindInWorkspace(this); + flashTargets = new FlashTargets(); foldRegion = new Fold(this.rangeUpdater); followLink = new FollowLink({ openAside: false }); followLinkAside = new FollowLink({ openAside: true }); diff --git a/packages/cursorless-engine/src/actions/FlashTargets.ts b/packages/cursorless-engine/src/actions/FlashTargets.ts new file mode 100644 index 0000000000..a336dd72c3 --- /dev/null +++ b/packages/cursorless-engine/src/actions/FlashTargets.ts @@ -0,0 +1,17 @@ +import { FlashStyle } from "@cursorless/common"; +import { ide } from "../singletons/ide.singleton"; +import type { Target } from "../typings/target.types"; +import { flashTargets } from "../util/targetUtils"; +import type { ActionReturnValue, SimpleAction } from "./actions.types"; + +export class FlashTargets implements SimpleAction { + constructor() { + this.run = this.run.bind(this); + } + + async run(targets: Target[]): Promise { + await flashTargets(ide(), targets, FlashStyle.referenced); + + return { thatTargets: targets }; + } +} diff --git a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts b/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts index c9a2661173..5c85732876 100644 --- a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts +++ b/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts @@ -169,6 +169,7 @@ export const defaultSpokenFormMapCore: DefaultSpokenFormMapDefinition = { foldRegion: "fold", followLink: "follow", followLinkAside: "follow split", + flashTargets: "flash", deselect: "give", highlight: "highlight", showHover: "hover",