diff --git a/packages/app-web-docs/src/docs/contributing/private-scopes/interior.mdx b/packages/app-web-docs/src/docs/contributing/private-scopes/interior.mdx
index ce262114b0..7cdec957f1 100644
--- a/packages/app-web-docs/src/docs/contributing/private-scopes/interior.mdx
+++ b/packages/app-web-docs/src/docs/contributing/private-scopes/interior.mdx
@@ -670,7 +670,7 @@ The following are internal scopes. They are not intended for user interaction or
### Interior: Resource
-the body of a 'with' / 'use' / 'using' statement
+the body of a `with` / `use` / `using` statement
##### C#
diff --git a/packages/app-web-docs/src/docs/user/languages/csharp.mdx b/packages/app-web-docs/src/docs/user/languages/csharp.mdx
index e431731694..1f05e42ac3 100644
--- a/packages/app-web-docs/src/docs/user/languages/csharp.mdx
+++ b/packages/app-web-docs/src/docs/user/languages/csharp.mdx
@@ -692,7 +692,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 22. Name: Resource
-Name in a 'with' / 'use' / 'using' statement
+Name in a `with` / `use` / `using` statement
@@ -944,7 +944,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 22. Statement: Resource
-A 'with' / 'use' / 'using' statement
+A `with` / `use` / `using` statement
@@ -1130,7 +1130,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 15. Type: Resource
-Type in a 'with' / 'use' / 'using' statement
+Type in a `with` / `use` / `using` statement
@@ -1308,7 +1308,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 14. Value: Resource
-Value of a 'with' / 'use' / 'using' statement
+Value of a `with` / `use` / `using` statement
@@ -1510,7 +1510,7 @@ The following are internal scopes. They are not intended for user interaction or
#### 13. Interior: Resource
-the body of a 'with' / 'use' / 'using' statement
+the body of a `with` / `use` / `using` statement
diff --git a/packages/app-web-docs/src/docs/user/languages/java.mdx b/packages/app-web-docs/src/docs/user/languages/java.mdx
index 9f0da56c04..93aa5f954d 100644
--- a/packages/app-web-docs/src/docs/user/languages/java.mdx
+++ b/packages/app-web-docs/src/docs/user/languages/java.mdx
@@ -670,7 +670,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 18. Name: Resource
-Name in a 'with' / 'use' / 'using' statement
+Name in a `with` / `use` / `using` statement
@@ -902,7 +902,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 22. Statement: Resource
-A 'with' / 'use' / 'using' statement
+A `with` / `use` / `using` statement
@@ -1076,7 +1076,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 13. Type: Resource
-Type in a 'with' / 'use' / 'using' statement
+Type in a `with` / `use` / `using` statement
@@ -1202,7 +1202,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 7. Value: Resource
-Value of a 'with' / 'use' / 'using' statement
+Value of a `with` / `use` / `using` statement
@@ -1344,7 +1344,7 @@ The following are internal scopes. They are not intended for user interaction or
#### 11. Interior: Resource
-the body of a 'with' / 'use' / 'using' statement
+the body of a `with` / `use` / `using` statement
diff --git a/packages/app-web-docs/src/docs/user/languages/plaintext.mdx b/packages/app-web-docs/src/docs/user/languages/plaintext.mdx
index 81237a3b94..eca622046f 100644
--- a/packages/app-web-docs/src/docs/user/languages/plaintext.mdx
+++ b/packages/app-web-docs/src/docs/user/languages/plaintext.mdx
@@ -132,6 +132,20 @@ Below are visualizations of all our scope tests for this language. These were cr
+### Glyph
+
+#### 1. Glyph: A
+
+A single `a` glyph
+
+
+
+#### 2. Glyph: Dollar
+
+A single `$` glyph
+
+
+
### Identifier
#### 1. Identifier
diff --git a/packages/app-web-docs/src/docs/user/languages/python.mdx b/packages/app-web-docs/src/docs/user/languages/python.mdx
index b04400ce8b..6270171a84 100644
--- a/packages/app-web-docs/src/docs/user/languages/python.mdx
+++ b/packages/app-web-docs/src/docs/user/languages/python.mdx
@@ -640,7 +640,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 16. Name: Resource
-Name in a 'with' / 'use' / 'using' statement
+Name in a `with` / `use` / `using` statement
@@ -842,7 +842,7 @@ Below are visualizations of all our scope tests for this language. These were cr
#### 15. Statement: Resource
-A 'with' / 'use' / 'using' statement
+A `with` / `use` / `using` statement
@@ -1270,7 +1270,7 @@ The following are internal scopes. They are not intended for user interaction or
#### 7. Interior: Resource
-the body of a 'with' / 'use' / 'using' statement
+the body of a `with` / `use` / `using` statement
diff --git a/packages/app-web-docs/src/docs/user/scopes/glyph.mdx b/packages/app-web-docs/src/docs/user/scopes/glyph.mdx
index e35c433121..593eca25f4 100644
--- a/packages/app-web-docs/src/docs/user/scopes/glyph.mdx
+++ b/packages/app-web-docs/src/docs/user/scopes/glyph.mdx
@@ -2,6 +2,8 @@
sidebar_label: Glyph
---
+import { ScopeVisualizer, ScopeVisualizerOptions, ScopeVisualizerProvider } from "@site/src/docs/components/ScopeVisualizer";
+
# Glyph
Cursorless ID: `glyph`
@@ -17,3 +19,28 @@ Default: `glyph`
## Examples
- `"take next glyph air"` - Selects the next `a`.
+- `"take every glyph dollar"` - Selects every `$`.
+
+
+
+## Scopes
+
+
+
+### Glyph: A
+
+A single `a` glyph
+
+##### Plaintext
+
+
+
+### Glyph: Dollar
+
+A single `$` glyph
+
+##### Plaintext
+
+
+
+
diff --git a/packages/app-web-docs/src/docs/user/scopes/name.mdx b/packages/app-web-docs/src/docs/user/scopes/name.mdx
index dd8cc21862..0062a46bc4 100644
--- a/packages/app-web-docs/src/docs/user/scopes/name.mdx
+++ b/packages/app-web-docs/src/docs/user/scopes/name.mdx
@@ -1196,7 +1196,7 @@ Default: `name`
### Name: Resource
-Name in a 'with' / 'use' / 'using' statement
+Name in a `with` / `use` / `using` statement
##### C#
diff --git a/packages/app-web-docs/src/docs/user/scopes/statement.mdx b/packages/app-web-docs/src/docs/user/scopes/statement.mdx
index 4eb9e4cac6..6c33ecca6f 100644
--- a/packages/app-web-docs/src/docs/user/scopes/statement.mdx
+++ b/packages/app-web-docs/src/docs/user/scopes/statement.mdx
@@ -1198,7 +1198,7 @@ Default: `state`
### Statement: Resource
-A 'with' / 'use' / 'using' statement
+A `with` / `use` / `using` statement
##### C#
diff --git a/packages/app-web-docs/src/docs/user/scopes/type.mdx b/packages/app-web-docs/src/docs/user/scopes/type.mdx
index 08527664f1..5a9154d94c 100644
--- a/packages/app-web-docs/src/docs/user/scopes/type.mdx
+++ b/packages/app-web-docs/src/docs/user/scopes/type.mdx
@@ -642,7 +642,7 @@ Default: `type`
### Type: Resource
-Type in a 'with' / 'use' / 'using' statement
+Type in a `with` / `use` / `using` statement
##### C#
diff --git a/packages/app-web-docs/src/docs/user/scopes/value.mdx b/packages/app-web-docs/src/docs/user/scopes/value.mdx
index e2c4e1fbcd..f11399eee8 100644
--- a/packages/app-web-docs/src/docs/user/scopes/value.mdx
+++ b/packages/app-web-docs/src/docs/user/scopes/value.mdx
@@ -674,7 +674,7 @@ Default: `value`
### Value: Resource
-Value of a 'with' / 'use' / 'using' statement
+Value of a `with` / `use` / `using` statement
##### C#
diff --git a/packages/lib-common/src/references/scopeReferences.ts b/packages/lib-common/src/references/scopeReferences.ts
index 22374b6960..26a32bb0e8 100644
--- a/packages/lib-common/src/references/scopeReferences.ts
+++ b/packages/lib-common/src/references/scopeReferences.ts
@@ -40,6 +40,7 @@ interface ScopeReferenceEntry extends ReferenceEntry {
const DEFAULT_PATTERN = VAR_SPOKEN_FORM;
const AIR = graphemeDefaultSpokenForms.a;
+const DOLLAR = graphemeDefaultSpokenForms["$"];
const PARENTHESIS = pairedDelimiterReferences.parentheses.defaultSpokenForm;
const NEXT = modifierExtraReferences.next.defaultSpokenForm;
const FIRST = modifierExtraReferences.first.defaultSpokenForm;
@@ -359,6 +360,10 @@ When an opening and closing delimiter use the same character and no parse-tree i
command: `${SET_SELECTION} ${NEXT} ${VAR_SPOKEN_FORM} ${AIR}`,
description: `Selects the next \`a\`.`,
},
+ {
+ command: `${SET_SELECTION} ${EVERY} ${VAR_SPOKEN_FORM} ${DOLLAR}`,
+ description: `Selects every \`$\`.`,
+ },
],
},
diff --git a/packages/lib-common/src/scopeSupportFacets/PlaintextScopeSupportFacetInfos.ts b/packages/lib-common/src/scopeSupportFacets/PlaintextScopeSupportFacetInfos.ts
index e67bc32670..4422e8ae30 100644
--- a/packages/lib-common/src/scopeSupportFacets/PlaintextScopeSupportFacetInfos.ts
+++ b/packages/lib-common/src/scopeSupportFacets/PlaintextScopeSupportFacetInfos.ts
@@ -98,15 +98,25 @@ export const plaintextScopeSupportFacetInfos: Record<
},
"collectionItem.textual": {
description: "A text based collection item",
- scopeType: {
- type: "collectionItem",
- },
+ scopeType: "collectionItem",
},
"collectionItem.textual.iteration": {
description: "Iteration scope for text based collection items",
+ scopeType: "collectionItem",
+ isIteration: true,
+ },
+ "glyph.a": {
+ description: "A single `a` glyph",
scopeType: {
- type: "collectionItem",
+ type: "glyph",
+ character: "a",
+ },
+ },
+ "glyph.dollar": {
+ description: "A single `$` glyph",
+ scopeType: {
+ type: "glyph",
+ character: "$",
},
- isIteration: true,
},
};
diff --git a/packages/lib-common/src/scopeSupportFacets/scopeSupportFacetInfos.ts b/packages/lib-common/src/scopeSupportFacets/scopeSupportFacetInfos.ts
index ca8799f7c5..01ecdfdb96 100644
--- a/packages/lib-common/src/scopeSupportFacets/scopeSupportFacetInfos.ts
+++ b/packages/lib-common/src/scopeSupportFacets/scopeSupportFacetInfos.ts
@@ -244,7 +244,7 @@ export const scopeSupportFacetInfos: Record<
scopeType: "statement",
},
"statement.resource": {
- description: "A 'with' / 'use' / 'using' statement",
+ description: "A `with` / `use` / `using` statement",
scopeType: "statement",
},
"statement.command": {
@@ -808,7 +808,7 @@ export const scopeSupportFacetInfos: Record<
"name.iteration.enum": enumIter("name", "names"),
"name.iteration.document": documentIter("name", "names"),
"name.resource": {
- description: "Name in a 'with' / 'use' / 'using' statement",
+ description: "Name in a `with` / `use` / `using` statement",
scopeType: "name",
},
"name.argument.actual": {
@@ -958,7 +958,7 @@ export const scopeSupportFacetInfos: Record<
"value.iteration.enum": enumIter("value", "values"),
"value.iteration.document": documentIter("value", "values"),
"value.resource": {
- description: "Value of a 'with' / 'use' / 'using' statement",
+ description: "Value of a `with` / `use` / `using` statement",
scopeType: "value",
},
"value.argument.actual": {
@@ -1119,7 +1119,7 @@ export const scopeSupportFacetInfos: Record<
"the type argument list",
),
"type.resource": {
- description: "Type in a 'with' / 'use' / 'using' statement",
+ description: "Type in a `with` / `use` / `using` statement",
scopeType: "type",
},
"type.iteration.block": blockIter("type", "types"),
@@ -1200,7 +1200,7 @@ export const scopeSupportFacetInfos: Record<
scopeType: { type: "interior" },
},
"interior.resource": {
- description: "the body of a 'with' / 'use' / 'using' statement",
+ description: "the body of a `with` / `use` / `using` statement",
scopeType: { type: "interior" },
},
"interior.namespace": {
diff --git a/packages/lib-common/src/scopeSupportFacets/scopeSupportFacets.types.ts b/packages/lib-common/src/scopeSupportFacets/scopeSupportFacets.types.ts
index 3eaec2ce0b..5ea3dad7b7 100644
--- a/packages/lib-common/src/scopeSupportFacets/scopeSupportFacets.types.ts
+++ b/packages/lib-common/src/scopeSupportFacets/scopeSupportFacets.types.ts
@@ -368,7 +368,9 @@ export type PlaintextScopeSupportFacet =
| "surroundingPair.iteration"
| "interior.surroundingPair"
| "collectionItem.textual"
- | "collectionItem.textual.iteration";
+ | "collectionItem.textual.iteration"
+ | "glyph.a"
+ | "glyph.dollar";
export type LanguageScopeSupportFacetMap = Partial<
Record
diff --git a/resources/fixtures/scope-support-facet-infos.md b/resources/fixtures/scope-support-facet-infos.md
index 09c260a81d..9ebb63b61c 100644
--- a/resources/fixtures/scope-support-facet-infos.md
+++ b/resources/fixtures/scope-support-facet-infos.md
@@ -173,6 +173,11 @@
- `functionCallee.generic` The function being called in a function call with generic type arguments
- `functionCallee.method` The function being called in a method call, including parent objects.
+### glyph
+
+- `glyph.a` A single `a` glyph
+- `glyph.dollar` A single `$` glyph
+
### identifier
- `identifier` A single alphanumeric identifier in the document
@@ -198,7 +203,7 @@
- `interior.lambda` The block body of a lambda/anonymous function
- `interior.method` The body of a method declaration
- `interior.namespace` the body of a namespace statement
-- `interior.resource` the body of a 'with' / 'use' / 'using' statement
+- `interior.resource` the body of a `with` / `use` / `using` statement
- `interior.static` the body of a static statement
### surroundingPairInterior
@@ -265,7 +270,7 @@
- `name.method` Name of a class method
- `name.method.interface` Name of a interface method
- `name.namespace` Name of a namespace
-- `name.resource` Name in a 'with' / 'use' / 'using' statement
+- `name.resource` Name in a `with` / `use` / `using` statement
- `name.typeAlias` Name of a type alias
- `name.variable.destructuring` Name (LHS) of a variable declaration with pattern destructuring
- `name.variable.initialized` Name (LHS) of an initialized variable declaration
@@ -380,7 +385,7 @@
- `statement.misc` A miscellaneous statement
- `statement.namespace` A namespace declaration
- `statement.package` A package declaration
-- `statement.resource` A 'with' / 'use' / 'using' statement
+- `statement.resource` A `with` / `use` / `using` statement
- `statement.return` A return statement
- `statement.static` A static statement
- `statement.switch` A switch statement
@@ -456,7 +461,7 @@
- `type.iteration.class` Iteration scope for types: class bodies.
- `type.iteration.document` Iteration scope for types: the entire document including leading and trailing empty lines.
- `type.iteration.interface` Iteration scope for types: interface bodies.
-- `type.resource` Type in a 'with' / 'use' / 'using' statement
+- `type.resource` Type in a `with` / `use` / `using` statement
- `type.return` Type of a return value in a function declaration
- `type.return.lambda` Type of a return value in a lambda declaration
- `type.return.method` Type of a return value in a method declaration
@@ -501,7 +506,7 @@
- `value.iteration.enum` Iteration scope for values: enum bodies.
- `value.mapPair` Value (RHS) of a key-value pair in a map
- `value.mapPair.iteration` Iteration scope for values of key-value pairs in a map: should be between the braces.
-- `value.resource` Value of a 'with' / 'use' / 'using' statement
+- `value.resource` Value of a `with` / `use` / `using` statement
- `value.return` Return value of a function
- `value.return.lambda` Implicit return value from a lambda
- `value.switch` The value / subject of a switch statement
diff --git a/resources/fixtures/scopes/plaintext/glyph.a.scope b/resources/fixtures/scopes/plaintext/glyph.a.scope
new file mode 100644
index 0000000000..087bb67807
--- /dev/null
+++ b/resources/fixtures/scopes/plaintext/glyph.a.scope
@@ -0,0 +1,53 @@
+a b a c a
+---
+
+[#1 Content] =
+[#1 Domain] = 0:0-0:1
+ >-<
+0| a b a c a
+
+[#1 Removal] = 0:0-0:2
+ >--<
+0| a b a c a
+
+[#1 Trailing delimiter] = 0:1-0:2
+ >-<
+0| a b a c a
+
+[#1 Insertion delimiter] = " "
+
+
+[#2 Content] =
+[#2 Domain] = 0:4-0:5
+ >-<
+0| a b a c a
+
+[#2 Removal] = 0:4-0:6
+ >--<
+0| a b a c a
+
+[#2 Leading delimiter] = 0:3-0:4
+ >-<
+0| a b a c a
+
+[#2 Trailing delimiter] = 0:5-0:6
+ >-<
+0| a b a c a
+
+[#2 Insertion delimiter] = " "
+
+
+[#3 Content] =
+[#3 Domain] = 0:8-0:9
+ >-<
+0| a b a c a
+
+[#3 Removal] = 0:7-0:9
+ >--<
+0| a b a c a
+
+[#3 Leading delimiter] = 0:7-0:8
+ >-<
+0| a b a c a
+
+[#3 Insertion delimiter] = " "
diff --git a/resources/fixtures/scopes/plaintext/glyph.dollar.scope b/resources/fixtures/scopes/plaintext/glyph.dollar.scope
new file mode 100644
index 0000000000..0da92c5c02
--- /dev/null
+++ b/resources/fixtures/scopes/plaintext/glyph.dollar.scope
@@ -0,0 +1,53 @@
+$ b $ c $
+---
+
+[#1 Content] =
+[#1 Domain] = 0:0-0:1
+ >-<
+0| $ b $ c $
+
+[#1 Removal] = 0:0-0:2
+ >--<
+0| $ b $ c $
+
+[#1 Trailing delimiter] = 0:1-0:2
+ >-<
+0| $ b $ c $
+
+[#1 Insertion delimiter] = " "
+
+
+[#2 Content] =
+[#2 Domain] = 0:4-0:5
+ >-<
+0| $ b $ c $
+
+[#2 Removal] = 0:4-0:6
+ >--<
+0| $ b $ c $
+
+[#2 Leading delimiter] = 0:3-0:4
+ >-<
+0| $ b $ c $
+
+[#2 Trailing delimiter] = 0:5-0:6
+ >-<
+0| $ b $ c $
+
+[#2 Insertion delimiter] = " "
+
+
+[#3 Content] =
+[#3 Domain] = 0:8-0:9
+ >-<
+0| $ b $ c $
+
+[#3 Removal] = 0:7-0:9
+ >--<
+0| $ b $ c $
+
+[#3 Leading delimiter] = 0:7-0:8
+ >-<
+0| $ b $ c $
+
+[#3 Insertion delimiter] = " "