unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#60983: 29.0.60; Tree-sitter user-level control
@ 2023-01-21 11:11 Eli Zaretskii
  2023-01-21 11:48 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
                   ` (2 more replies)
  0 siblings, 3 replies; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-21 11:11 UTC (permalink / raw)
  To: 60983; +Cc: Yuan Fu, Theodor Thornhill

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?

 . How does one change the indentation style in c-ts-mode?

   - There is a defcustom c-ts-mode-indent-style, but I don't think I
     see any difference in indentation of new code when I change the
     value.  What am I missing?

 . What commands are affected by treesit-defun-tactic?


In GNU Emacs 29.0.60 (build 238, i686-pc-mingw32) of 2023-01-20 built on
 HOME-C4E4A596F7
Repository revision: 472f142598566fbaeedcacaf9a9c757a1281c0c5
Repository branch: emacs-29
Windowing system distributor 'Microsoft Corp.', version 5.1.2600
System Description: Microsoft Windows XP Service Pack 3 (v5.1.0.2600)

Configured using:
 'configure -C --prefix=/d/usr --with-wide-int
 --enable-checking=yes,glyphs 'CFLAGS=-O0 -gdwarf-4 -g3''

Configured features:
ACL GIF GMP GNUTLS HARFBUZZ JPEG JSON LCMS2 LIBXML2 MODULES NOTIFY
W32NOTIFY PDUMPER PNG RSVG SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XPM ZLIB

Important settings:
  value of $LANG: ENU
  locale-coding-system: cp1255

Major mode: C

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message mailcap yank-media puny dired
dired-loaddefs rfc822 mml mml-sec password-cache epa derived epg rfc6068
epg-config gnus-util time-date subr-x mm-decode mm-bodies mm-encode
mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047
rfc2045 ietf-drums mm-util mail-prsvr mail-utils shortdoc
text-property-search misearch multi-isearch cl-extra cl-print thingatpt
help-fns radix-tree pp wid-edit descr-text help-mode c-ts-mode treesit
cl-seq vc-git diff-mode easy-mmode vc vc-dispatcher bug-reference
byte-opt gv bytecomp byte-compile cc-mode cc-fonts cc-guess cc-menus
cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs cl-loaddefs cl-lib
rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook
vc-hooks lisp-float-type elisp-mode mwheel dos-w32 ls-lisp disp-table
term/w32-win w32-win w32-vars term/common-win tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu
timer select scroll-bar mouse jit-lock font-lock syntax font-core
term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads w32notify w32 lcms2 multi-tty
make-network-process emacs)

Memory information:
((conses 16 107446 10610)
 (symbols 48 10355 0)
 (strings 16 33788 3445)
 (string-bytes 1 1014069)
 (vectors 16 17439)
 (vector-slots 8 223440 13934)
 (floats 8 91 195)
 (intervals 40 3548 140)
 (buffers 888 14))





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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-23 16:52   ` Eli Zaretskii
  2023-01-26  7:56 ` Yuan Fu
  2023-02-03  3:07 ` Yuan Fu
  2 siblings, 2 replies; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-21 11:48 UTC (permalink / raw)
  To: eliz, 60983; +Cc: Yuan Fu

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).
```

>
>  . How does one change the indentation style in c-ts-mode?
>
>    - There is a defcustom c-ts-mode-indent-style, but I don't think I
>      see any difference in indentation of new code when I change the
>      value.  What am I missing?
>

(setq c-ts-mode-indent-style 'bsd) then revert-buffer fixes it for me.
It seems you need to reload the file to enable the new style.  Should I
add a command that can be set explicitly as in c-mode?
'c-ts-mode-set-style'?

However, going over it I see there are lots of regressions after the new
bracket-counting code added recently, effectively making the indent
styles pretty broken right now...

For example with bsd style:

Previously:

int
main()
{
  if (x)
  {
      
  }
  else
	{
		
  }
}

now:

int
main()
{
  if (x)
  {
      
    }
  else
	{
		
		}
}



>  . What commands are affected by treesit-defun-tactic?

'treesit--navigate-thing' uses it, so 'beginning-of-defun',
'forward-sentence' etc uses it through 'treesit-beginning-of-thing'.

Theo





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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 16:52   ` Eli Zaretskii
  1 sibling, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-21 12:36 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: 60983, casouri

