From: Theodor Thornhill via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: Eli Zaretskii <eliz@gnu.org>, casouri@gmail.com
Cc: 60983@debbugs.gnu.org
Subject: bug#60983: 29.0.60; Tree-sitter user-level control
Date: Sat, 28 Jan 2023 14:12:52 +0100 [thread overview]
Message-ID: <871qnessyz.fsf@thornhill.no> (raw)
In-Reply-To: <83357xg3gt.fsf@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 3272 bytes --]
Eli Zaretskii <eliz@gnu.org> writes:
>> Cc: 60983@debbugs.gnu.org, theo@thornhill.no
>> Date: Mon, 23 Jan 2023 18:52:33 +0200
>> From: Eli Zaretskii <eliz@gnu.org>
>>
>> > From: Theodor Thornhill <theo@thornhill.no>
>> > Cc: Yuan Fu <casouri@gmail.com>
>> > Date: Sat, 21 Jan 2023 12:48:58 +0100
>> >
>> > Eli Zaretskii <eliz@gnu.org> writes:
>> >
>> > > I started looking into providing user-level documentation for
>> > > tree-sitter based modes, and bumped into some issues:
>> > >
>> > > . How does one use treesit-font-lock-level?
>> > >
>> > > - It is not a customizable user option (unlike
>> > > font-lock-maximum-decoration), so it cannot be set via
>> > > customize-variable. Is there a reason not to make it a
>> > > defcustom?
>> > > - It automatically becomes buffer-local when set, and OTOH setting
>> > > it in a buffer does not produce fontifications according to the
>> > > level, and neither does setting it in a mode hook. So the only
>> > > way to change its value is by using setq-default, which I don't
>> > > think is the intent?
>> > > - Should we make the variable a defcustom?
>> > > - Should it be possible to customize it separately for each mode?
>> > > - Should we allow to change the level and then call some function
>> > > to re-fontify the current buffer according to the new level?
>> >
>> > I struggled with this too. I ended up setting it with setq-default,
>> > assuming I was just missing something very simple. I'm in favor for
>> > either a defcustom or honoring the font-lock-maximum-decoration values,
>> > specifically these settings:
>> >
>> > ```
>> > If t, use the maximum decoration available.
>> > If a number, use that level of decoration (or if not available the maximum).
>> > ```
>
> Let's just make it a defcustom for now, with the values it has today,
> including the default.
>
> The problems with honoring the value of font-lock-maximum-decoration
> are that (a) its default value is t in most (all?) modes, whereas we
> decided not to use 4 as the default value of treesit-font-lock-level;
> and (b) if changing treesit-font-lock-level's value doesn't require to
> kill the buffer and revisit the file (as I hope we will make it work),
> the instructions regarding changing the value of
> font-lock-maximum-decoration will depend on whether the mode does or
> doesn't use tree-sitter, which will make the instructions confusingly
> complex.
>
> Yuan or Theo, would one of you please make the change of making
> treesit-font-lock-level a defcustom, with a proper :set functions to
> avoid the need to revisit the file? My hands are too full ATM, and
> this issue is basically the only one which prevents me from updating
> the Emacs user manual with the tree-sitter info, which in turn is the
> only issue that blocks the move to releasing the 29.0.90 pretest
> tarball.
>
> TIA
Are you okay with these patches, Eli? If so, then I can clean them up a
little and install on emacs-29. In both cases using
(customize-set-variable 'the-variable val) will take effect in the
buffer without having to reload anything.
Let me know if there are any other changes needed. I'll have some time
this evening to do some hacking if needed :)
Thanks,
Theo
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Initial-c-ts-mode-set-style-attempt.patch --]
[-- Type: text/x-patch, Size: 3344 bytes --]
From 3a5352536ef3a511cbdcc34b9e6e257ff1d36d83 Mon Sep 17 00:00:00 2001
From: Theodor Thornhill <theo@thornhill.no>
Date: Wed, 25 Jan 2023 21:04:00 +0100
Subject: [PATCH] Initial c-ts-mode-set-style attempt
---
lisp/progmodes/c-ts-mode.el | 47 ++++++++++++++++++++++++++++++-------
1 file changed, 38 insertions(+), 9 deletions(-)
diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index eb2be9b792..9834428a06 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -92,6 +92,25 @@ c-ts-mode-indent-offset
:safe 'integerp
:group 'c)
+(defun c-ts-mode--indent-style-setter (sym val)
+ "Custom setter for `c-ts-mode-set-style'."
+ (named-let loop ((res nil)
+ (buffers (buffer-list)))
+ (if (null buffers)
+ (mapc (lambda (b)
+ (with-current-buffer b
+ (set-default sym val)
+ (setq-local treesit-simple-indent-rules
+ (treesit--indent-rules-optimize
+ (c-ts-mode--set-indent-style
+ (if (eq major-mode 'c-ts-mode) 'c 'cpp))))))
+ res)
+ (let ((buffer (car buffers)))
+ (with-current-buffer buffer
+ (if (or (eq major-mode 'c-ts-mode) (eq major-mode 'c++-ts-mode))
+ (loop (append res (list buffer)) (cdr buffers))
+ (loop res (cdr buffers))))))))
+
(defcustom c-ts-mode-indent-style 'gnu
"Style used for indentation.
@@ -100,13 +119,27 @@ c-ts-mode-indent-style
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)
- (symbol :tag "BSD" 'bsd)
+ :type '(choice (symbol :tag "Gnu" gnu)
+ (symbol :tag "K&R" k&r)
+ (symbol :tag "Linux" linux)
+ (symbol :tag "BSD" bsd)
(function :tag "A function for user customized style" ignore))
+ :set #'c-ts-mode--indent-style-setter
:group 'c)
+(defun c-ts-mode-set-style ()
+ (interactive)
+ (or (eq major-mode 'c-ts-mode) (eq major-mode 'c++-ts-mode)
+ (error "Buffer %s is not a c-ts-mode (c-ts-mode-set-style)"
+ (buffer-name)))
+ (c-ts-mode--indent-style-setter
+ 'c-ts-mode-indent-style
+ (intern
+ (completing-read
+ "Select style: "
+ (mapcar #'car (c-ts-mode--indent-styles (if (eq major-mode 'c-ts-mode) 'c 'cpp)))
+ nil t nil nil "gnu"))))
+
;;; Syntax table
(defvar c-ts-mode--syntax-table
@@ -255,11 +288,7 @@ c-ts-mode--set-indent-style
(let ((style
(if (functionp c-ts-mode-indent-style)
(funcall c-ts-mode-indent-style)
- (pcase c-ts-mode-indent-style
- ('gnu (alist-get 'gnu (c-ts-mode--indent-styles mode)))
- ('k&r (alist-get 'k&r (c-ts-mode--indent-styles mode)))
- ('bsd (alist-get 'bsd (c-ts-mode--indent-styles mode)))
- ('linux (alist-get 'linux (c-ts-mode--indent-styles mode)))))))
+ (alist-get c-ts-mode-indent-style (c-ts-mode--indent-styles mode)))))
`((,mode ,@style))))
(defun c-ts-mode--top-level-label-matcher (node &rest _)
--
2.34.1
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0001-Make-treesit-font-lock-level-a-defcustom.patch --]
[-- Type: text/x-patch, Size: 2226 bytes --]
From ead69b71c3d4e0ea86119f5d9ec201596cf6d34d Mon Sep 17 00:00:00 2001
From: Theodor Thornhill <theo@thornhill.no>
Date: Sat, 28 Jan 2023 13:57:01 +0100
Subject: [PATCH] Make treesit-font-lock-level a defcustom
* lisp/treesit.el (treesit--font-lock-level-setter): Setter for the
new defcustom.
(treesit-font-lock-level): Turn it into a defcustom.
---
lisp/treesit.el | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/lisp/treesit.el b/lisp/treesit.el
index 4c9bdfc0bd..363692eabd 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -554,7 +554,25 @@ 'treesit-font-lock-error
"Generic tree-sitter font-lock error"
'treesit-error)
-(defvar-local treesit-font-lock-level 3
+(defun treesit--font-lock-level-setter (sym val)
+ "Custom setter for `treesit-font-lock-level'."
+ (set-default sym val)
+ (named-let loop ((res nil)
+ (buffers (buffer-list)))
+ (if (null buffers)
+ (mapc (lambda (b)
+ (with-current-buffer b
+ (setq-local treesit-font-lock-level val)
+ (treesit-font-lock-recompute-features)
+ (treesit-font-lock-fontify-region (point-min) (point-max))))
+ res)
+ (let ((buffer (car buffers)))
+ (with-current-buffer buffer
+ (if (treesit-parser-list)
+ (loop (append res (list buffer)) (cdr buffers))
+ (loop res (cdr buffers))))))))
+
+(defcustom treesit-font-lock-level 3
"Decoration level to be used by tree-sitter fontifications.
Major modes categorize their fontification features into levels,
@@ -571,7 +589,10 @@ treesit-font-lock-level
In addition to the decoration level, individual features can be
turned on/off by calling `treesit-font-lock-recompute-features'.
Changing the decoration level requires calling
-`treesit-font-lock-recompute-features' to have an effect.")
+`treesit-font-lock-recompute-features' to have an effect."
+ :type 'integer
+ :set #'treesit--font-lock-level-setter
+ :version "29.1")
(defvar-local treesit--font-lock-query-expand-range (cons 0 0)
"The amount to expand the start and end of the region when fontifying.
--
2.34.1
next prev parent reply other threads:[~2023-01-28 13:12 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-21 11:11 bug#60983: 29.0.60; Tree-sitter user-level control Eli Zaretskii
2023-01-21 11:48 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-21 12:36 ` Eli Zaretskii
2023-01-21 12:40 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-23 19:37 ` Yuan Fu
2023-01-23 19:59 ` Eli Zaretskii
2023-01-23 21:08 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-23 23:55 ` Yuan Fu
2023-01-29 13:33 ` Eli Zaretskii
2023-01-29 19:12 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-29 19:41 ` Eli Zaretskii
2023-01-30 2:28 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-30 13:45 ` Eli Zaretskii
2023-01-24 3:26 ` Eli Zaretskii
2023-01-25 20:12 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-25 21:16 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-26 8:27 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-26 6:08 ` Eli Zaretskii
2023-01-26 6:25 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-23 16:52 ` Eli Zaretskii
2023-01-26 7:27 ` Eli Zaretskii
2023-01-26 7:37 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-26 9:08 ` Eli Zaretskii
2023-01-28 13:12 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
2023-01-28 13:25 ` Eli Zaretskii
2023-01-28 18:41 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-29 13:24 ` Eli Zaretskii
2023-01-26 7:56 ` Yuan Fu
2023-02-03 3:07 ` Yuan Fu
2023-02-03 7:47 ` Eli Zaretskii
2023-02-04 23:38 ` Yuan Fu
2023-02-05 6:01 ` Eli Zaretskii
2023-02-05 7:54 ` Yuan Fu
2023-02-05 9:23 ` Eli Zaretskii
2023-02-05 9:42 ` Yuan Fu
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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871qnessyz.fsf@thornhill.no \
--to=bug-gnu-emacs@gnu.org \
--cc=60983@debbugs.gnu.org \
--cc=casouri@gmail.com \
--cc=eliz@gnu.org \
--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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).