From: Theodor Thornhill via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: Yuan Fu <casouri@gmail.com>
Cc: 59251@debbugs.gnu.org
Subject: bug#59251: Acknowledgement (29.0.50; Fix-some-inconsistencies-in-ts-modes)
Date: Mon, 14 Nov 2022 08:06:31 +0100 [thread overview]
Message-ID: <877czy2ex4.fsf@thornhill.no> (raw)
In-Reply-To: <6C5721BF-2FA2-45A4-A970-483D662A6414@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1526 bytes --]
Yuan Fu <casouri@gmail.com> writes:
>> On Nov 13, 2022, at 3:01 PM, Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors <bug-gnu-emacs@gnu.org> wrote:
>>
>> Theodor Thornhill <theo@thornhill.no> writes:
>>
>>> Added a few more finishes.
>>
>> Aaand another. Last one for now. I promise…
>
> Cool! Some comments:
>
> +(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'."
> + :version "29.1"
> + :type 'list
> + :safe 'listp
> + :group 'c)
> +
>
> I think Stefan M’s opinion is to make feature-list private, and let
> users add/remove features. Right now they can add/remove features with
> treesit-recompute-feature-list. I guess we can keep them as defvar’s
> for now, so people as the option to redefine this list should they
> want to. (One argument against having them as custom options is that,
> if a user sets it as a custom option, they will miss out on future
> changes to this variable.)
>
>
> + (setq-local comment-style c-ts-mode-comment-style)
>
> Why don’t we let users set comment style themselves? Does cc-mode have a similar variable?
>
You have a point. Simplified the patch.
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: 10619 bytes --]
From 60d1dcf08d2d5fc365958263dafa0e731bfbc110 Mon Sep 17 00:00:00 2001
From: Theodor Thornhill <theo@thornhill.no>
Date: Mon, 14 Nov 2022 08:03:11 +0100
Subject: [PATCH] Fix some inconsistencies in *-ts-modes
(c-ts-mode--base-mode): Extract comment-* so that we can separate
between C and C++.
(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--imenu): Add categories. Only display categories that
exist in the file.
(java-ts-mode): Add electric-indent.
* lisp/progmodes/json-ts-mode.el
(json-ts-mode): Add electric-indent.
* lisp/progmodes/ts-mode.el
(ts-mode--font-lock-settings): Whitespace cleanup.
(ts-mode): Add electric-indent.
---
lisp/progmodes/c-ts-mode.el | 20 +++++++++------
lisp/progmodes/css-ts-mode.el | 5 ++++
lisp/progmodes/java-ts-mode.el | 45 +++++++++++++++++++++++++---------
lisp/progmodes/json-ts-mode.el | 39 ++++++++++++++++++-----------
lisp/progmodes/ts-mode.el | 13 +++++++++-
5 files changed, 89 insertions(+), 33 deletions(-)
diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index 5617ea7d7c..8d18c23da9 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -33,6 +33,7 @@
(defcustom c-ts-mode-indent-offset 2
"Number of spaces for each indentation step in `c-ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'c)
@@ -44,6 +45,7 @@ c-ts-mode-indent-style
one of the supplied styles doesn't suffice a function could be
set instead. This function is expected return a list that
follows the form of `treesit-simple-indent-rules'."
+ :version "29.1"
:type '(choice (symbol :tag "Gnu" 'gnu)
(symbol :tag "K&R" 'k&r)
(symbol :tag "Linux" 'linux)
@@ -396,14 +398,8 @@ c-ts-mode--imenu
;;;###autoload
(define-derived-mode c-ts-mode--base-mode prog-mode "C"
"Major mode for editing C, powered by tree-sitter."
- :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,7 +411,7 @@ 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)
@@ -436,6 +432,11 @@ c-ts-mode
(treesit-parser-create 'c)
+ ;; Comments.
+ (setq-local comment-start "/* ")
+ (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
+ (setq-local comment-end " */")
+
(setq-local treesit-simple-indent-rules
(c-ts-mode--set-indent-style 'c))
@@ -452,6 +453,11 @@ 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 "")
+
(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..d0f104eac3 100644
--- a/lisp/progmodes/css-ts-mode.el
+++ b/lisp/progmodes/css-ts-mode.el
@@ -34,6 +34,7 @@
(defcustom css-ts-mode-indent-offset 2
"Number of spaces for each indentation step in `ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'css)
@@ -114,6 +115,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..ee75753027 100644
--- a/lisp/progmodes/java-ts-mode.el
+++ b/lisp/progmodes/java-ts-mode.el
@@ -29,10 +29,10 @@
;;; Code:
(require 'treesit)
-(require 'rx)
(defcustom java-ts-mode-indent-offset 4
"Number of spaces for each indentation step in `java-ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'java)
@@ -241,18 +241,38 @@ java-ts-mode--imenu-1
(defun java-ts-mode--imenu ()
"Return Imenu alist for the current buffer."
(let* ((node (treesit-buffer-root-node))
- (tree (treesit-induce-sparse-tree
- node (rx (or "class_declaration"
- "interface_declaration"
- "enum_declaration"
- "record_declaration"
- "method_declaration")))))
- (java-ts-mode--imenu-1 tree)))
+ (class-tree
+ `("Class" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^class_declaration$"))))
+ (interface-tree
+ `("Interface" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^interface_declaration$"))))
+ (enum-tree
+ `("Enum" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^enum_declaration$"))))
+ (record-tree
+ `("Record" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^record_declaration$"))))
+ (method-tree
+ `("Method" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^method_declaration$")))))
+ (cl-remove-if
+ #'null
+ `(,(when (cdr class-tree) class-tree)
+ ,(when (cdr interface-tree) interface-tree)
+ ,(when (cdr enum-tree) enum-tree)
+ ,(when (cdr record-tree) record-tree)
+ ,(when (cdr method-tree) method-tree)))))
;;;###autoload
(define-derived-mode java-ts-mode prog-mode "Java"
"Major mode for editing Java, powered by tree-sitter."
- :group 'c
+ :group 'java
:syntax-table java-ts-mode--syntax-table
(unless (treesit-ready-p nil 'java)
@@ -268,9 +288,12 @@ 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")))
+ (setq-local treesit-defun-type-regexp "declaration")
;; Font-lock.
(setq-local treesit-font-lock-settings java-ts-mode--font-lock-settings)
diff --git a/lisp/progmodes/json-ts-mode.el b/lisp/progmodes/json-ts-mode.el
index 686640f98a..c1d3d283b8 100644
--- a/lisp/progmodes/json-ts-mode.el
+++ b/lisp/progmodes/json-ts-mode.el
@@ -33,6 +33,7 @@
(defcustom json-ts-mode-indent-offset 2
"Number of spaces for each indentation step in `json-ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'json)
@@ -67,20 +68,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 +134,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 +148,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) () ()))
+ '((comment string number) (constant pair) ()))
;; 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..c5a6f5fc60 100644
--- a/lisp/progmodes/ts-mode.el
+++ b/lisp/progmodes/ts-mode.el
@@ -30,6 +30,7 @@
(defcustom ts-mode-indent-offset 2
"Number of spaces for each indentation step in `ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'typescript)
@@ -100,7 +101,6 @@ ts-mode--keywords
(defvar ts-mode--font-lock-settings
(treesit-font-lock-rules
-
:language 'tsx
:override t
:feature 'comment
@@ -271,18 +271,26 @@ 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
@@ -291,9 +299,12 @@ ts-mode
(property pattern jsx)))
;; 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
next prev parent reply other threads:[~2022-11-14 7:06 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-13 20:42 bug#59251: 29.0.50; Fix-some-inconsistencies-in-ts-modes Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
[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 [this message]
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=877czy2ex4.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.