We also support fancier constructs like the following:
- "every line block air past bat"
- "every line air past block bat"
- "every line past bat"
- "every line past block bat"
The approach is to detect ranges of the form `"every <scope> <target>
past <target>"` and to turn them into a special range target, distinct
from `"continuous"` or `"slice"`. We remove the `"every <scope>"`
modifier as well because that's done after we construct the range.
The reason we need a special range target is that exclusion needs to be
smart to handle scopes whose domain is larger than their content range
We also add slight special casing for line targets so that when you're
at the beginning / end of a line, that line is considered part of the
range
## Checklist
- [x] Only expand to containing scope if the given end is excluded, eg
expand end target if "until". Might need to tweak construction of ranges
so that each side is responsible for exclusion to make "every token
until line bat" work, because otherwise it gets downgraded so we won't
actually skip the right thing. eg try "every token air past state bat"
if "bat" is in the middle of the statement.
- [x] Add tests for above examples
- [x] Handle case where one side is not in a scope
- [x] Handle case where one side is in a scope but you don't want it to
jump to parent (eg "take every state past bat" when we're inside a
function but between statements)
- [x] Add test for "every line air until bat"
- [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
## Checklist
- [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
- [x] I have tested building the docs
Replace the hand-written diagram of relative / ordinal modifiers with
one generated by LaTeX / tikz.
If it is necessary in the future to change this image, you can reuse and
modify the below latex code to regenerate it.
```
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calligraphy}
% to convert pdf -> png:
% convert -density 300 relative-ordinal.pdf -quality 100 -background white -alpha remove relative_ordinal.png
\begin{document}
\def\spacing{1.4cm}
\newcommand{\ibrace}[4]{
\draw [decorate, decoration = {brace, amplitude=5pt}] (#2*\spacing, #1*0.8cm + 0.5cm) -- (#3*\spacing, #1*0.8cm + 0.5cm)
node[above=5pt, pos=0.5, scale=0.8] {\texttt{"#4"}};
}
\newcommand{\bbrace}[4]{
\draw [decorate, decoration = {brace, amplitude=5pt}] (#2*\spacing, #1*0.8cm + 0.5cm) -- (#3*\spacing, #1*0.8cm + 0.5cm)
node[above=-20pt, pos=0.5, scale=0.8] {#4};
}
\newcommand{\funk}[3]{
\draw[fill=black] (#1*\spacing,0) circle (0.1cm) node[below=#2, text width=1cm,align=left,scale=0.7] (F#1)
{\texttt{"#3"}};
}
\begin{tikzpicture}[ultra thick]
\funk{0}{0pt}{first funk}
\funk{1}{0pt}{second funk}
\funk{2}{0pt}{third previous funk}
\funk{3}{0pt}{second previous funk}
\funk{4}{0pt}{previous funk}
\funk{5}{0pt}{funk}
\funk{6}{0pt}{next funk}
\funk{7}{0pt}{second next funk}
\funk{8}{0pt}{third next funk}
\funk{9}{0pt}{second last funk}
\funk{10}{0pt}{last funk}
\draw[latex-] (F5) -- +(0,-0.8cm) node[below=2pt,scale=0.8] {input target};
\ibrace{0}{6}{8}{next three funks};
\ibrace{0}{2}{4}{previous three funks};
\ibrace{1}{5}{7}{three funks};
\ibrace{2}{3}{5}{three funks backward};
\ibrace{0}{0}{1}{first two funks};
\ibrace{0}{9}{10}{last two funks};
\bbrace{-3}{10}{0}{iteration scope};
\end{tikzpicture}
\end{document}
```
---------
Co-authored-by: Martin Rykfors <martin.rykfors@evolabel.com>
- 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 <755842+pokey@users.noreply.github.com>
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 a9f100f58..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
- closes https://github.com/cursorless-dev/cursorless/issues/945
- closes https://github.com/cursorless-dev/cursorless/issues/1044
- depends on https://github.com/cursorless-dev/cursorless/pull/1322
- depends on https://github.com/cursorless-dev/cursorless/pull/1327
## Checklist
- [x] Split into smaller PRs for ease of review
- [x] Try DX tests again
https://github.com/cursorless-dev/cursorless/discussions/1289
- [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] File issue for speeding up cheatsheet / making it not optional
locally https://github.com/cursorless-dev/cursorless/issues/1307
- [x] Set package manager in package.json
https://nodejs.org/api/packages.html#packagemanager
- [x] Re-add lint rule to prevent api types from importing anything
- [x] Try local install
- [x] Make sure cheatsheet works
- [x] Make sure local extension build depends on building cheatsheet, or
allows no cheatsheet
- [x] Figure out why we're getting so many extra `internal` modules
- [x] Update https://github.com/cursorless-dev/cursorless/issues/931 to
indicate we're now patching instead of swizzling
- [x] Make sure lint rules are actually running in CI
- [x] Check that we've addressed everything in
https://github.com/cursorless-dev/cursorless/issues/945
- [x] Incorporate changes from
https://github.com/cursorless-dev/cursorless/pull/1166
- [x] ~~Make sure this PR doesn't break doc links; see
https://github.com/cursorless-dev/cursorless/pull/942#discussion_r968556276~~
There's no way to avoid these links getting broken if we upgrade
typedoc; filed https://github.com/cursorless-dev/cursorless/issues/1304
to track
- [x] Revert https://github.com/cursorless-dev/cursorless/pull/1284
- [x] I have added
[tests](https://www.cursorless.org/docs/contributing/test-case-recorder/)
- [x] I have not broken the cheatsheet
- [x] Generate cursorless-vscode package.json automatically, and change
the name we use to `@cursorless/cursorless-vscode` in the `package.json`
checked into source control
- [x] Be sure to update meta-updater to check for that instead of name
`cursorless` (see fixme in its `index.ts`)
## Desiderata
- From https://github.com/cursorless-dev/cursorless/discussions/1289
### Correctly flagging errors
- [x] `D1`: It is a compile error to import external packages that are
not listed in `package.json`
- [x] `D1.1`: `vscode` (for some reason this one behaves strangely)
- [x] `D1.2`: Other packages
- [x] `D2`: It is **not** a compile error to import from local packages
that you depend on, using our preferred syntax (eg `@cursorless/foo`)
- [x] `D3`: It is a compile error to import from local packages that you
depend on, **not** using our preferred syntax (eg `../foo`)
- [x] `D4`: It is a compile error to import from local packages that you
do **not** depend on, either
- [x] `D4.1`: using our non-preferred syntax (eg `../packages/foo`), or
- [x] `D4.2`: using preferred syntax (eg `@cursorless/foo`)
- [ ] `D5`: It is a compile error to import from anything other than
`index.ts` in another module
- [x] `D5.1`: **no** `@cursorless/foo/bar`
- [x] `D5.2`: **no** `../foo/bar`
- [x] `a`: Even if you depend on the module
- [ ] `b`: Even if `bar` was re-exported in `foo/index.ts`. In that case
it should be required to import `@cursorless/foo`. Untested, but
probably works, and I ran out of steam 😅
- [x] `D6`: It is **not** a compile error to import external packages
listed in `package.json`
- [x] `D6.1`: `vscode` (for some reason this one behaves strangely)
- [x] `D6.2`: Other packages
### Auto-import
- [x] `D7`: Auto-import doesn't import from external packages not listed
in `package.json`
- [x] `D7.1`: `vscode` (for some reason this one behaves strangely)
- [x] `D7.2`: Other packages
- [x] `D8`: Auto-import imports from external packages listed in
`package.json`
- [x] `D8.1`: `vscode` (for some reason this one behaves strangely)
- [x] `D8.2`: Other packages
- [x] `D9`: Auto-import imports from local packages that you depend on,
using our preferred syntax (eg `@cursorless/foo`)
- [x] `D10`: Auto-import doesn't import from local packages that you
don't depend on
- [x] `D11`: Auto-import doesn't import from anything other than
`index.ts` in another package (eg **no** `@cursorless/foo/bar`)
- [x] `D11.1`: When you depend on the package
- [x] `D11.2`: When you don't depend on the package
### Other DX
- [x] `D12`: Find references across projects when no file from the
referencing project is open
- [x] `D13`: Rename across projects when no file from the referencing
project is open
- [x] `D14`: Jump to definition across projects
- [ ] `D15`: It is easy to move a file from one package to another
- [ ] `D16`: It is easy to create a new package
- [ ] `D17`: Breakpoints work in Cursorless extension
- [x] `D18`: Breakpoints work on Cursorless root website
- [ ] `D19`: Breakpoints work on Cursorless docs website
Fixed the v1 to v2 script to preserve order and not drop any values.
- [ ] ~~Use normalisation code for updating fixtures in
a4cee9611f/src/test/suite/recorded.test.ts (L130-L138~~)
(filed https://github.com/cursorless-dev/cursorless/issues/1168 to
follow up on this one)
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
Co-authored-by: David Vo <auscompgeek@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Added word separator setting. Removed language specific regex components.
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Updated tests
* Word separator is now a list
* Update documentation
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Mock word separators for tests
* Minor tweaks
* Update src/core/tokenizerConfiguration.ts
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Revert "Minor tweaks"
This reverts commit b7f3695975.
* cleanup
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Use join to create key
* Update src/core/tokenizer.ts
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
* Update docs
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
* Original scope handlers
* More stuff
* Use proper token stage in sub token stage
* Work around for identifier matcher
* Use new scope handler in relative scope stage
* Use new scope handlers in ordinal scope stage
* Update usage of containing indices
* Rename
* Refactored create target
* Clean up
* clean up
* Add some tests that should pass
* Add a bunch more tests
* Attempt at different approach to scope handlers
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Initial implementation of new idea
* More work on this stuff
* Rename and add some todos
* More stuff
* Tweaks
* Renames and docstrings
* Restructuring
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* More jsdocs
* Tweaks
* Test fixes
* Fix error messages
* Revert `OrdinalScopeStage`
* Tweak
* jsdocs; fix import
* Don't export legacy types
* Fix import
* Preparation for surrounding pairs
* Naming cleanup
* Unify `getLegacyScopeStage` functions
* Lots of cleanup
* Fix regex `lastIndex` issue
* More cleanup
* More cleanup
* More cleanup
* Add `ancestorIndex` in prepartion for #124
* Add more jsdocs
* More docs
* More docs
* docstrings
* Improve hierarchical error type
* Docs
* More minor dog tweaks
* More docs
* More docs
* Doc strings and a couple tests
* Remove `isPreferredOver`
* Support `ancestorIndex` on api surface
* Improved jsdocs
* Split and cleanup relative stages
* Make scope handler constructor args optional
* More legacy type fixes
* Add `"identifier"` scope
* Working new code
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Docs + cheatsheet
* Update docs
* Add jsdoc
* jsdoc
* JSDocs
* doc tweaks
* reflow
* Tweaks
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Add unit scope to SCSS/CSS
* Add unit to docs
* Add unit to new targetDescriptor type
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Fix upgrade types
* Improve unit support
* Minor import cleanup
* Remove `that` marks to fix tests
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
Co-authored-by: Andreas Arvidsson <andreas.arvidsson87@gmail.com>
* Added its modifier to use with inference
* Fix test failures
* Remove unnecessary spy
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
* Add cursorless-talon-dev
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Tweaks
* More tweaks
* Woops
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Andreas Arvidsson <andreas.arvidsson87@gmail.com>
* Added support for plural lists
* Updated relative scope modifier grammar
* Added ordinals to relative modifier
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Added plural list for regex scopes
* Update cursorless-talon/src/modifiers/relative_scope.py
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
* Update cursorless-talon/src/modifiers/relative_scope.py
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
* Added link to inflection license
* Use plural scope type in ordinal scope
* Added support for <ordinal> last scope grammar
* Clean up
* Added words to csv
* Updated modifier grammar
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Updated legend
* Added docs
* Update defaults.json
* Start tweaking modifier cheatsheet
* More cheatsheet updates
* More tweaks
* Cleanup cheatsheet representation
* Some talon cleanup
* Change formatting for cheatsheet captures
* Fix captures in cheatsheet
* More capture cleanup
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Revert ts config
* Revert old cheatsheet changes
* Fixes
* Tweak docs
* More doc tweaks
* Add diagram
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
* nx g @nrwl/next:app cursorless-org
* Attempt to get things working
* Remove cypress for now
* Add --prod flag
* Try again
* Another fix
* Remove website-root/index.html
* Use static export
* Another attempt
* whoops
* another
* Some style tweaks
* Add inconsolata
* Working iPhone 13
* Desktop version
* Fix dark
* Cleanup cheatsheet defaults updater support
* Basic working mobile
* More tweaks
* Working desktop
* Center hats
* Initial working embedded video
* Add related videos opt
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Add cursorless.org client-side launch config
* Switch to react-player; better error handling
* Working mobile layout
* Move hats component
* Add player controls
* Use video placeholder
* Revert "Use video placeholder"
This reverts commit 40f45286ed.
* Bunch of tweaks from jam sesh
* More jam sesh tweaks
* Working mobile; some desktop tweaks
* Working draft of desktop
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Tweak media breakpoints
* Fix isExternal
* Fix button background for light mode
* Docusaurus respect system color scheme
* Some design tweaks
* Font tweaking
* More messing around
* Working mobile
* Work toward proportional layout
* Workign resize code
* Start of screen stuff
* Get layout working at more sizes
* Fix background color on mobile
* Attempt to fix iPhone landscape
* Remove video placeholder
* Add doc comment
* Start adding meta tags
* More styling tweaks
* Add button hover
* Fix favicon
* Attempt to fix social tags
* Hack to use deploy preview URL
* Revert "Hack to use deploy preview URL"
This reverts commit d0251e74d9.
* Fix social embed
* Hack deploy preview URL again
* Revert "Hack deploy preview URL again"
This reverts commit 6acb1326ae.
* Tweak share
* Hack url
* Revert "Hack url"
This reverts commit 77c109d521.
* Cleanup from looking through PR
* More cleanup
* whoops
* bump package-lock
* Fix order of fonts
* Add regular font weight
* Revert cheatsheet
* Kick CI
* Update cursorless-nx/apps/cursorless-org/pages/_app.tsx
Co-authored-by: David Vo <auscompgeek@users.noreply.github.com>
* Tweaks
* Tweaks
* website/ => docs-site/
* Lots of tweaks
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Attempt to fix docs build
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: David Vo <auscompgeek@users.noreply.github.com>
* Added warning about using WSL on Windows.
* Update docs/contributing/CONTRIBUTING.md
Co-authored-by: David Vo <auscompgeek@users.noreply.github.com>
* Update docs/contributing/CONTRIBUTING.md
* Update docs/contributing/CONTRIBUTING.md
Co-authored-by: David Vo <auscompgeek@users.noreply.github.com>
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
* Swizzle SearchBar
* Ignore swizzled file
* Tweak search rankings in docs site
* Capture original Algolia settings
* Documentation
* Modifications to Algolia crawler and index settings
* Tweak wording
* More tweaks
* run `yarn`
Co-authored-by: Andreas Arvidsson <andreas.arvidsson87@gmail.com>
* Add various additions to documentation
* Add head/tail to scopes list
* Update Readme according to feedback
* Apply suggestions from code review
* Tweaks
* Tweaks
* Revert fix to old cheatsheet
Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>