From 076a25810127cb8c56ff0f5272a3d8b98192ee77 Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Sat, 5 Nov 2022 18:32:01 -0700 Subject: [PATCH] Allow tree-sitter indent offset to be a variable * doc/lispref/modes.texi (Parser-based Indentation): Update manual. * lisp/progmodes/js.el (js--treesit-indent-rules): Change all occurance of ,js-indent-level to js-indent-level. * lisp/progmodes/ts-mode.el (ts-mode--indent-rules): Change all occurance of ,ts-mode-indent-offset to ts-mode-indent-offset. * lisp/treesit.el (treesit-simple-indent-rules): Change docstring. (treesit-simple-indent): Allow offset to be a variable. --- doc/lispref/modes.texi | 3 ++- lisp/progmodes/js.el | 48 +++++++++++++++++++-------------------- lisp/progmodes/ts-mode.el | 38 +++++++++++++++---------------- lisp/treesit.el | 9 +++++--- 4 files changed, 51 insertions(+), 47 deletions(-) diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index e629679aeae..5d9c4b15d87 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -4838,7 +4838,8 @@ 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. +column for the current line. @var{offset} can be an integer or a +variable whose value is an integer. The @var{matcher} and @var{anchor} are functions, and Emacs provides convenient defaults for them. diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index a3f0bc0ed39..8ec7e7c6750 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -3412,34 +3412,34 @@ This function is intended for use in `after-change-functions'." ((node-is ")") parent-bol 0) ((node-is "]") parent-bol 0) ((node-is ">") parent-bol 0) - ((parent-is "ternary_expression") parent-bol ,js-indent-level) - ((parent-is "member_expression") parent-bol ,js-indent-level) + ((parent-is "ternary_expression") parent-bol js-indent-level) + ((parent-is "member_expression") parent-bol js-indent-level) ((node-is ,switch-case) parent-bol 0) ;; "{" on the newline. - ((node-is "statement_block") parent-bol ,js-indent-level) - ((parent-is "named_imports") parent-bol ,js-indent-level) - ((parent-is "statement_block") parent-bol ,js-indent-level) - ((parent-is "variable_declarator") parent-bol ,js-indent-level) - ((parent-is "arguments") parent-bol ,js-indent-level) - ((parent-is "array") parent-bol ,js-indent-level) - ((parent-is "formal_parameters") parent-bol ,js-indent-level) - ((parent-is "template_substitution") parent-bol ,js-indent-level) - ((parent-is "object_pattern") parent-bol ,js-indent-level) - ((parent-is "object") parent-bol ,js-indent-level) - ((parent-is "pair") parent-bol ,js-indent-level) - ((parent-is "arrow_function") parent-bol ,js-indent-level) - ((parent-is "parenthesized_expression") parent-bol ,js-indent-level) - ((parent-is "class_body") parent-bol ,js-indent-level) - ((parent-is ,switch-case) parent-bol ,js-indent-level) - ((parent-is "statement_block") parent-bol ,js-indent-level) + ((node-is "statement_block") parent-bol js-indent-level) + ((parent-is "named_imports") parent-bol js-indent-level) + ((parent-is "statement_block") parent-bol js-indent-level) + ((parent-is "variable_declarator") parent-bol js-indent-level) + ((parent-is "arguments") parent-bol js-indent-level) + ((parent-is "array") parent-bol js-indent-level) + ((parent-is "formal_parameters") parent-bol js-indent-level) + ((parent-is "template_substitution") parent-bol js-indent-level) + ((parent-is "object_pattern") parent-bol js-indent-level) + ((parent-is "object") parent-bol js-indent-level) + ((parent-is "pair") parent-bol js-indent-level) + ((parent-is "arrow_function") parent-bol js-indent-level) + ((parent-is "parenthesized_expression") parent-bol js-indent-level) + ((parent-is "class_body") parent-bol js-indent-level) + ((parent-is ,switch-case) parent-bol js-indent-level) + ((parent-is "statement_block") parent-bol js-indent-level) ;; JSX - ((parent-is "jsx_opening_element") parent ,js-indent-level) + ((parent-is "jsx_opening_element") parent js-indent-level) ((node-is "jsx_closing_element") parent 0) - ((node-is "jsx_text") parent ,js-indent-level) - ((parent-is "jsx_element") parent ,js-indent-level) + ((node-is "jsx_text") parent js-indent-level) + ((parent-is "jsx_element") parent js-indent-level) ((node-is "/") parent 0) - ((parent-is "jsx_self_closing_element") parent ,js-indent-level))))) + ((parent-is "jsx_self_closing_element") parent js-indent-level))))) (defvar js--treesit-keywords '("as" "async" "await" "break" "case" "catch" "class" "const" "continue" @@ -3852,11 +3852,11 @@ definition*\"." (defvar js--json-treesit-indent-rules `((json - (no-node (js--treesit-backward-up-list) ,js-indent-level) + (no-node (js--treesit-backward-up-list) js-indent-level) ((node-is "}") parent-bol 0) ((node-is ")") parent-bol 0) ((node-is "]") parent-bol 0) - ((parent-is "object") parent-bol ,js-indent-level) + ((parent-is "object") parent-bol js-indent-level) ))) ;;;###autoload diff --git a/lisp/progmodes/ts-mode.el b/lisp/progmodes/ts-mode.el index a7dee1ead88..f4dfa2ae95f 100644 --- a/lisp/progmodes/ts-mode.el +++ b/lisp/progmodes/ts-mode.el @@ -60,29 +60,29 @@ ((node-is ")") parent-bol 0) ((node-is "]") parent-bol 0) ((node-is ">") parent-bol 0) - ((parent-is "ternary_expression") parent-bol ,ts-mode-indent-offset) - ((parent-is "member_expression") parent-bol ,ts-mode-indent-offset) - ((parent-is "named_imports") parent-bol ,ts-mode-indent-offset) - ((parent-is "statement_block") parent-bol ,ts-mode-indent-offset) - ((parent-is "type_arguments") parent-bol ,ts-mode-indent-offset) - ((parent-is "variable_declarator") parent-bol ,ts-mode-indent-offset) - ((parent-is "arguments") parent-bol ,ts-mode-indent-offset) - ((parent-is "array") parent-bol ,ts-mode-indent-offset) - ((parent-is "formal_parameters") parent-bol ,ts-mode-indent-offset) - ((parent-is "template_substitution") parent-bol ,ts-mode-indent-offset) - ((parent-is "object_pattern") parent-bol ,ts-mode-indent-offset) - ((parent-is "object") parent-bol ,ts-mode-indent-offset) - ((parent-is "object_type") parent-bol ,ts-mode-indent-offset) - ((parent-is "enum_body") parent-bol ,ts-mode-indent-offset) - ((parent-is "arrow_function") parent-bol ,ts-mode-indent-offset) - ((parent-is "parenthesized_expression") parent-bol ,ts-mode-indent-offset) + ((parent-is "ternary_expression") parent-bol ts-mode-indent-offset) + ((parent-is "member_expression") parent-bol ts-mode-indent-offset) + ((parent-is "named_imports") parent-bol ts-mode-indent-offset) + ((parent-is "statement_block") parent-bol ts-mode-indent-offset) + ((parent-is "type_arguments") parent-bol ts-mode-indent-offset) + ((parent-is "variable_declarator") parent-bol ts-mode-indent-offset) + ((parent-is "arguments") parent-bol ts-mode-indent-offset) + ((parent-is "array") parent-bol ts-mode-indent-offset) + ((parent-is "formal_parameters") parent-bol ts-mode-indent-offset) + ((parent-is "template_substitution") parent-bol ts-mode-indent-offset) + ((parent-is "object_pattern") parent-bol ts-mode-indent-offset) + ((parent-is "object") parent-bol ts-mode-indent-offset) + ((parent-is "object_type") parent-bol ts-mode-indent-offset) + ((parent-is "enum_body") parent-bol ts-mode-indent-offset) + ((parent-is "arrow_function") parent-bol ts-mode-indent-offset) + ((parent-is "parenthesized_expression") parent-bol ts-mode-indent-offset) ;; TSX - ((parent-is "jsx_opening_element") parent ,ts-mode-indent-offset) + ((parent-is "jsx_opening_element") parent ts-mode-indent-offset) ((node-is "jsx_closing_element") parent 0) - ((parent-is "jsx_element") parent ,ts-mode-indent-offset) + ((parent-is "jsx_element") parent ts-mode-indent-offset) ((node-is "/") parent 0) - ((parent-is "jsx_self_closing_element") parent ,ts-mode-indent-offset) + ((parent-is "jsx_self_closing_element") parent ts-mode-indent-offset) (no-node parent-bol 0))) "Tree-sitter indent rules.") diff --git a/lisp/treesit.el b/lisp/treesit.el index 09e5d8084e2..7233ce7f18b 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -894,8 +894,9 @@ If MATCHER returns non-nil, meaning the rule matches, Emacs then uses ANCHOR to find an anchor, it should be a function that takes the same argument (NODE PARENT BOL) and returns a point. -Finally Emacs computes the column of that point returned by ANCHOR -and adds OFFSET to it, and indents to that column. +Finally Emacs computes the column of that point returned by +ANCHOR and adds OFFSET to it, and indents to that column. OFFSET +can be an integer or a variable whose value is an integer. For MATCHER and ANCHOR, Emacs provides some convenient presets. See `treesit-simple-indent-presets'.") @@ -1298,7 +1299,9 @@ OFFSET." (let ((anchor-pos (treesit--simple-indent-eval (list anchor node parent bol)))) - (cons anchor-pos offset)) + (cons anchor-pos (if (symbolp offset) + (symbol-value offset) + offset))) finally return (progn (when treesit--indent-verbose (message "No matched rule")) -- 2.39.5