From 5f5695916b71af4f9e778f4bd5c51edb2c85067e Mon Sep 17 00:00:00 2001 From: Theodor Thornhill Date: Sat, 26 Nov 2022 19:54:47 +0100 Subject: [PATCH] Add indent styles to all tree-sitter modes Enable users to provide their own function to control the indentation style. Even though we don't supply any extra styles for indentation, this should give the users an escape hatch should the provided style not suit their needs. * lisp/progmodes/c-ts-mode.el (c-ts-mode-indent-style): Fix typo. * lisp/progmodes/csharp-mode.el (csharp-ts-mode-indent-style) (csharp-ts-mode--set-indent-style, csharp-ts-mode): New defcustom and helper. * lisp/progmodes/java-ts-mode.el (java-ts-mode-indent-style) (java-ts-mode--set-indent-style, java-ts-mode): New defcustom and helper. * lisp/progmodes/js.el (js-ts-mode-indent-style) (js--treesit-set-indent-style, js-ts-mode): New defcustom and helper. * lisp/progmodes/json-ts-mode.el (json-ts-mode-indent-style) (json-ts-mode--set-indent-style, json-ts-mode): Enable custom indent style. * lisp/progmodes/typescript-ts-mode.el (typescript-ts-mode-indent-style) (typescript-ts-mode--set-indent-style, typescript-ts-mode): Enable custom indent style. * lisp/progmodes/css.el (css-ts-mode-indent-style) (css--treesit-set-indent-style, css-ts-mode): New defcustom and helper. --- lisp/progmodes/c-ts-mode.el | 2 +- lisp/progmodes/csharp-mode.el | 21 ++++++++++++++++++++- lisp/progmodes/java-ts-mode.el | 21 ++++++++++++++++++++- lisp/progmodes/js.el | 21 ++++++++++++++++++++- lisp/progmodes/json-ts-mode.el | 21 ++++++++++++++++++++- lisp/progmodes/typescript-ts-mode.el | 21 ++++++++++++++++++++- lisp/textmodes/css-mode.el | 21 ++++++++++++++++++++- 7 files changed, 121 insertions(+), 7 deletions(-) diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index fc35d9aedd..c384182772 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -52,7 +52,7 @@ c-ts-mode-indent-style The selected style could be one of GNU, K&R, LINUX or BSD. If one of the supplied styles doesn't suffice a function could be -set instead. This function is expected return a list that +set instead. This function is expected to return a list that follows the form of `treesit-simple-indent-rules'." :version "29.1" :type '(choice (symbol :tag "Gnu" 'gnu) diff --git a/lisp/progmodes/csharp-mode.el b/lisp/progmodes/csharp-mode.el index a544a4b5cb..a6373b5826 100644 --- a/lisp/progmodes/csharp-mode.el +++ b/lisp/progmodes/csharp-mode.el @@ -696,6 +696,24 @@ csharp-ts-mode-indent-offset :safe 'integerp :group 'csharp) +(defcustom csharp-ts-mode-indent-style 'csharp-ts-mode--default-style + "Style used for indentation. + +The selected style could either be the default style, or a +function could be set instead. This function is expected to +return a list that follows the form of +`treesit-simple-indent-rules'." + :version "29.1" + :type '(choice (symbol :tag "Default" 'csharp-ts-mode--default-style) + (function :tag "A function for user customized style" ignore)) + :group 'csharp) + +(defun csharp-ts-mode--set-indent-style () + "Helper function to set indentation style." + (if (functionp csharp-ts-mode-indent-style) + (funcall csharp-ts-mode-indent-style) + csharp-ts-mode--indent-rules)) + (defvar csharp-ts-mode--indent-rules `((c-sharp ((parent-is "compilation_unit") parent-bol 0) @@ -962,7 +980,8 @@ csharp-ts-mode (setq-local comment-end "") ;; Indent. - (setq-local treesit-simple-indent-rules csharp-ts-mode--indent-rules) + (setq-local treesit-simple-indent-rules + (csharp-ts-mode--set-indent-style)) ;; Electric (setq-local electric-indent-chars diff --git a/lisp/progmodes/java-ts-mode.el b/lisp/progmodes/java-ts-mode.el index ee2934f53c..29de2ccb28 100644 --- a/lisp/progmodes/java-ts-mode.el +++ b/lisp/progmodes/java-ts-mode.el @@ -42,6 +42,24 @@ java-ts-mode-indent-offset :safe 'integerp :group 'java) +(defcustom java-ts-mode-indent-style 'java-ts-mode--default-style + "Style used for indentation. + +The selected style could either be the default style, or a +function could be set instead. This function is expected to +return a list that follows the form of +`treesit-simple-indent-rules'." + :version "29.1" + :type '(choice (symbol :tag "Default" 'java-ts-mode--default-style) + (function :tag "A function for user customized style" ignore)) + :group 'java) + +(defun java-ts-mode--set-indent-style () + "Helper function to set indentation style." + (if (functionp java-ts-mode-indent-style) + (funcall java-ts-mode-indent-style) + java-ts-mode--indent-rules)) + (defvar java-ts-mode--syntax-table (let ((table (make-syntax-table))) ;; Taken from the cc-langs version @@ -305,7 +323,8 @@ java-ts-mode (setq-local treesit-comment-end (rx (+ (or "*")) "/")) ;; Indent. - (setq-local treesit-simple-indent-rules java-ts-mode--indent-rules) + (setq-local treesit-simple-indent-rules + (java-ts-mode--set-indent-style)) ;; Electric (setq-local electric-indent-chars diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index da05b7b364..9535d4986f 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -3457,6 +3457,24 @@ js--treesit-indent-rules ((node-is "/") parent 0) ((parent-is "jsx_self_closing_element") parent js-indent-level))))) +(defcustom js-ts-mode-indent-style 'js--treesit-default-style + "Style used for indentation. + +The selected style could either be the default style, or a +function could be set instead. This function is expected to +return a list that follows the form of +`treesit-simple-indent-rules'." + :version "29.1" + :type '(choice (symbol :tag "Default" 'js--treesit-default-style) + (function :tag "A function for user customized style" ignore)) + :group 'javascript) + +(defun js--treesit-set-indent-style () + "Helper function to set indentation style." + (if (functionp js-ts-mode-indent-style) + (funcall js-ts-mode-indent-style) + js--treesit-indent-rules)) + (defvar js--treesit-keywords '("as" "async" "await" "break" "case" "catch" "class" "const" "continue" "debugger" "default" "delete" "do" "else" "export" "extends" "finally" @@ -3862,7 +3880,8 @@ js-ts-mode ;; Tree-sitter setup. (treesit-parser-create 'javascript) ;; Indent. - (setq-local treesit-simple-indent-rules js--treesit-indent-rules) + (setq-local treesit-simple-indent-rules + (js--treesit-set-indent-style)) ;; Navigation. (setq-local treesit-defun-type-regexp (rx (or "class_declaration" diff --git a/lisp/progmodes/json-ts-mode.el b/lisp/progmodes/json-ts-mode.el index 101e873cf6..4ee2cad9da 100644 --- a/lisp/progmodes/json-ts-mode.el +++ b/lisp/progmodes/json-ts-mode.el @@ -44,6 +44,24 @@ json-ts-mode-indent-offset :safe 'integerp :group 'json) +(defcustom json-ts-mode-indent-style 'json-ts-mode--default-style + "Style used for indentation. + +The selected style could either be the default style, or a +function could be set instead. This function is expected to +return a list that follows the form of +`treesit-simple-indent-rules'." + :version "29.1" + :type '(choice (symbol :tag "Default" 'json-ts-mode--default-style) + (function :tag "A function for user customized style" ignore)) + :group 'json) + +(defun json-ts-mode--set-indent-style () + "Helper function to set indentation style." + (if (functionp json-ts-mode-indent-style) + (funcall json-ts-mode-indent-style) + json-ts-mode--indent-rules)) + (defvar json-ts-mode--syntax-table (let ((table (make-syntax-table))) ;; Taken from the cc-langs version @@ -147,7 +165,8 @@ json-ts-mode (append "{}():;," electric-indent-chars)) ;; Indent. - (setq-local treesit-simple-indent-rules json-ts--indent-rules) + (setq-local treesit-simple-indent-rules + (json-ts-mode--set-indent-style)) ;; Navigation. (setq-local treesit-defun-type-regexp diff --git a/lisp/progmodes/typescript-ts-mode.el b/lisp/progmodes/typescript-ts-mode.el index 763686bf66..106b8363f0 100644 --- a/lisp/progmodes/typescript-ts-mode.el +++ b/lisp/progmodes/typescript-ts-mode.el @@ -37,6 +37,24 @@ typescript-ts-mode-indent-offset :safe 'integerp :group 'typescript) +(defcustom typescript-ts-mode-indent-style 'typescript-ts-mode--default-style + "Style used for indentation. + +The selected style could either be the default style, or a +function could be set instead. This function is expected to +return a list that follows the form of +`treesit-simple-indent-rules'." + :version "29.1" + :type '(choice (symbol :tag "Default" 'typescript-ts-mode--default-style) + (function :tag "A function for user customized style" ignore)) + :group 'typescript) + +(defun typescript-ts-mode--set-indent-style () + "Helper function to set indentation style." + (if (functionp typescript-ts-mode-indent-style) + (funcall typescript-ts-mode-indent-style) + typescript-ts-mode--indent-rules)) + (defvar typescript-ts-mode--syntax-table (let ((table (make-syntax-table))) ;; Taken from the cc-langs version @@ -308,7 +326,8 @@ typescript-ts-mode (append "{}():;," electric-indent-chars)) ;; Indent. - (setq-local treesit-simple-indent-rules typescript-ts-mode--indent-rules) + (setq-local treesit-simple-indent-rules + (typescript-ts-mode--set-indent-style)) ;; Navigation. (setq-local treesit-defun-type-regexp diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el index 734252ee66..eaf3fec939 100644 --- a/lisp/textmodes/css-mode.el +++ b/lisp/textmodes/css-mode.el @@ -1343,6 +1343,24 @@ css--treesit-indent-rules ((match nil "declaration" nil 3) (nth-sibling 2) 0))) "Tree-sitter indentation rules for `css-ts-mode'.") +(defcustom css-ts-mode-indent-style 'css--treesit-default-style + "Style used for indentation. + +The selected style could either be the default style, or a +function could be set instead. This function is expected to +return a list that follows the form of +`treesit-simple-indent-rules'." + :version "29.1" + :type '(choice (symbol :tag "Default" 'css--treesit-default-style) + (function :tag "A function for user customized style" ignore)) + :group 'css) + +(defun css--treesit-set-indent-style () + "Helper function to set indentation style." + (if (functionp css-ts-mode-indent-style) + (funcall css-ts-mode-indent-style) + css--treesit-indent-rules)) + (defvar css--treesit-settings (treesit-font-lock-rules :feature 'comment @@ -1804,7 +1822,8 @@ css-ts-mode ;; Tree-sitter specific setup. (treesit-parser-create 'css) - (setq-local treesit-simple-indent-rules css--treesit-indent-rules) + (setq-local treesit-simple-indent-rules + (css--treesit-set-indent-style)) (setq-local treesit-defun-type-regexp "rule_set") (setq-local treesit-font-lock-settings css--treesit-settings) (setq-local treesit-font-lock-feature-list -- 2.34.1