all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Theodor Thornhill via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: 59251@debbugs.gnu.org
Cc: casouri@gmail.com
Subject: bug#59251: 29.0.50; Fix-some-inconsistencies-in-ts-modes
Date: Sun, 13 Nov 2022 21:42:19 +0100	[thread overview]
Message-ID: <87k03ya8no.fsf@thornhill.no> (raw)

[-- Attachment #1: Type: text/plain, Size: 626 bytes --]


Hi Yuan!

I've make some changes to my *-ts-modes, and would appreciate a second
opinion as well as a push to the feature/tree-sitter branch :-)

I've extracted some of the relevant mode-init variables into defcustoms
so that users can tweak their behavior.  It also seems I forgot some
electric indent configs in some of the other files, so I added that
aswell.

BTW, should we do the same thing we did with js-mode - add a js-ts-mode
and don't change the js.el file at all?  We could either go the same
route as c-ts-mode, where we define both c and c++ in the same file, or
keep them separate.  What do you think?

Theo



[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fix-some-inconsistencies-in-ts-modes.patch --]
[-- Type: text/x-diff, Size: 10970 bytes --]

From 0c2181a0bd3dbcf8c896404932fbd8eb2d2ee897 Mon Sep 17 00:00:00 2001
From: Theodor Thornhill <theo@thornhill.no>
Date: Sun, 13 Nov 2022 21:37:01 +0100
Subject: [PATCH] Fix some inconsistencies in *-ts-modes

* lisp/progmodes/c-ts-mode.el (c-ts-mode-comment-style): New
defcustom.
(c-ts-mode-font-lock-feature-list): New defcustom.
(c-ts-mode--base-mode): Extract comment-* so that we can separate
between C and C++.  Use the new font-lock-feature-list defcustom.
(c-ts-mode, c++-ts-mode): Set comment-* variables.

* lisp/progmodes/css-ts-mode.el (css-ts-mode): Add electric-indent.

* lisp/progmodes/java-ts-mode.el
(java-ts-mode-font-lock-feature-list): New defcustom.
(java-ts-mode): Add electric-indent and use the font-lock-feature-list
defcustom.

* lisp/progmodes/json-ts-mode.el
(json-ts-mode-font-lock-feature-list): New defcustom.
(json-ts-mode--font-lock-settings): Make much more granular font lock
features.
(json-ts-mode): Add electric-indent and use the font-lock-feature-list
defcustom.

* lisp/progmodes/ts-mode.el (ts-mode-font-lock-feature-list): New
defcustom.
(ts-mode--font-lock-settings): Whitespace cleanup.
(ts-mode): Add electric-indent and use the font-lock-feature-list
defcustom.
---
 lisp/progmodes/c-ts-mode.el    | 42 ++++++++++++++++++++++-------
 lisp/progmodes/css-ts-mode.el  |  4 +++
 lisp/progmodes/java-ts-mode.el | 21 ++++++++++++---
 lisp/progmodes/json-ts-mode.el | 49 ++++++++++++++++++++++++----------
 lisp/progmodes/ts-mode.el      | 30 ++++++++++++++++++---
 5 files changed, 116 insertions(+), 30 deletions(-)

diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index 5617ea7d7c..75ab5ed737 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -31,6 +31,25 @@
 (require 'treesit)
 (require 'rx)
 
+(defcustom c-ts-mode-comment-style 'multi-line
+  "The comment style as decided by `comment-styles'"
+  :type 'symbol
+  :safe 'symbolp
+  :group 'c)
+
+(defcustom c-ts-mode-font-lock-feature-list
+  '((comment preprocessor operator constant string literal keyword)
+    (type definition expression statement)
+    ())
+  "Language constructs to font-lock.
+
+See `treesit-font-lock-feature-list' for description of how to
+use this variable.  Supported features are as defined in
+`c-ts-mode--font-lock-settings'."
+  :type 'list
+  :safe 'listp
+  :group 'c)
+
 (defcustom c-ts-mode-indent-offset 2
   "Number of spaces for each indentation step in `c-ts-mode'."
   :type 'integer
@@ -399,11 +418,6 @@ c-ts-mode--base-mode
   :group 'c
   :syntax-table c-ts-mode--syntax-table
 
-  ;; Comments.
-  (setq-local comment-start "// ")
-  (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
-  (setq-local comment-end "")
-
   ;; Navigation.
   (setq-local treesit-defun-type-regexp
               (rx (or "specifier"
@@ -415,16 +429,14 @@ c-ts-mode--base-mode
 
   ;; Electric
   (setq-local electric-indent-chars
-	      (append "{}():;," electric-indent-chars))
+              (append "{}():;," electric-indent-chars))
 
   ;; Imenu.
   (setq-local imenu-create-index-function #'c-ts-mode--imenu)
   (setq-local which-func-functions nil)
 
   (setq-local treesit-font-lock-feature-list
-              '((comment preprocessor operator constant string literal keyword)
-                (type definition expression statement)
-                (error))))
+              c-ts-mode-font-lock-feature-list))
 
 ;;;###autoload
 (define-derived-mode c-ts-mode c-ts-mode--base-mode "C"
@@ -436,6 +448,12 @@ c-ts-mode
 
   (treesit-parser-create 'c)
 
+  ;; Comments.
+  (setq-local comment-start "/* ")
+  (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
+  (setq-local comment-end " */")
+  (setq-local comment-style c-ts-mode-comment-style)
+
   (setq-local treesit-simple-indent-rules
               (c-ts-mode--set-indent-style 'c))
 
@@ -452,6 +470,12 @@ c++-ts-mode
   (unless (treesit-ready-p nil 'cpp)
     (error "Tree-sitter for C++ isn't available"))
 
+  ;; Comments.
+  (setq-local comment-start "// ")
+  (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
+  (setq-local comment-end "")
+  (setq-local comment-style c-ts-mode-comment-style)
+
   (treesit-parser-create 'cpp)
 
   (setq-local treesit-simple-indent-rules
diff --git a/lisp/progmodes/css-ts-mode.el b/lisp/progmodes/css-ts-mode.el
index e22bf99c6c..8cb6074043 100644
--- a/lisp/progmodes/css-ts-mode.el
+++ b/lisp/progmodes/css-ts-mode.el
@@ -114,6 +114,10 @@ css-ts-mode
   ;; Indent.
   (setq-local treesit-simple-indent-rules css-ts-mode--indent-rules)
 
+  ;; Electric
+  (setq-local electric-indent-chars
+              (append "{}():;," electric-indent-chars))
+
   ;; Navigation.
   (setq-local treesit-defun-type-regexp "rule_set")
   ;; Font-lock.
diff --git a/lisp/progmodes/java-ts-mode.el b/lisp/progmodes/java-ts-mode.el
index 5ec7da9f5c..8aed2db9c6 100644
--- a/lisp/progmodes/java-ts-mode.el
+++ b/lisp/progmodes/java-ts-mode.el
@@ -31,6 +31,19 @@
 (require 'treesit)
 (require 'rx)
 
+(defcustom java-ts-mode-font-lock-feature-list
+  '((basic comment keyword constant string operator)
+    (type definition expression literal annotation)
+    ())
+  "Language constructs to font-lock.
+
+See `treesit-font-lock-feature-list' for description of how to
+use this variable.  Supported features are as defined in
+`java-ts-mode--font-lock-settings'."
+  :type 'list
+  :safe 'listp
+  :group 'java)
+
 (defcustom java-ts-mode-indent-offset 4
   "Number of spaces for each indentation step in `java-ts-mode'."
   :type 'integer
@@ -268,6 +281,10 @@ java-ts-mode
   ;; Indent.
   (setq-local treesit-simple-indent-rules java-ts-mode--indent-rules)
 
+  ;; Electric
+  (setq-local electric-indent-chars
+              (append "{}():;," electric-indent-chars))
+
   ;; Navigation.
   (setq-local treesit-defun-type-regexp
               (rx (or "declaration")))
@@ -275,9 +292,7 @@ java-ts-mode
   ;; Font-lock.
   (setq-local treesit-font-lock-settings java-ts-mode--font-lock-settings)
   (setq-local treesit-font-lock-feature-list
-              '((basic comment keyword constant string operator)
-                (type definition expression literal annotation)
-                ()))
+              java-ts-mode-font-lock-feature-list)
 
   ;; Imenu.
   (setq-local imenu-create-index-function #'java-ts-mode--imenu)
diff --git a/lisp/progmodes/json-ts-mode.el b/lisp/progmodes/json-ts-mode.el
index 686640f98a..140ad5b523 100644
--- a/lisp/progmodes/json-ts-mode.el
+++ b/lisp/progmodes/json-ts-mode.el
@@ -31,6 +31,17 @@
 (require 'treesit)
 (require 'rx)
 
+(defcustom json-ts-mode-font-lock-feature-list
+  '((comment string number) (constant pair) ())
+  "Language constructs to font-lock.
+
+See `treesit-font-lock-feature-list' for description of how to
+use this variable.  Supported features are as defined in
+`json-ts-mode--font-lock-settings'."
+  :type 'list
+  :safe 'listp
+  :group 'json)
+
 (defcustom json-ts-mode-indent-offset 2
   "Number of spaces for each indentation step in `json-ts-mode'."
   :type 'integer
@@ -67,20 +78,26 @@ json-ts--indent-rules
 (defvar json-ts-mode--font-lock-settings
   (treesit-font-lock-rules
    :language 'json
-   :feature 'minimal
+   :feature 'comment
    :override t
-   `((pair
-      key: (_) @font-lock-string-face)
-
-     (string) @font-lock-string-face
-
-     (number) @font-lock-constant-face
-
-     [(null) (true) (false)] @font-lock-constant-face
-
-     (escape_sequence) @font-lock-constant-face
-
-     (comment) @font-lock-comment-face))
+   '((comment) @font-lock-comment-face)
+   :language 'json
+   :feature 'string
+   :override t
+   '((escape_sequence) @font-lock-constant-face
+     (string) @font-lock-string-face)
+   :language 'json
+   :feature 'number
+   :override t
+   '((number) @font-lock-constant-face)
+   :language 'json
+   :feature 'constant
+   :override t
+   '([(null) (true) (false)] @font-lock-constant-face)
+   :language 'json
+   :feature 'pair
+   :override t
+   `((pair key: (_) @font-lock-variable-name-face)))
   "Font-lock settings for JSON.")
 
 (defun json-ts-mode--imenu-1 (node)
@@ -127,6 +144,10 @@ json-ts-mode
   (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
   (setq-local comment-end "")
 
+  ;; Electric
+  (setq-local electric-indent-chars
+              (append "{}():;," electric-indent-chars))
+
   ;; Indent.
   (setq-local treesit-simple-indent-rules json-ts--indent-rules)
 
@@ -137,7 +158,7 @@ json-ts-mode
   ;; Font-lock.
   (setq-local treesit-font-lock-settings json-ts-mode--font-lock-settings)
   (setq-local treesit-font-lock-feature-list
-              '((minimal) () ()))
+              json-ts-mode-font-lock-feature-list)
 
   ;; Imenu.
   (setq-local imenu-create-index-function #'json-ts-mode--imenu)
diff --git a/lisp/progmodes/ts-mode.el b/lisp/progmodes/ts-mode.el
index f4dfa2ae95..73f8c38238 100644
--- a/lisp/progmodes/ts-mode.el
+++ b/lisp/progmodes/ts-mode.el
@@ -28,6 +28,19 @@
 (require 'rx)
 (require 'js)
 
+(defcustom ts-mode-font-lock-feature-list
+  '((comment declaration)
+    (string keyword identifier expression constant)
+    (property pattern jsx))
+  "Language constructs to font-lock.
+
+See `treesit-font-lock-feature-list' for description of how to
+use this variable.  Supported features are as defined in
+`ts-mode--font-lock-settings'."
+  :type 'list
+  :safe 'listp
+  :group 'typescript)
+
 (defcustom ts-mode-indent-offset 2
   "Number of spaces for each indentation step in `ts-mode'."
   :type 'integer
@@ -100,7 +113,6 @@ ts-mode--keywords
 
 (defvar ts-mode--font-lock-settings
   (treesit-font-lock-rules
-
    :language 'tsx
    :override t
    :feature 'comment
@@ -271,29 +283,39 @@ ts-mode
    ((treesit-ready-p nil 'tsx)
     ;; Tree-sitter.
     (treesit-parser-create 'tsx)
+
     ;; Comments.
     (setq-local comment-start "// ")
     (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
     (setq-local comment-end "")
+
+    ;; Electric
+    (setq-local electric-indent-chars
+                (append "{}():;," electric-indent-chars))
+
     ;; Indent.
     (setq-local treesit-simple-indent-rules ts-mode--indent-rules)
+
     ;; Navigation.
     (setq-local treesit-defun-type-regexp
                 (rx (or "class_declaration"
                         "method_definition"
                         "function_declaration"
                         "lexical_declaration")))
+
     ;; Font-lock.
     (setq-local treesit-font-lock-settings ts-mode--font-lock-settings)
     (setq-local treesit-font-lock-feature-list
-                '((comment declaration)
-                  (string keyword identifier expression constant)
-                  (property pattern jsx)))
+                ts-mode-font-lock-feature-list)
+
     ;; Imenu.
     (setq-local imenu-create-index-function #'js--treesit-imenu)
+
     ;; Which-func (use imenu).
     (setq-local which-func-functions nil)
+
     (treesit-major-mode-setup))
+
    ;; Elisp.
    (t
     (js-mode)
-- 
2.34.1


             reply	other threads:[~2022-11-13 20:42 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-13 20:42 Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
     [not found] ` <handler.59251.B.16683721605982.ack@debbugs.gnu.org>
2022-11-13 22:16   ` bug#59251: Acknowledgement (29.0.50; Fix-some-inconsistencies-in-ts-modes) Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-11-13 23:01     ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-11-14  0:51       ` Yuan Fu
2022-11-14  7:06         ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-11-14  9:25           ` Yuan Fu
2022-11-15 12:22           ` Eli Zaretskii
2022-11-15 14:22             ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-11-14 19:02         ` Eli Zaretskii
2022-11-14 18:59 ` bug#59251: 29.0.50; Fix-some-inconsistencies-in-ts-modes Eli Zaretskii
2022-11-14 19:12   ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87k03ya8no.fsf@thornhill.no \
    --to=bug-gnu-emacs@gnu.org \
    --cc=59251@debbugs.gnu.org \
    --cc=casouri@gmail.com \
    --cc=theo@thornhill.no \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.