summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuan Fu <casouri@gmail.com>2023-01-15 00:15:25 -0800
committerYuan Fu <casouri@gmail.com>2023-01-15 01:11:37 -0800
commitc78e19d99c01660284c6c4d58a2e98e1ba93fb6d (patch)
tree260b3e87d2afed08a9582fb585bbcf1ac9a8b9ba
parentd13a329acff37b37091e137e3b04669ab7aab9ae (diff)
downloademacs-c78e19d99c01660284c6c4d58a2e98e1ba93fb6d.tar.gz
emacs-c78e19d99c01660284c6c4d58a2e98e1ba93fb6d.tar.bz2
emacs-c78e19d99c01660284c6c4d58a2e98e1ba93fb6d.zip
Allow offset in tree-sitter indent rules to be functions
This is needed for fixing C indentation. See next comment. * doc/lispref/modes.texi (Parser-based Indentation): Update manual. * lisp/treesit.el (treesit-simple-indent): Try evaluating OFFSET as a function if it's not integer nor variable.
-rw-r--r--doc/lispref/modes.texi14
-rw-r--r--lisp/treesit.el13
2 files changed, 17 insertions, 10 deletions
diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index ff372edb3ff..fe5eb8a1b8d 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -4926,8 +4926,7 @@ the current line to @var{matcher}; if it returns non-@code{nil}, this
rule is applicable. Then Emacs passes the node to @var{anchor}, which
returns a buffer position. Emacs takes the column number of that
position, adds @var{offset} to it, and the result is the indentation
-column for the current line. @var{offset} can be an integer or a
-variable whose value is an integer.
+column for the current line.
The @var{matcher} and @var{anchor} are functions, and Emacs provides
convenient defaults for them.
@@ -4943,10 +4942,13 @@ inside a multi-line string, no node can start at that position, so
@var{node} is @code{nil}. In that case, @var{parent} would be the
smallest node that spans that position.
-Emacs finds @var{bol}, @var{node} and @var{parent} and
-passes them to each @var{matcher} and @var{anchor}. @var{matcher}
-should return non-@code{nil} if the rule is applicable, and
-@var{anchor} should return a buffer position.
+@var{matcher} should return non-@code{nil} if the rule is applicable,
+and @var{anchor} should return a buffer position.
+
+@var{offset} can be an integer, a variable whose value is an integer,
+or a function that returns an integer. If it is a function, it is
+passed @var{node}, @var{parent}, and @var{bol}, like matchers and
+anchors.
@end defvar
@defvar treesit-simple-indent-presets
diff --git a/lisp/treesit.el b/lisp/treesit.el
index 5b306354465..ffc78b93032 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -1511,10 +1511,15 @@ OFFSET."
return
(let ((anchor-pos
(treesit--simple-indent-eval
- (list anchor node parent bol))))
- (cons anchor-pos (if (symbolp offset)
- (symbol-value offset)
- offset)))
+ (list anchor node parent bol)))
+ (offset-val
+ (cond ((numberp offset) offset)
+ ((and (symbolp offset)
+ (boundp offset))
+ (symbol-value offset))
+ (t (treesit--simple-indent-eval
+ (list offset node parent bol))))))
+ (cons anchor-pos offset-val))
finally return
(progn (when treesit--indent-verbose
(message "No matched rule"))