> 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:
> 
> >  . How does one change the indentation style in c-ts-mode?
> >
> >    - There is a defcustom c-ts-mode-indent-style, but I don't think I
> >      see any difference in indentation of new code when I change the
> >      value.  What am I missing?
> >
> 
> (setq c-ts-mode-indent-style 'bsd) then revert-buffer fixes it for me.
> It seems you need to reload the file to enable the new style.  Should I
> add a command that can be set explicitly as in c-mode?
> 'c-ts-mode-set-style'?

I think we need both a command and a :set function for the defcustom.

> However, going over it I see there are lots of regressions after the new
> bracket-counting code added recently, effectively making the indent
> styles pretty broken right now...

That's a separate issue, and I'm sure it will be fixed.  And adding
tests to the test suite will prevent us from breaking it too easily in
the future.

> >  . What commands are affected by treesit-defun-tactic?
> 
> 'treesit--navigate-thing' uses it, so 'beginning-of-defun',
> 'forward-sentence' etc uses it through 'treesit-beginning-of-thing'.

What commands except those that call treesit--navigate-thing call
beginning-of-defun and treesit-beginning-of-thing?





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 1 reply; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-21 12:40 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 60983, casouri

Eli Zaretskii <eliz@gnu.org> writes:

>> 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:
>> 
>> >  . How does one change the indentation style in c-ts-mode?
>> >
>> >    - There is a defcustom c-ts-mode-indent-style, but I don't think I
>> >      see any difference in indentation of new code when I change the
>> >      value.  What am I missing?
>> >
>> 
>> (setq c-ts-mode-indent-style 'bsd) then revert-buffer fixes it for me.
>> It seems you need to reload the file to enable the new style.  Should I
>> add a command that can be set explicitly as in c-mode?
>> 'c-ts-mode-set-style'?
>
> I think we need both a command and a :set function for the defcustom.
>

Ok, I'll make a bugreport for this.

>> However, going over it I see there are lots of regressions after the new
>> bracket-counting code added recently, effectively making the indent
>> styles pretty broken right now...
>
> That's a separate issue, and I'm sure it will be fixed.  And adding
> tests to the test suite will prevent us from breaking it too easily in
> the future.
>

And this.


>> >  . What commands are affected by treesit-defun-tactic?
>> 
>> 'treesit--navigate-thing' uses it, so 'beginning-of-defun',
>> 'forward-sentence' etc uses it through 'treesit-beginning-of-thing'.
>
> What commands except those that call treesit--navigate-thing call
> beginning-of-defun and treesit-beginning-of-thing?

I'll defer to Yuan for this :)

Theo





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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-23 16:52   ` Eli Zaretskii
  2023-01-26  7:27     ` Eli Zaretskii
  1 sibling, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-23 16:52 UTC (permalink / raw)
  To: casouri; +Cc: 60983, theo

Ping!  Yuan, any comments?  I'd like to finish this job some time
soon, and I need your feedback and/or code changes before I can
proceed.

> 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).
> ```
> 
> >
> >  . How does one change the indentation style in c-ts-mode?
> >
> >    - There is a defcustom c-ts-mode-indent-style, but I don't think I
> >      see any difference in indentation of new code when I change the
> >      value.  What am I missing?
> >
> 
> (setq c-ts-mode-indent-style 'bsd) then revert-buffer fixes it for me.
> It seems you need to reload the file to enable the new style.  Should I
> add a command that can be set explicitly as in c-mode?
> 'c-ts-mode-set-style'?
> 
> However, going over it I see there are lots of regressions after the new
> bracket-counting code added recently, effectively making the indent
> styles pretty broken right now...
> 
> For example with bsd style:
> 
> Previously:
> 
> int
> main()
> {
>   if (x)
>   {
>       
>   }
>   else
> 	{
> 		
>   }
> }
> 
> now:
> 
> int
> main()
> {
>   if (x)
>   {
>       
>     }
>   else
> 	{
> 		
> 		}
> }
> 
> 
> 
> >  . What commands are affected by treesit-defun-tactic?
> 
> 'treesit--navigate-thing' uses it, so 'beginning-of-defun',
> 'forward-sentence' etc uses it through 'treesit-beginning-of-thing'.
> 
> Theo
> 





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 1 reply; 35+ messages in thread
From: Yuan Fu @ 2023-01-23 19:37 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: eliz, 60983

Sorry for the delay, overall I agree with your changes.

> 
> . 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?

Yeah it should be 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?

You can set this variable and call treesit-font-lock-recompute-features with no argument, which enables/disables features according to the current level.

> Ok, I'll make a bugreport for this.
> 
>>> However, going over it I see there are lots of regressions after the new
>>> bracket-counting code added recently, effectively making the indent
>>> styles pretty broken right now...

Sorry about that :-(
> 
> 
>>>> . What commands are affected by treesit-defun-tactic?
>>> 
>>> 'treesit--navigate-thing' uses it, so 'beginning-of-defun',
>>> 'forward-sentence' etc uses it through 'treesit-beginning-of-thing'.
>> 
>> What commands except those that call treesit--navigate-thing call
>> beginning-of-defun and treesit-beginning-of-thing?
> 
> I'll defer to Yuan for this :)

treesit-beginning/end-of-defun are called by beginning/end-of-defun, so other functions like mark-defund are also affected by treesit-defun-tactic. Treesit-beginning-of-thing is on master, not on emacs-29.


Yuan




^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-23 19:59 UTC (permalink / raw)
  To: Yuan Fu; +Cc: 60983, theo

> From: Yuan Fu <casouri@gmail.com>
> Date: Mon, 23 Jan 2023 11:37:24 -0800
> Cc: Eli Zaretskii <eliz@gnu.org>,
>  Bug Report Emacs <bug-gnu-emacs@gnu.org>
> 
> Sorry for the delay, overall I agree with your changes.

Thanks.  What about the questions I asked regarding indentation
features, and specifically about c-ts-mode-indent-style?





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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-24  3:26             ` Eli Zaretskii
  0 siblings, 2 replies; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-23 21:08 UTC (permalink / raw)
  To: Eli Zaretskii, Yuan Fu; +Cc: 60983



On 23 January 2023 20:59:14 CET, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Mon, 23 Jan 2023 11:37:24 -0800
>> Cc: Eli Zaretskii <eliz@gnu.org>,
>>  Bug Report Emacs <bug-gnu-emacs@gnu.org>
>> 
>> Sorry for the delay, overall I agree with your changes.
>
>Thanks.  What about the questions I asked regarding indentation
>features, and specifically about c-ts-mode-indent-style?

I am working on that, but I hit some issues where I cannot make treesit recognize the new settings before the whole treesit-major-mode-setup reruns. Just setting the symbol doesn't work, and reenabling the mode inside of the :set function isn't the best idea maybe?

I'd love some pointers to how other modes do similar stuff, but I didn't really find anything.

Theo





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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-24  3:26             ` Eli Zaretskii
  1 sibling, 1 reply; 35+ messages in thread
From: Yuan Fu @ 2023-01-23 23:55 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: eliz, 60983



> On Jan 23, 2023, at 1:08 PM, Theodor Thornhill <theo@thornhill.no> wrote:
> 
> 
> 
> On 23 January 2023 20:59:14 CET, Eli Zaretskii <eliz@gnu.org> wrote:
>>> From: Yuan Fu <casouri@gmail.com>
>>> Date: Mon, 23 Jan 2023 11:37:24 -0800
>>> Cc: Eli Zaretskii <eliz@gnu.org>,
>>> Bug Report Emacs <bug-gnu-emacs@gnu.org>
>>> 
>>> Sorry for the delay, overall I agree with your changes.
>> 
>> Thanks.  What about the questions I asked regarding indentation
>> features, and specifically about c-ts-mode-indent-style?
> 
> I am working on that, but I hit some issues where I cannot make treesit recognize the new settings before the whole treesit-major-mode-setup reruns. Just setting the symbol doesn't work, and reenabling the mode inside of the :set function isn't the best idea maybe?
> 
> I'd love some pointers to how other modes do similar stuff, but I didn't really find anything.

One common approach is to iterate over all live buffer and reset the variable (in this case treesit-simple-indent-rules) on applicate buffers (in this case c/c++-ts-mode buffers).

It would be nice to also have a command c-ts-mode-set-style (like c-set-style) that takes a style symbol and sets treesit-simple-indent-rules accordingly. And in major-mode setup, ie, c-ts-mode’s body, you call it with c-ts-mode-indent-style.

Yuan







^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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-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
  1 sibling, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-24  3:26 UTC (permalink / raw)
  To: Theodor Thornhill, Stefan Monnier; +Cc: casouri, 60983

> Date: Mon, 23 Jan 2023 22:08:27 +0100
> From: Theodor Thornhill <theo@thornhill.no>
> CC: bug-gnu-emacs@gnu.org
> 
> 
> 
> On 23 January 2023 20:59:14 CET, Eli Zaretskii <eliz@gnu.org> wrote:
> >> From: Yuan Fu <casouri@gmail.com>
> >> Date: Mon, 23 Jan 2023 11:37:24 -0800
> >> Cc: Eli Zaretskii <eliz@gnu.org>,
> >>  Bug Report Emacs <bug-gnu-emacs@gnu.org>
> >> 
> >> Sorry for the delay, overall I agree with your changes.
> >
> >Thanks.  What about the questions I asked regarding indentation
> >features, and specifically about c-ts-mode-indent-style?
> 
> I am working on that, but I hit some issues where I cannot make treesit recognize the new settings before the whole treesit-major-mode-setup reruns. Just setting the symbol doesn't work, and reenabling the mode inside of the :set function isn't the best idea maybe?
> 
> I'd love some pointers to how other modes do similar stuff, but I didn't really find anything.

Thanks, but can you add some details of what you are trying to do and
what are the difficulties?

Adding Stefan in case he has some advice.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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  6:08                 ` Eli Zaretskii
  0 siblings, 2 replies; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-25 20:12 UTC (permalink / raw)
  To: Eli Zaretskii, Stefan Monnier; +Cc: casouri, 60983

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

Eli Zaretskii <eliz@gnu.org> writes:

>> Date: Mon, 23 Jan 2023 22:08:27 +0100
>> From: Theodor Thornhill <theo@thornhill.no>
>> CC: bug-gnu-emacs@gnu.org
>> 
>> 
>> 
>> On 23 January 2023 20:59:14 CET, Eli Zaretskii <eliz@gnu.org> wrote:
>> >> From: Yuan Fu <casouri@gmail.com>
>> >> Date: Mon, 23 Jan 2023 11:37:24 -0800
>> >> Cc: Eli Zaretskii <eliz@gnu.org>,
>> >>  Bug Report Emacs <bug-gnu-emacs@gnu.org>
>> >> 
>> >> Sorry for the delay, overall I agree with your changes.
>> >
>> >Thanks.  What about the questions I asked regarding indentation
>> >features, and specifically about c-ts-mode-indent-style?
>> 
>> I am working on that, but I hit some issues where I cannot make treesit recognize the new settings before the whole treesit-major-mode-setup reruns. Just setting the symbol doesn't work, and reenabling the mode inside of the :set function isn't the best idea maybe?
>> 
>> I'd love some pointers to how other modes do similar stuff, but I didn't really find anything.
>
> Thanks, but can you add some details of what you are trying to do and
> what are the difficulties?
>
> Adding Stefan in case he has some advice.

Ok, I added a patch below.


try:

1. open some c buffer and make some edits, for example
```
void
main()
{
  if (x)
    {
    }
}
```

This should be the expected output when using the gnu style.

2. M-x c-ts-mode-set-style "bsd" RET

3. C-h o c-ts-mode-indent-style RET
  Observe variable has changed, but indenting the code does not.

4 C-h o treesit-simple-indent-rules RET
  Observe variable keeps old value

5. C-x x g

Now the bsd style takes effect, and the treesit-simple-indent-rules
variable has changed.

I'm sure the fix is easy, but I don't see it.  I purposely kept the
functions simple until I know what approach is best:)


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: 4013 bytes --]

