Comments (4)
There's a macro in 0.5.0 for this: tree-sitter-save-excursion
. It keeps the cursor on the same node, and on the same vertical position.
The following works for me in Python (provided that tree-sitter-mode
is turned on in the buffer), with Black formatter:
(require 'tree-sitter-extras)
(define-advice format-all-buffer (:around (f &rest args) tree-sitter-save-excursion)
(if tree-sitter-mode
(tree-sitter-save-excursion
(apply f args))
(apply f args)))
I think it's better to combine this with the diff-based approach mentioned in the issue you linked, though.
from elisp-tree-sitter.
This is a nice idea! I think it can be done as followed:
- Before formatting, store the "path" leading from the root node to the current node.
- After formatting, use that path to search for the corresponding node in the new syntax tree.
from elisp-tree-sitter.
@raxod502, who wrote apheleia.el
, is knowledgeable about this. If we use Needleman-Wunsch as with apheleia
, it's not clear to me how we'd combine this with a tree-sitter
-based approach.
from elisp-tree-sitter.
Yes, there are basically two good options for handling this issue:
- The smart approach, which is to have an understanding of the AST and the cursor's position within a specific node
- The dumb approach, which is to use a string alignment or regexp-based algorithm
If you've got the resources available to do the first approach, it'll probably work better. The reason I think the second approach is good is because the first approach requires a lot of work for each language / formatter, whereas the second approach works for all languages and formatters.
The disadvantages of the second approach are:
- it needs some heuristics to optimize for large diff regions, because the dynamic programming algorithm scales quadratically (radian-software/apheleia#4)
- it needs some heuristics to nudge the cursor to the most appropriate position sometimes, because the dynamic programming algorithm can select one of several different string alignments which score equally well but which do not seem equally appropriate to a user (radian-software/apheleia#2)
from elisp-tree-sitter.
Related Issues (20)
- `Unsupported Operating System: OpenBSD` HOT 7
- bin/build not work on linux because builtin cd will output the folder name. HOT 1
- tree-sitter languages download of windows binaries failed with error
- tsc-lang-abi-too-new when installing new language HOT 11
- Crash when large file contains an ERROR node
- Invalid version syntax: ‘[email protected] HOT 2
- Colors look wrong in haskell mode. HOT 3
- `tree-sitter-debug-mode` is broken
- Crash when loading one particular Markdown file HOT 7
- Reporting Vulnerability
- (ts-fold-indicators-mode) not working when running emacs from terminal
- How do I add a new grammer to this mode? HOT 2
- why the submodule langs pointed to an old commit?
- tree-sitter-hl-mode doesn't honor the :extend font face in single line comments HOT 1
- request to rebuild tsc-dyn.so with older Linux OS
- Provide `aarch64` build of `tsc-dyn.so` for AArch64 Linux
- Repetitions and Predicate Problems
- Tree sitter not loading in Raspberry Pi 5 with Emacs GNU Emacs 28.2 HOT 2
- `tsc-current-field` doesn't work against starting node HOT 7
- Returned parent node doesn't contain given node as child HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from elisp-tree-sitter.