Skip to content

Commit 0c4dd37

Browse files
committed
Tweaks
1 parent 1987f51 commit 0c4dd37

File tree

5 files changed

+67
-33
lines changed

5 files changed

+67
-33
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
languageId: lua
2+
command:
3+
version: 7
4+
spokenForm: change string
5+
action:
6+
name: clearAndSetSelection
7+
target:
8+
type: primitive
9+
modifiers:
10+
- type: containingScope
11+
scopeType: {type: surroundingPair, delimiter: string}
12+
usePrePhraseSnapshot: true
13+
initialState:
14+
documentContents: "[[aaa]]"
15+
selections:
16+
- anchor: {line: 0, character: 2}
17+
active: {line: 0, character: 2}
18+
marks: {}
19+
finalState:
20+
documentContents: ""
21+
selections:
22+
- anchor: {line: 0, character: 0}
23+
active: {line: 0, character: 0}

packages/cursorless-engine/src/processTargets/modifiers/surroundingPair/getDelimiterMaps.ts renamed to packages/cursorless-engine/src/processTargets/modifiers/surroundingPair/delimiterMaps.ts

+37-25
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import { unsafeKeys } from "../../../util/object";
66

77
type IndividualDelimiterText = string | string[];
88

9-
const delimiterToText: Record<
9+
type DelimiterMap = Record<
1010
SimpleSurroundingPairName,
1111
[IndividualDelimiterText, IndividualDelimiterText]
12-
> = Object.freeze({
12+
>;
13+
14+
const delimiterToText: DelimiterMap = Object.freeze({
1315
angleBrackets: [
1416
["</", "<"],
1517
[">", "/>"],
@@ -26,20 +28,22 @@ const delimiterToText: Record<
2628
squareBrackets: ["[", "]"],
2729
});
2830

29-
const delimiterToTextNix: Record<
30-
SimpleSurroundingPairName,
31-
[IndividualDelimiterText, IndividualDelimiterText]
32-
> = {
33-
...delimiterToText,
34-
singleQuotes: ["''", "''"],
35-
};
31+
// FIXME: Probably remove these as part of
32+
// https://github.com/cursorless-dev/cursorless/issues/1812#issuecomment-1691493746
33+
const delimiterToTextOverrides: Record<string, Partial<DelimiterMap>> = {
34+
nix: {
35+
singleQuotes: ["''", "''"],
36+
},
3637

37-
const delimiterToTextLua: Record<
38-
SimpleSurroundingPairName,
39-
[IndividualDelimiterText, IndividualDelimiterText]
40-
> = {
41-
...delimiterToText,
42-
// FIXME: Add [[ ]] somewhere
38+
lua: {
39+
// FIXME: Add special double square brackets
40+
// see https://github.com/cursorless-dev/cursorless/pull/2012#issuecomment-1808214409
41+
// see also https://github.com/cursorless-dev/cursorless/issues/1812#issuecomment-1691493746
42+
doubleQuotes: [
43+
['"', "[["],
44+
['"', "]]"],
45+
],
46+
},
4347
};
4448

4549
export const leftToRightMap: Record<string, string> = Object.fromEntries(
@@ -65,22 +69,30 @@ export const complexDelimiterMap: Record<
6569
};
6670

6771
/**
68-
* Given a language id, returns a list of all possible delimiters
69-
* for that language.
70-
* @param languageId The language id
72+
* Given a language id, returns a list of all possible delimiters for that
73+
* language.
74+
*
75+
* Allows us to support languages where the parse tree gives type names to nodes
76+
* that don't correspond to the actual delimiter.
77+
*
78+
* Note that we pass in `undefined` if we are in a text fragment, because then
79+
* we won't be using a parse tree.
80+
*
81+
* @param languageId The language id, or `undefined` if in a text fragment
7182
* @returns A list of all possible delimiters for that language
7283
*/
7384
export function getSimpleDelimiterMap(
74-
languageId: string,
85+
languageId: string | undefined,
7586
): Record<
7687
SimpleSurroundingPairName,
7788
[IndividualDelimiterText, IndividualDelimiterText]
7889
> {
79-
if (languageId == "nix") {
80-
return delimiterToTextNix;
81-
} else if (languageId == "lua") {
82-
return delimiterToTextLua;
83-
} else {
84-
return delimiterToText;
90+
if (languageId != null && languageId in delimiterToTextOverrides) {
91+
return {
92+
...delimiterToText,
93+
...delimiterToTextOverrides[languageId],
94+
};
8595
}
96+
97+
return delimiterToText;
8698
}

packages/cursorless-engine/src/processTargets/modifiers/surroundingPair/findSurroundingPairTextBased.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,7 @@ export function findSurroundingPairTextBased(
7474
const document: TextDocument = editor.document;
7575
const fullRange = allowableRange ?? document.range;
7676

77-
const individualDelimiters = getIndividualDelimiters(
78-
document.languageId,
79-
delimiters,
80-
);
77+
const individualDelimiters = getIndividualDelimiters(undefined, delimiters);
8178

8279
const delimiterTextToDelimiterInfoMap = Object.fromEntries(
8380
individualDelimiters.map((individualDelimiter) => [

packages/cursorless-engine/src/processTargets/modifiers/surroundingPair/getIndividualDelimiters.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import { SimpleSurroundingPairName, isString } from "@cursorless/common";
22
import { IndividualDelimiter } from "./types";
3-
import { getSimpleDelimiterMap } from "./getDelimiterMaps";
3+
import { getSimpleDelimiterMap } from "./delimiterMaps";
44
import { concat, uniq } from "lodash";
55

66
/**
77
* Given a list of delimiters, returns a list where each element corresponds to
88
* a single right or left delimiter. Each item contains information such as a
99
* reference to delimiter name, the text to expect, etc.
1010
*
11+
* @param languageId The language id, or `undefined` if in a text fragment
1112
* @param delimiters The delimiter names
12-
* @returns A list of information about all possible left / right delimiter instances
13+
* @returns A list of information about all possible left / right delimiter
14+
* instances
1315
*/
1416
export function getIndividualDelimiters(
15-
languageId: string,
17+
languageId: string | undefined,
1618
delimiters: SimpleSurroundingPairName[],
1719
): IndividualDelimiter[] {
1820
const delimiterToText = getSimpleDelimiterMap(languageId);

packages/cursorless-engine/src/processTargets/modifiers/surroundingPair/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { LanguageDefinitions } from "../../../languages/LanguageDefinitions";
77
import { Target } from "../../../typings/target.types";
88
import { SurroundingPairTarget } from "../../targets";
99
import { getContainingScopeTarget } from "../getContainingScopeTarget";
10-
import { complexDelimiterMap } from "./getDelimiterMaps";
10+
import { complexDelimiterMap } from "./delimiterMaps";
1111
import { SurroundingPairInfo } from "./extractSelectionFromSurroundingPairOffsets";
1212
import { findSurroundingPairParseTreeBased } from "./findSurroundingPairParseTreeBased";
1313
import { findSurroundingPairTextBased } from "./findSurroundingPairTextBased";

0 commit comments

Comments
 (0)