From 2a4948bb516435d11245256931eeb9cc0f562aba 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 | 45 +++++++++++++++++++++++++------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index 95f9001e0d..35f076b28d 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -92,7 +92,7 @@ c-ts-mode-indent-offset
   :safe 'integerp
   :group 'c)
 
-(defcustom c-ts-mode-indent-style 'gnu
+(defcustom c-ts-mode-indent-style "gnu"
   "Style used for indentation.
 
 The selected style could be one of GNU, K&R, LINUX or BSD.  If
@@ -100,13 +100,33 @@ 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 (string :tag "Gnu" "gnu")
+                 (string :tag "K&R" "k&r")
+                 (string :tag "Linux" "linux")
+                 (string :tag "BSD" "bsd")
                  (function :tag "A function for user customized style" ignore))
+  :set #'c-ts-mode--indent-style
   :group 'c)
 
+(defun c-ts-mode--indent-style (sym val)
+  "Custom setter for `c-ts-mode-indent-style'."
+  (set-default sym val))
+
+(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)))
+  (if-let ((mode (cond ((eq major-mode 'c-ts-mode) 'c)
+                       ((eq major-mode 'c++-ts-mode) 'cpp)
+                       (t nil)))
+           (choice (completing-read "Select style: " '("gnu" "k&r" "linux" "bsd"))))
+      (c-ts-mode--indent-style 'c-ts-mode-indent-style choice)
+    (kill-local-variable 'treesit-simple-indent-rules)
+    (setq-local treesit-simple-indent-rules
+                (treesit--indent-rules-optimize
+                 (c-ts-mode--set-indent-style mode)))))
+
 ;;; Syntax table
 
 (defvar c-ts-mode--syntax-table
@@ -224,19 +244,19 @@ c-ts-mode--indent-styles
            ((parent-is "do_statement") parent-bol c-ts-mode-indent-offset)
            ,@(when (eq mode 'cpp)
                `(((node-is "field_initializer_list") parent-bol ,(* c-ts-mode-indent-offset 2)))))))
-    `((gnu
+    `(("gnu"
        ;; Prepend rules to set highest priority
        ((match "while" "do_statement") parent 0)
        (c-ts-mode--top-level-label-matcher point-min 1)
        ,@common)
-      (k&r ,@common)
-      (linux
+      ("k&r" ,@common)
+      ("linux"
        ;; Reference:
        ;; https://www.kernel.org/doc/html/latest/process/coding-style.html,
        ;; and script/Lindent in Linux kernel repository.
        ((node-is "labeled_statement") point-min 0)
        ,@common)
-      (bsd
+      ("bsd"
        ((node-is "}") parent-bol 0)
        ((node-is "labeled_statement") parent-bol c-ts-mode-indent-offset)
        ((parent-is "labeled_statement") parent-bol c-ts-mode-indent-offset)
@@ -255,11 +275,8 @@ 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) nil nil #'equal))))
     `((,mode ,@style))))
 
 (defun c-ts-mode--top-level-label-matcher (node &rest _)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  1 sibling, 1 reply; 35+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-25 21:16 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: eliz, 60983, casouri

> -(defcustom c-ts-mode-indent-style 'gnu
> +(defcustom c-ts-mode-indent-style "gnu"
>    "Style used for indentation.
>  
>  The selected style could be one of GNU, K&R, LINUX or BSD.  If
> @@ -100,13 +100,33 @@ 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 (string :tag "Gnu" "gnu")
> +                 (string :tag "K&R" "k&r")
> +                 (string :tag "Linux" "linux")
> +                 (string :tag "BSD" "bsd")
>                   (function :tag "A function for user customized style" ignore))
> +  :set #'c-ts-mode--indent-style
>    :group 'c)

Why change to strings?
BTW the previous code seems wrong: instead of

    (symbol :tag "FOO" 'foo)

it should be

    (symbol :tag "FOO" foo)

since `'foo` is not a symbol but a list (of two symbols).

> +(defun c-ts-mode--indent-style (sym val)
> +  "Custom setter for `c-ts-mode-indent-style'."
> +  (set-default sym val))

Hmm... why bother use a `:set`ter if it doesn't do anything more than
the default does?
Shouldn't it call `treesit--indent-rules-optimize` to (re)set
`treesit-simple-indent-rules`?
[ Presumably in all relevant buffers, since the defcustom setting is
  global.  ]

> +(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)))
> +  (if-let ((mode (cond ((eq major-mode 'c-ts-mode) 'c)
> +                       ((eq major-mode 'c++-ts-mode) 'cpp)
> +                       (t nil)))
> +           (choice (completing-read "Select style: " '("gnu" "k&r" "linux" "bsd"))))

Here, we probably want to specify `must-match` to `completing-read`
(which makes it unnecessary to check `if-let`, I think) and we should
provide a default.
Also we should probably use the (c-ts-mode--indent-styles mode) alist
rather than hardcode the set of styles.

> +      (c-ts-mode--indent-style 'c-ts-mode-indent-style choice)
> +    (kill-local-variable 'treesit-simple-indent-rules)
> +    (setq-local treesit-simple-indent-rules
> +                (treesit--indent-rules-optimize
> +                 (c-ts-mode--set-indent-style mode)))))

Here we presumably want to do the (setq-local
treesit-simple-indent-rules ...) every time (and set
`c-ts-mode-indent-style` buffer locally rather than via
`c-ts-mode--indent-style`, or otherwise provide an additional arg to
`c-ts-mode--indent-style` to say whether it applies globally or only to
the current buffer).

BTW, the naming of `c-ts-mode--indent-style` and
`c-ts-mode--set-indent-style` is confusing.

Also: why `kill-local-variable` just before the `setq-local`?

> -           (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) nil nil #'equal))))

Thanks :-)


        Stefan






^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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  6:08                 ` Eli Zaretskii
  2023-01-26  6:25                   ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-26  6:08 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: casouri, 60983, monnier

> From: Theodor Thornhill <theo@thornhill.no>
> Cc: casouri@gmail.com, bug-gnu-emacs@gnu.org
> Date: Wed, 25 Jan 2023 21:12:53 +0100
> 
> > Adding Stefan in case he has some advice.
> 
> Ok, I added a patch below.
> 
> 
> try:
> 
> 1. open some c buffer and make some edits, for example
> ```
> void
> main()
> {
>   if (x)
>     {
>     }
> }
> ```
> 
> This should be the expected output when using the gnu style.
> 
> 2. M-x c-ts-mode-set-style "bsd" RET
> 
> 3. C-h o c-ts-mode-indent-style RET
>   Observe variable has changed, but indenting the code does not.
> 
> 4 C-h o treesit-simple-indent-rules RET
>   Observe variable keeps old value
> 
> 5. C-x x g
> 
> Now the bsd style takes effect, and the treesit-simple-indent-rules
> variable has changed.
> 
> I'm sure the fix is easy, but I don't see it.  I purposely kept the
> functions simple until I know what approach is best:)

Thanks, I'll wait until you adapt the changes to Stefan's comments,
and try the new code then.  If that doesn't fix the above problem, ask
the question again at that time.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 0 replies; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-26  6:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: casouri, 60983, monnier



On 26 January 2023 07:08:33 CET, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Theodor Thornhill <theo@thornhill.no>
>> Cc: casouri@gmail.com, bug-gnu-emacs@gnu.org
>> Date: Wed, 25 Jan 2023 21:12:53 +0100
>> 
>> > Adding Stefan in case he has some advice.
>> 
>> Ok, I added a patch below.
>> 
>> 
>> try:
>> 
>> 1. open some c buffer and make some edits, for example
>> ```
>> void
>> main()
>> {
>>   if (x)
>>     {
>>     }
>> }
>> ```
>> 
>> This should be the expected output when using the gnu style.
>> 
>> 2. M-x c-ts-mode-set-style "bsd" RET
>> 
>> 3. C-h o c-ts-mode-indent-style RET
>>   Observe variable has changed, but indenting the code does not.
>> 
>> 4 C-h o treesit-simple-indent-rules RET
>>   Observe variable keeps old value
>> 
>> 5. C-x x g
>> 
>> Now the bsd style takes effect, and the treesit-simple-indent-rules
>> variable has changed.
>> 
>> I'm sure the fix is easy, but I don't see it.  I purposely kept the
>> functions simple until I know what approach is best:)
>
>Thanks, I'll wait until you adapt the changes to Stefan's comments,
>and try the new code then.  If that doesn't fix the above problem, ask
>the question again at that time.

Yeah, thanks both :)

Theo





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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-28 13:12       ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-26  7:27 UTC (permalink / raw)
  To: casouri, theo; +Cc: 60983

> 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





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  1 sibling, 1 reply; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-26  7:37 UTC (permalink / raw)
  To: Eli Zaretskii, casouri; +Cc: 60983

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


I can take a stab at it :)

Theo





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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-26  7:56 ` Yuan Fu
  2023-02-03  3:07 ` Yuan Fu
  2 siblings, 0 replies; 35+ messages in thread
From: Yuan Fu @ 2023-01-26  7:56 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: Eli Zaretskii, 60983


Theodor Thornhill <theo@thornhill.no> writes:

> 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
>
>
> I can take a stab at it :)
>
> Theo

Thanks! I don’t have a ton of free time right now either.

Yuan





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 0 replies; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-26  8:27 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: eliz, 60983, casouri

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

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> -(defcustom c-ts-mode-indent-style 'gnu
>> +(defcustom c-ts-mode-indent-style "gnu"
>>    "Style used for indentation.
>>  
>>  The selected style could be one of GNU, K&R, LINUX or BSD.  If
>> @@ -100,13 +100,33 @@ 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 (string :tag "Gnu" "gnu")
>> +                 (string :tag "K&R" "k&r")
>> +                 (string :tag "Linux" "linux")
>> +                 (string :tag "BSD" "bsd")
>>                   (function :tag "A function for user customized style" ignore))
>> +  :set #'c-ts-mode--indent-style
>>    :group 'c)
>
> Why change to strings?
> BTW the previous code seems wrong: instead of
>
>     (symbol :tag "FOO" 'foo)
>
> it should be
>
>     (symbol :tag "FOO" foo)
>
> since `'foo` is not a symbol but a list (of two symbols).
>

Thanks, fixed.


>> +(defun c-ts-mode--indent-style (sym val)
>> +  "Custom setter for `c-ts-mode-indent-style'."
>> +  (set-default sym val))
>
> Hmm... why bother use a `:set`ter if it doesn't do anything more than
> the default does?
> Shouldn't it call `treesit--indent-rules-optimize` to (re)set
> `treesit-simple-indent-rules`?
> [ Presumably in all relevant buffers, since the defcustom setting is
>   global.  ]
>

Thanks, done.

>> +(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)))
>> +  (if-let ((mode (cond ((eq major-mode 'c-ts-mode) 'c)
>> +                       ((eq major-mode 'c++-ts-mode) 'cpp)
>> +                       (t nil)))
>> +           (choice (completing-read "Select style: " '("gnu" "k&r" "linux" "bsd"))))
>
> Here, we probably want to specify `must-match` to `completing-read`
> (which makes it unnecessary to check `if-let`, I think) and we should
> provide a default.
> Also we should probably use the (c-ts-mode--indent-styles mode) alist
> rather than hardcode the set of styles.
>
>> +      (c-ts-mode--indent-style 'c-ts-mode-indent-style choice)
>> +    (kill-local-variable 'treesit-simple-indent-rules)
>> +    (setq-local treesit-simple-indent-rules
>> +                (treesit--indent-rules-optimize
>> +                 (c-ts-mode--set-indent-style mode)))))
>
> Here we presumably want to do the (setq-local
> treesit-simple-indent-rules ...) every time (and set
> `c-ts-mode-indent-style` buffer locally rather than via
> `c-ts-mode--indent-style`, or otherwise provide an additional arg to
> `c-ts-mode--indent-style` to say whether it applies globally or only to
> the current buffer).
>
> BTW, the naming of `c-ts-mode--indent-style` and
> `c-ts-mode--set-indent-style` is confusing.
>
> Also: why `kill-local-variable` just before the `setq-local`?
>
>> -           (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) nil nil #'equal))))
>
> Thanks :-)
>
>
>         Stefan


Does this patch look better?  It also works, now :)

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 49b135580ba3d60b2f77dada99a1adc4c64ef9b2 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 95f9001e0d..0585795f35 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


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-26  9:08 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: casouri, 60983

> From: Theodor Thornhill <theo@thornhill.no>
> Cc: 60983@debbugs.gnu.org
> Date: Thu, 26 Jan 2023 08:37:42 +0100
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > 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
> 
> 
> I can take a stab at it :)

Thanks!





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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-28 13:12       ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-01-28 13:25         ` Eli Zaretskii
  1 sibling, 1 reply; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-28 13:12 UTC (permalink / raw)
  To: Eli Zaretskii, casouri; +Cc: 60983

[-- 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


^ permalink raw reply related	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  2023-01-28 13:12       ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 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
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-28 13:25 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: casouri, 60983

> From: Theodor Thornhill <theo@thornhill.no>
> Cc: 60983@debbugs.gnu.org
> Date: Sat, 28 Jan 2023 14:12:52 +0100
> 
> > 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.

LGTM, please install, and thanks.

> Let me know if there are any other changes needed.  I'll have some time
> this evening to do some hacking if needed :)

Will do.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 1 reply; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-28 18:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: casouri, 60983

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Theodor Thornhill <theo@thornhill.no>
>> Cc: 60983@debbugs.gnu.org
>> Date: Sat, 28 Jan 2023 14:12:52 +0100
>> 
>> > 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.
>
> LGTM, please install, and thanks.
>
>> Let me know if there are any other changes needed.  I'll have some time
>> this evening to do some hacking if needed :)
>
> Will do.

Installed.

Theo





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-29 13:24 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: casouri, 60983

> From: Theodor Thornhill <theo@thornhill.no>
> Cc: casouri@gmail.com, 60983@debbugs.gnu.org
> Date: Sat, 28 Jan 2023 19:41:26 +0100
> 
> >> Let me know if there are any other changes needed.  I'll have some time
> >> this evening to do some hacking if needed :)
> >
> > Will do.
> 
> Installed.

Thanks, I've now added to the Emacs manual the user-level
documentation of tree-sitter features.  Please take a look and tell if
anything is missing/incorrect.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-29 13:33 UTC (permalink / raw)
  To: Yuan Fu, Stefan Monnier; +Cc: 60983, theo

> From: Yuan Fu <casouri@gmail.com>
> Date: Mon, 23 Jan 2023 15:55:30 -0800
> Cc: Eli Zaretskii <eliz@gnu.org>,
>  Bug Report Emacs <bug-gnu-emacs@gnu.org>
> 
> >> Thanks.  What about the questions I asked regarding indentation
> >> features, and specifically about c-ts-mode-indent-style?
> > 
> > I am working on that, but I hit some issues where I cannot make treesit recognize the new settings before the whole treesit-major-mode-setup reruns. Just setting the symbol doesn't work, and reenabling the mode inside of the :set function isn't the best idea maybe?
> > 
> > I'd love some pointers to how other modes do similar stuff, but I didn't really find anything.
> 
> One common approach is to iterate over all live buffer and reset the variable (in this case treesit-simple-indent-rules) on applicate buffers (in this case c/c++-ts-mode buffers).
> 
> It would be nice to also have a command c-ts-mode-set-style (like c-set-style) that takes a style symbol and sets treesit-simple-indent-rules accordingly. And in major-mode setup, ie, c-ts-mode’s body, you call it with c-ts-mode-indent-style.

This command now exists, courtesy of Theo, but I see some strange
misbehavior with it in c++-ts-mode, related to keymap inheritance:

  emacs -Q
  M-x c-ts-mode RET
  C-h c C-c C-q
  => C-c C-q runs the command c-ts-mode-indent-defun

But

  M-x c++-ts-mode RET
  C-h c C-c C-q
  => C-c C-q is undefined

This is strange, since the binding is defined in c-ts-mode-map, which
is used in c-ts-base-mode:

  (defvar-keymap c-ts-mode-map
    :doc "Keymap for the C language with tree-sitter"
    :parent prog-mode-map
    "C-c C-q" #'c-ts-mode-indent-defun
    "C-c ." #'c-ts-mode-set-style)

  ;;;###autoload
  (define-derived-mode c-ts-base-mode prog-mode "C"
    "Major mode for editing C, powered by tree-sitter.

  \\{c-ts-mode-map}"
    :syntax-table c-ts-mode--syntax-table

and both c-ts-mode and c++-ts-mode derive from c-ts-base-mode:

  (define-derived-mode c-ts-mode c-ts-base-mode "C"
    "Major mode for editing C, powered by tree-sitter.

  (define-derived-mode c++-ts-mode c-ts-base-mode "C++"
    "Major mode for editing C++, powered by tree-sitter.

What's missing here?  Stefan, any advice?





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 1 reply; 35+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-29 19:12 UTC (permalink / raw)
  To: Eli Zaretskii, Yuan Fu, Stefan Monnier; +Cc: 60983

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Yuan Fu <casouri@gmail.com>
>> Date: Mon, 23 Jan 2023 15:55:30 -0800
>> Cc: Eli Zaretskii <eliz@gnu.org>,
>>  Bug Report Emacs <bug-gnu-emacs@gnu.org>
>> 
>> >> Thanks.  What about the questions I asked regarding indentation
>> >> features, and specifically about c-ts-mode-indent-style?
>> > 
>> > I am working on that, but I hit some issues where I cannot make treesit recognize the new settings before the whole treesit-major-mode-setup reruns. Just setting the symbol doesn't work, and reenabling the mode inside of the :set function isn't the best idea maybe?
>> > 
>> > I'd love some pointers to how other modes do similar stuff, but I didn't really find anything.
>> 
>> One common approach is to iterate over all live buffer and reset the variable (in this case treesit-simple-indent-rules) on applicate buffers (in this case c/c++-ts-mode buffers).
>> 
>> It would be nice to also have a command c-ts-mode-set-style (like c-set-style) that takes a style symbol and sets treesit-simple-indent-rules accordingly. And in major-mode setup, ie, c-ts-mode’s body, you call it with c-ts-mode-indent-style.
>
> This command now exists, courtesy of Theo, but I see some strange
> misbehavior with it in c++-ts-mode, related to keymap inheritance:
>
>   emacs -Q
>   M-x c-ts-mode RET
>   C-h c C-c C-q
>   => C-c C-q runs the command c-ts-mode-indent-defun
>
> But
>
>   M-x c++-ts-mode RET
>   C-h c C-c C-q
>   => C-c C-q is undefined
>
> This is strange, since the binding is defined in c-ts-mode-map, which
> is used in c-ts-base-mode:
>
>   (defvar-keymap c-ts-mode-map
>     :doc "Keymap for the C language with tree-sitter"
>     :parent prog-mode-map
>     "C-c C-q" #'c-ts-mode-indent-defun
>     "C-c ." #'c-ts-mode-set-style)
>
>   ;;;###autoload
>   (define-derived-mode c-ts-base-mode prog-mode "C"
>     "Major mode for editing C, powered by tree-sitter.
>
>   \\{c-ts-mode-map}"
>     :syntax-table c-ts-mode--syntax-table
>
> and both c-ts-mode and c++-ts-mode derive from c-ts-base-mode:
>
>   (define-derived-mode c-ts-mode c-ts-base-mode "C"
>     "Major mode for editing C, powered by tree-sitter.
>
>   (define-derived-mode c++-ts-mode c-ts-base-mode "C++"
>     "Major mode for editing C++, powered by tree-sitter.
>
> What's missing here?  Stefan, any advice?


I'm sure you know this, but adding the below patch "fixes" it.  It seems
like the inheritance isn't registered somehow without a defined
mode-map?

Theo

diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index 612c41bf07..e9f9eea69c 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -703,6 +703,10 @@ c-ts-mode-map
   "C-c C-q" #'c-ts-mode-indent-defun
   "C-c ." #'c-ts-mode-set-style)
 
+(defvar-keymap c++-ts-mode-map
+  :doc "Keymap for the C++ language with tree-sitter"
+  :parent c-ts-mode-map)
+
 ;;;###autoload
 (define-derived-mode c-ts-base-mode prog-mode "C"
   "Major mode for editing C, powered by tree-sitter.
@@ -810,7 +814,9 @@ c++-ts-mode
     (add-to-list \\='major-mode-remap-alist
                  \\='(c-or-c++-mode . c-or-c++-ts-mode))
 
-in your configuration."
+in your configuration.
+
+\\{c++-ts-mode-map}"
   :group 'c++
 
   (when (treesit-ready-p 'cpp)





^ permalink raw reply related	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-29 19:41 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: casouri, 60983, monnier

> From: Theodor Thornhill <theo@thornhill.no>
> Cc: 60983@debbugs.gnu.org
> Date: Sun, 29 Jan 2023 20:12:39 +0100
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > What's missing here?  Stefan, any advice?
> 
> 
> I'm sure you know this, but adding the below patch "fixes" it.  It seems
> like the inheritance isn't registered somehow without a defined
> mode-map?

I asked Stefan to help precisely because I don't understand why we
need anything beyond what we have already.  I thought mode inheritance
should have taken care of it, or at least the documentation of
define-derived-mode seems to imply that.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 1 reply; 35+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-01-30  2:28 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: casouri, 60983, Theodor Thornhill

> I asked Stefan to help precisely because I don't understand why we
> need anything beyond what we have already.  I thought mode inheritance
> should have taken care of it, or at least the documentation of
> define-derived-mode seems to imply that.

But the `define-derived-mode` uses `prog-mode` as parent, so while the
keymap does inherit from its parent mode's keymap, it's just
`prog-mode-map` rather than `c-ts-mode-map`.


        Stefan






^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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
  0 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2023-01-30 13:45 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: casouri, 60983, theo

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Theodor Thornhill <theo@thornhill.no>,  casouri@gmail.com,
>   60983@debbugs.gnu.org
> Date: Sun, 29 Jan 2023 21:28:29 -0500
> 
> > I asked Stefan to help precisely because I don't understand why we
> > need anything beyond what we have already.  I thought mode inheritance
> > should have taken care of it, or at least the documentation of
> > define-derived-mode seems to imply that.
> 
> But the `define-derived-mode` uses `prog-mode` as parent, so while the
> keymap does inherit from its parent mode's keymap, it's just
> `prog-mode-map` rather than `c-ts-mode-map`.

Ah, so it's this bit of define-derived-mode's documentation:

        • The new mode has its own sparse keymap, named ‘VARIANT-map’.
          ‘define-derived-mode’ makes the parent mode’s keymap the
          parent of the new map, unless ‘VARIANT-map’ is already set and
          already has a parent.  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          ^^^^^^^^^^^^^^^^^^^^

IOW, the problem is that c-ts-base-mode defined c-ts-mode-map as its
keymap, so when c-ts-mode is defined, its keymap variable "is already
set and already has a parent".

Thanks, this is now fixed.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  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-26  7:56 ` Yuan Fu
@ 2023-02-03  3:07 ` Yuan Fu
  2023-02-03  7:47   ` Eli Zaretskii
  2 siblings, 1 reply; 35+ messages in thread
From: Yuan Fu @ 2023-02-03  3:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 60983, theo

I just read the new manual sections, thanks for the work! Do we want to mention treesit-font-lock-recompute-features in the user manual? That’s the only way for someone to add/remove specific features (as opposed to changing the decoration level). (We might also want to mention that changing treesit-font-lock-features directly doesn’t have any effect, similar to treesit-font-lock-level.)

treesit-font-lock-recompute-features is intended to be used in major mode hooks, like

(add-hook 'c-ts-mode-hook #'c-ts-setup)

(defun c-ts-mode-setup ()
  (treesit-font-lock-recompute-features
   '(emacs-devel)
   '(property bracket delimiter operator variable function)))

Yuan




^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  2023-02-03  3:07 ` Yuan Fu
@ 2023-02-03  7:47   ` Eli Zaretskii
  2023-02-04 23:38     ` Yuan Fu
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-02-03  7:47 UTC (permalink / raw)
  To: Yuan Fu; +Cc: 60983, theo

> From: Yuan Fu <casouri@gmail.com>
> Date: Thu, 2 Feb 2023 19:07:07 -0800
> Cc: Bug Report Emacs <bug-gnu-emacs@gnu.org>,
>  Theodor Thornhill <theo@thornhill.no>
> 
> I just read the new manual sections, thanks for the work! Do we want to mention treesit-font-lock-recompute-features in the user manual? That’s the only way for someone to add/remove specific features (as opposed to changing the decoration level). (We might also want to mention that changing treesit-font-lock-features directly doesn’t have any effect, similar to treesit-font-lock-level.)

treesit-font-lock-recompute-features is a non-interactive function, so
mentioning it in the user manual is generally inappropriate.  Users
are unlikely to add features that aren't already defined in the mode's
font-lock setup.

This function and its use in these situations are described in the
ELisp manual, where I think it belongs.

As for the fact that changing treesit-font-lock-feature-list directly
doesn't have any effect, that is already in the doc string.  I'm not
opposed to mentioning that in the manual as well, but I see no problem
with what we have.

> treesit-font-lock-recompute-features is intended to be used in major mode hooks, like
> 
> (add-hook 'c-ts-mode-hook #'c-ts-setup)
> 
> (defun c-ts-mode-setup ()
>   (treesit-font-lock-recompute-features
>    '(emacs-devel)
>    '(property bracket delimiter operator variable function)))

This belongs to the ELisp manual, IMO.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  2023-02-03  7:47   ` Eli Zaretskii
@ 2023-02-04 23:38     ` Yuan Fu
  2023-02-05  6:01       ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Yuan Fu @ 2023-02-04 23:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 60983, theo



> On Feb 2, 2023, at 11:47 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Thu, 2 Feb 2023 19:07:07 -0800
>> Cc: Bug Report Emacs <bug-gnu-emacs@gnu.org>,
>> Theodor Thornhill <theo@thornhill.no>
>> 
>> I just read the new manual sections, thanks for the work! Do we want to mention treesit-font-lock-recompute-features in the user manual? That’s the only way for someone to add/remove specific features (as opposed to changing the decoration level). (We might also want to mention that changing treesit-font-lock-features directly doesn’t have any effect, similar to treesit-font-lock-level.)
> 
> treesit-font-lock-recompute-features is a non-interactive function, so
> mentioning it in the user manual is generally inappropriate.  Users
> are unlikely to add features that aren't already defined in the mode's
> font-lock setup.
> 
> This function and its use in these situations are described in the
> ELisp manual, where I think it belongs.
> 
> As for the fact that changing treesit-font-lock-feature-list directly
> doesn't have any effect, that is already in the doc string.  I'm not
> opposed to mentioning that in the manual as well, but I see no problem
> with what we have.

I see. Sounds good to me. I meant enabling/disabling features when I say “adding/removing” features. Does that make anything different?

> 
>> treesit-font-lock-recompute-features is intended to be used in major mode hooks, like
>> 
>> (add-hook 'c-ts-mode-hook #'c-ts-setup)
>> 
>> (defun c-ts-mode-setup ()
>>  (treesit-font-lock-recompute-features
>>   '(emacs-devel)
>>   '(property bracket delimiter operator variable function)))
> 
> This belongs to the ELisp manual, IMO.

Ok, then I think there’s nothing needed to change in the Emacs manual.

Yuan




^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  2023-02-04 23:38     ` Yuan Fu
@ 2023-02-05  6:01       ` Eli Zaretskii
  2023-02-05  7:54         ` Yuan Fu
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-02-05  6:01 UTC (permalink / raw)
  To: Yuan Fu; +Cc: 60983, theo

> From: Yuan Fu <casouri@gmail.com>
> Date: Sat, 4 Feb 2023 15:38:17 -0800
> Cc: Bug Report Emacs <bug-gnu-emacs@gnu.org>,
>  theo@thornhill.no
> 
> > treesit-font-lock-recompute-features is a non-interactive function, so
> > mentioning it in the user manual is generally inappropriate.  Users
> > are unlikely to add features that aren't already defined in the mode's
> > font-lock setup.
> > 
> > This function and its use in these situations are described in the
> > ELisp manual, where I think it belongs.
> > 
> > As for the fact that changing treesit-font-lock-feature-list directly
> > doesn't have any effect, that is already in the doc string.  I'm not
> > opposed to mentioning that in the manual as well, but I see no problem
> > with what we have.
> 
> I see. Sounds good to me. I meant enabling/disabling features when I say “adding/removing” features. Does that make anything different?

Yes, that's how I understood what you were saying: changing the list
of features enabled/disabled by specific levels.  This is not a
user-level thing, so describing it in the ELisp manual is good enough,
I think.  (If it turns out users want to do this kind of thing too
often, it probably means our design of the user-facing features is
sub-optimal and should be improved.)





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  2023-02-05  6:01       ` Eli Zaretskii
@ 2023-02-05  7:54         ` Yuan Fu
  2023-02-05  9:23           ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Yuan Fu @ 2023-02-05  7:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 60983, theo



> On Feb 4, 2023, at 10:01 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Sat, 4 Feb 2023 15:38:17 -0800
>> Cc: Bug Report Emacs <bug-gnu-emacs@gnu.org>,
>> theo@thornhill.no
>> 
>>> treesit-font-lock-recompute-features is a non-interactive function, so
>>> mentioning it in the user manual is generally inappropriate.  Users
>>> are unlikely to add features that aren't already defined in the mode's
>>> font-lock setup.
>>> 
>>> This function and its use in these situations are described in the
>>> ELisp manual, where I think it belongs.
>>> 
>>> As for the fact that changing treesit-font-lock-feature-list directly
>>> doesn't have any effect, that is already in the doc string.  I'm not
>>> opposed to mentioning that in the manual as well, but I see no problem
>>> with what we have.
>> 
>> I see. Sounds good to me. I meant enabling/disabling features when I say “adding/removing” features. Does that make anything different?
> 
> Yes, that's how I understood what you were saying: changing the list
> of features enabled/disabled by specific levels.  This is not a
> user-level thing, so describing it in the ELisp manual is good enough,
> I think.  (If it turns out users want to do this kind of thing too
> often, it probably means our design of the user-facing features is
> sub-optimal and should be improved.)

I see, my description and the documentation is still not clear enough, I’m afraid. treesit-font-lock-recompute-feature does not add/remove features that belongs to a level. The design is that, the user uses decoration level to set the rough level, which enables a set of features, then use treesit-font-lock-recompute-feature to do more fine-grained control by additionally enabling/disabling features. 

For example in c-ts-mode, if I set the decoration level to 2, I’d have these features: comment, definition, keyword, preprocessor, string, type. If I also want the assignment features, which is in level 3, but don’t want other features in level 3, I would use treesit-font-lock-recompute-feature to enable that feature. Similarly, I can use treesit-font-lock-recompute-feature to disable the preprocessor which is at level 2, without affecting other features status.


Yuan






^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  2023-02-05  7:54         ` Yuan Fu
@ 2023-02-05  9:23           ` Eli Zaretskii
  2023-02-05  9:42             ` Yuan Fu
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2023-02-05  9:23 UTC (permalink / raw)
  To: Yuan Fu; +Cc: 60983, theo

> From: Yuan Fu <casouri@gmail.com>
> Date: Sat, 4 Feb 2023 23:54:56 -0800
> Cc: Bug Report Emacs <bug-gnu-emacs@gnu.org>,
>  theo@thornhill.no
> 
> > Yes, that's how I understood what you were saying: changing the list
> > of features enabled/disabled by specific levels.  This is not a
> > user-level thing, so describing it in the ELisp manual is good enough,
> > I think.  (If it turns out users want to do this kind of thing too
> > often, it probably means our design of the user-facing features is
> > sub-optimal and should be improved.)
> 
> I see, my description and the documentation is still not clear enough, I’m afraid. treesit-font-lock-recompute-feature does not add/remove features that belongs to a level. The design is that, the user uses decoration level to set the rough level, which enables a set of features, then use treesit-font-lock-recompute-feature to do more fine-grained control by additionally enabling/disabling features. 
> 
> For example in c-ts-mode, if I set the decoration level to 2, I’d have these features: comment, definition, keyword, preprocessor, string, type. If I also want the assignment features, which is in level 3, but don’t want other features in level 3, I would use treesit-font-lock-recompute-feature to enable that feature. Similarly, I can use treesit-font-lock-recompute-feature to disable the preprocessor which is at level 2, without affecting other features status.

That's exactly what I understood, and that was what I responded to.  I
don't think it's a user-level feature to tweak the list of features
that are enabled/disables by a certain decoration level.  It is on the
level of Lisp programming, and therefore should be described in the
ELisp manual.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#60983: 29.0.60; Tree-sitter user-level control
  2023-02-05  9:23           ` Eli Zaretskii
@ 2023-02-05  9:42             ` Yuan Fu
  0 siblings, 0 replies; 35+ messages in thread
From: Yuan Fu @ 2023-02-05  9:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 60983, theo



> On Feb 5, 2023, at 1:23 AM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Sat, 4 Feb 2023 23:54:56 -0800
>> Cc: Bug Report Emacs <bug-gnu-emacs@gnu.org>,
>> theo@thornhill.no
>> 
>>> Yes, that's how I understood what you were saying: changing the list
>>> of features enabled/disabled by specific levels.  This is not a
>>> user-level thing, so describing it in the ELisp manual is good enough,
>>> I think.  (If it turns out users want to do this kind of thing too
>>> often, it probably means our design of the user-facing features is
>>> sub-optimal and should be improved.)
>> 
>> I see, my description and the documentation is still not clear enough, I’m afraid. treesit-font-lock-recompute-feature does not add/remove features that belongs to a level. The design is that, the user uses decoration level to set the rough level, which enables a set of features, then use treesit-font-lock-recompute-feature to do more fine-grained control by additionally enabling/disabling features. 
>> 
>> For example in c-ts-mode, if I set the decoration level to 2, I’d have these features: comment, definition, keyword, preprocessor, string, type. If I also want the assignment features, which is in level 3, but don’t want other features in level 3, I would use treesit-font-lock-recompute-feature to enable that feature. Similarly, I can use treesit-font-lock-recompute-feature to disable the preprocessor which is at level 2, without affecting other features status.
> 
> That's exactly what I understood, and that was what I responded to.  I
> don't think it's a user-level feature to tweak the list of features
> that are enabled/disables by a certain decoration level.  It is on the
> level of Lisp programming, and therefore should be described in the
> ELisp manual.

Oh! All is well, then :-)

Yuan




^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2023-02-05  9:42 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
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

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).