GNU bug report logs -
#73404
30.0.50; [forward/kill/etc]-sexp commands do not behave as expected in tree-sitter modes
Previous Next
Reported by: Mickey Petersen <mickey <at> masteringemacs.org>
Date: Sat, 21 Sep 2024 05:13:01 UTC
Severity: normal
Merged with 74366
Found in version 30.0.50
Fixed in version 31.0.50
Done: Juri Linkov <juri <at> linkov.net>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
> Note that you can affect the behavior of tree-sitter sexp movement by
> defining the sexp “thing” in treesit-thing-settings. Js-ts-mode defines one
> (js--treesit-sexp-nodes) and it only consider some nodes as sexp. You might
> be able to tweak the sexp movement to your liking by changing it, or
> directly modifying the definition for `sexp’ in treesit-thing-settings.
>
>>> Do you think the examples I listed in the original bug report match
>>> your expectations? If so, then it is probably OK to close the bug report.
>>
>> Yes, I do, but let's wait for others to chime in if they have opinions
>> on this.
Here are some ideas how to cover more use cases.
Suppose that a user wants to disable tree-sitter sexp movement
completely to use the default forward-sexp-default-function.
The natural way to do this would be set the list of nodes to nil:
(setq js--treesit-sexp-nodes nil)
However, this currently doesn't work, and requires a change like this:
@@ -2290,10 +2290,12 @@ treesit-forward-sexp
(treesit-node-at (point) (treesit-language-at (point)))))
(or (when (and node-at-point
;; Make sure point is strictly inside node.
- (< (treesit-node-start node-at-point)
- (point)
- (treesit-node-end node-at-point))
- (treesit-node-match-p node-at-point 'text t))
+ (<= (treesit-node-start node-at-point)
+ (point)
+ (treesit-node-end node-at-point))
+ (or (treesit-node-match-p node-at-point 'text t)
+ (not (treesit-node-match-p node-at-point 'sexp t))
+ ))
(forward-sexp-default-function arg)
t)
(if (> arg 0)
Now, the next case: what if the user wants to use the default
forward-sexp-default-function except for the 'binary_expression'
like "a + b" where `C-M-f' should move from "a" to the end of "b":
export const add = (a, b) => -!-a + b;
should move to
export const add = (a, b) => a + b;
^1
The best way for the user would be to customize:
(setq js--treesit-sexp-nodes '("binary_expression"))
But this is not yet handled by the condition above:
(not (treesit-node-match-p node-at-point 'sexp t))
because 'node-at-point' is "identifier".
So we need to use 'treesit-parent-until'
to check if all parent nodes match
'js--treesit-sexp-nodes'. Then it will find
the parent "binary_expression".
I believe something like this will make
treesit-forward-sexp more customizable.
This bug report was last modified 131 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.