-
-
Notifications
You must be signed in to change notification settings - Fork 84
Destinations as first-class objects #803
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Labels
Milestone
Comments
3 tasks
pokey
added a commit
that referenced
this issue
Mar 27, 2023
- Fixes #1324 - Fixes #1325 Note that I created a Talon-side insertion api that supports the full set of options, including substitutions, targets, and scopes, but decided to leave it out for now because I'm not sure exactly how it should look and we don't need it for the mathfly support we're planning to use it for. In particular, we should probably figure out #803 before we implement the more complex api because snippets really want a destination, not a target. I did use the complex Talon-side api to record some tests of the extension api, though Here is the complex Talon snippet insertion api in case useful at some point <details><summary>Complex talon api</summary> ```diff From e39e03e3a06a6db4f1edb245a5225037d0ea08d3 Mon Sep 17 00:00:00 2001 From: Pokey Rule <[email protected]> Date: Fri, 24 Mar 2023 14:22:40 +0000 Subject: [PATCH] Complex insert snippet Talon api --- cursorless-talon/src/snippets.py | 35 ++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/cursorless-talon/src/snippets.py b/cursorless-talon/src/snippets.py index a9f100f..409512011 100644 --- a/cursorless-talon/src/snippets.py +++ b/cursorless-talon/src/snippets.py @@ -91,15 +91,34 @@ class Actions: }, ) - def cursorless_insert_snippet(body: str): + def cursorless_insert_snippet( + body: str, + target: Optional[dict] = None, + scope: Optional[str] = None, + snippet_variable: Optional[str] = None, + text: Optional[str] = None, + ): """Inserts a custom snippet""" - actions.user.cursorless_implicit_target_command( - "insertSnippet", - { - "type": "custom", - "body": body, - }, - ) + snippet_arg: dict[str, Any] = { + "type": "custom", + "body": body, + } + if scope: + snippet_arg["scopeType"] = {"type": scope} + if snippet_variable: + snippet_arg["substitutions"] = {snippet_variable: text} + + if target: + actions.user.cursorless_single_target_command_with_arg_list( + "insertSnippet", + target, + [snippet_arg], + ) + else: + actions.user.cursorless_implicit_target_command( + "insertSnippet", + snippet_arg, + ) def cursorless_wrap_with_snippet_by_name( name: str, variable_name: str, target: dict -- 2.39.2 ``` </details> ## Checklist - [x] I have added [tests](https://www.cursorless.org/docs/contributing/test-case-recorder/) - [x] 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) - [x] I have not broken the cheatsheet
cursorless-bot
pushed a commit
that referenced
this issue
Mar 27, 2023
- Fixes #1324 - Fixes #1325 Note that I created a Talon-side insertion api that supports the full set of options, including substitutions, targets, and scopes, but decided to leave it out for now because I'm not sure exactly how it should look and we don't need it for the mathfly support we're planning to use it for. In particular, we should probably figure out #803 before we implement the more complex api because snippets really want a destination, not a target. I did use the complex Talon-side api to record some tests of the extension api, though Here is the complex Talon snippet insertion api in case useful at some point <details><summary>Complex talon api</summary> ```diff From e39e03e3a06a6db4f1edb245a5225037d0ea08d3 Mon Sep 17 00:00:00 2001 From: Pokey Rule <[email protected]> Date: Fri, 24 Mar 2023 14:22:40 +0000 Subject: [PATCH] Complex insert snippet Talon api --- cursorless-talon/src/snippets.py | 35 ++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/cursorless-talon/src/snippets.py b/cursorless-talon/src/snippets.py index a9f100f..409512011 100644 --- a/cursorless-talon/src/snippets.py +++ b/cursorless-talon/src/snippets.py @@ -91,15 +91,34 @@ class Actions: }, ) - def cursorless_insert_snippet(body: str): + def cursorless_insert_snippet( + body: str, + target: Optional[dict] = None, + scope: Optional[str] = None, + snippet_variable: Optional[str] = None, + text: Optional[str] = None, + ): """Inserts a custom snippet""" - actions.user.cursorless_implicit_target_command( - "insertSnippet", - { - "type": "custom", - "body": body, - }, - ) + snippet_arg: dict[str, Any] = { + "type": "custom", + "body": body, + } + if scope: + snippet_arg["scopeType"] = {"type": scope} + if snippet_variable: + snippet_arg["substitutions"] = {snippet_variable: text} + + if target: + actions.user.cursorless_single_target_command_with_arg_list( + "insertSnippet", + target, + [snippet_arg], + ) + else: + actions.user.cursorless_implicit_target_command( + "insertSnippet", + snippet_arg, + ) def cursorless_wrap_with_snippet_by_name( name: str, variable_name: str, target: dict -- 2.39.2 ``` </details> ## Checklist - [x] I have added [tests](https://www.cursorless.org/docs/contributing/test-case-recorder/) - [x] 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) - [x] I have not broken the cheatsheet
This was referenced Jul 10, 2023
11 tasks
11 tasks
11 tasks
11 tasks
11 tasks
thetomcraig-aya
pushed a commit
to thetomcraig/cursorless
that referenced
this issue
Mar 27, 2024
- Fixes cursorless-dev#1324 - Fixes cursorless-dev#1325 Note that I created a Talon-side insertion api that supports the full set of options, including substitutions, targets, and scopes, but decided to leave it out for now because I'm not sure exactly how it should look and we don't need it for the mathfly support we're planning to use it for. In particular, we should probably figure out cursorless-dev#803 before we implement the more complex api because snippets really want a destination, not a target. I did use the complex Talon-side api to record some tests of the extension api, though Here is the complex Talon snippet insertion api in case useful at some point <details><summary>Complex talon api</summary> ```diff From e39e03e3a06a6db4f1edb245a5225037d0ea08d3 Mon Sep 17 00:00:00 2001 From: Pokey Rule <[email protected]> Date: Fri, 24 Mar 2023 14:22:40 +0000 Subject: [PATCH] Complex insert snippet Talon api --- cursorless-talon/src/snippets.py | 35 ++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/cursorless-talon/src/snippets.py b/cursorless-talon/src/snippets.py index a9f100f..409512011 100644 --- a/cursorless-talon/src/snippets.py +++ b/cursorless-talon/src/snippets.py @@ -91,15 +91,34 @@ class Actions: }, ) - def cursorless_insert_snippet(body: str): + def cursorless_insert_snippet( + body: str, + target: Optional[dict] = None, + scope: Optional[str] = None, + snippet_variable: Optional[str] = None, + text: Optional[str] = None, + ): """Inserts a custom snippet""" - actions.user.cursorless_implicit_target_command( - "insertSnippet", - { - "type": "custom", - "body": body, - }, - ) + snippet_arg: dict[str, Any] = { + "type": "custom", + "body": body, + } + if scope: + snippet_arg["scopeType"] = {"type": scope} + if snippet_variable: + snippet_arg["substitutions"] = {snippet_variable: text} + + if target: + actions.user.cursorless_single_target_command_with_arg_list( + "insertSnippet", + target, + [snippet_arg], + ) + else: + actions.user.cursorless_implicit_target_command( + "insertSnippet", + snippet_arg, + ) def cursorless_wrap_with_snippet_by_name( name: str, variable_name: str, target: dict -- 2.39.2 ``` </details> ## Checklist - [x] I have added [tests](https://www.cursorless.org/docs/contributing/test-case-recorder/) - [x] 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) - [x] I have not broken the cheatsheet
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The problem
Today, our handling of positions is inconsistent. This problem manifests itself in multiple ways:
"paste end of air"
is a valid command, making it nearly impossible to get Talon to hear"take air past end of item bat"
. It instead hears two commands:"take air"
then"paste end of item bat"
edit
action on regular targets, and position targets need all the methods from regular targets that they don't actually support""
when position is"end of"
or"start of"
The solution
We introduce a new type called a
Destination
, both on the Talon and extension side. This type is distinct from aTarget
, and will be used everywhere we expect aPositionTarget
today (eg"paste"
, second target of"bring"
, etc).Destination
will be have the following interface:It will exist in the following places:
TargetDescriptor
Target
It will involve the following steps:
The text was updated successfully, but these errors were encountered: