From c78e19d99c01660284c6c4d58a2e98e1ba93fb6d Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Sun, 15 Jan 2023 00:15:25 -0800 Subject: [PATCH] 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. --- doc/lispref/modes.texi | 14 ++++++++------ 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")) -- 2.39.2