diff options
author | Yuan Fu <casouri@gmail.com> | 2023-01-15 00:15:25 -0800 |
---|---|---|
committer | Yuan Fu <casouri@gmail.com> | 2023-01-15 01:11:37 -0800 |
commit | c78e19d99c01660284c6c4d58a2e98e1ba93fb6d (patch) | |
tree | 260b3e87d2afed08a9582fb585bbcf1ac9a8b9ba | |
parent | d13a329acff37b37091e137e3b04669ab7aab9ae (diff) | |
download | emacs-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.texi | 14 | ||||
-rw-r--r-- | lisp/treesit.el | 13 |
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")) |