unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Yuan Fu <casouri@gmail.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: Vincenzo Pupillo <v.pupillo@gmail.com>,
	Emacs Devel <emacs-devel@gnu.org>,
	Stefan Kangas <stefankangas@gmail.com>,
	Stefan Monnier <monnier@iro.umontreal.ca>,
	Dmitry Gutov <dmitry@gutov.dev>
Subject: Tree-sitter central configuration variable
Date: Thu, 28 Nov 2024 21:49:33 -0800	[thread overview]
Message-ID: <137AE507-F467-4FB2-83DB-EC621F868C60@gmail.com> (raw)
In-Reply-To: <868qtam99v.fsf@gnu.org>



> On Nov 23, 2024, at 4:20 AM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Sun, 10 Nov 2024 00:04:00 -0800
>> Cc: Vincenzo Pupillo <v.pupillo@gmail.com>,
>> emacs-devel@gnu.org
>> 
>> 
>> 
>>> On Nov 9, 2024, at 12:54 AM, Eli Zaretskii <eliz@gnu.org> wrote:
>>> 
>>>> From: Yuan Fu <casouri@gmail.com>
>>>> Date: Sat, 9 Nov 2024 00:36:31 -0800
>>>> Cc: Eli Zaretskii <eliz@gnu.org>,
>>>> emacs-devel@gnu.org
>>>> 
>>>>>> Also, we could support a value of that variable which is a list, like
>>>>>> we do with font-lock-maximum-decoration.  This will be more useful
>>>>>> than making the variable buffer-local, since presumably your
>>>>>> preferences are per-mode, not per-buffer.  
>>>>> Yes, this would be a better solution.
>>>>> 
>>>>>> Yuan, WDYT?
>>>>>> 
>>>> 
>>>> Perhaps even per-language, for multi-language modes. I think it’s a valid use case. IMO, specify the level by language is better than mode. For single language modes, using the language is equivalent to using the mode; for multi-language modes, using the language allows more flexibility. 
>>> 
>>> Patches welcome.
>> 
>> I’ll prepare one soon.
> 
> Did you have time to work on this?

Actually, I want to expand this to something that allows users to configure tree-sitter modes and toggle on/off tree-sitter features.

Since Emacs 29, I see many people ask about how to configure tree-sitter modes by setting some variable. It seems that people much prefer setting a variable than adding a major mode hook that calls some functions. Also, admittedly adding custom font-lock or indent rules aren’t very straightforward for users.

In Emacs 29, we went with the major-mode hook approach for customization since the major mode inheritance situation wasn’t yet clear, the hook approach provides most flexibility, and we don’t really know what we want. But at this point I think we can add another layer of convenience. As long as this convenience layer handles 90% of the use-cases and doesn’t add any confusion, it’ll be a net-gain.

What do you guys think about something like this:

(setq treesit-global-configuration
      '((c-ts-mode
         ;; Set treesit-font-lock-level to 4
         (font-lock-level . 4)
         ;; Disable tree-sitter’s outline support
         (outline . disable)
         ;; Enable these features on top of the default ones.
         (font-lock-enable . (function property variable))
         ;; Disable these features.
         (font-lock-disable . (definition))
         ;; Add extra font-lock rules
         (font-lock-extra-rules
          ( :feature 'my-rules
            :language 'c
            ((some_query) @some-face)))
         (simple-indent-extra-rules
          (c
           (matcher anchor offset))
          (d
           (matcher anchor offset)))
         )))

This config will apply to c-ts-mode or its derived mode. Users can add extra font-lock and indent rules by setting this variable.

One thing I don’t like is how it handles languages. In this POC language-specific settings are nested under the mode. I’m ok with mode-language hierarchy, but the nesting adds a lot of nesting levels to the variable. And the language nesting isn’t consistent, some settings have language nesting, some don’t.

Implementation wise, it shouldn’t be difficult. We just make treesit-major-mode-setup aware of this variable and use it to override stuff when setting things up.

Yuan


  reply	other threads:[~2024-11-29  5:49 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-07 10:30 Define treesit-font-lock-level as buffer local Vincenzo Pupillo
2024-11-07 11:03 ` Eli Zaretskii
2024-11-07 11:08   ` Vincenzo Pupillo
2024-11-09  8:36     ` Yuan Fu
2024-11-09  8:54       ` Eli Zaretskii
2024-11-10  8:04         ` Yuan Fu
2024-11-23 12:20           ` Eli Zaretskii
2024-11-29  5:49             ` Yuan Fu [this message]
2024-11-29  7:12               ` Tree-sitter central configuration variable Eshel Yaron
2024-11-29  8:42                 ` Yuan Fu
2024-11-29  8:04               ` Eli Zaretskii
2024-11-29  9:07                 ` Yuan Fu
2024-11-29 12:02                   ` Eli Zaretskii
2024-11-29 17:01               ` Stefan Monnier
2024-11-29 17:22                 ` Ship Mints

Reply instructions:

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

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

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

  List information: https://www.gnu.org/software/emacs/

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

  git send-email \
    --in-reply-to=137AE507-F467-4FB2-83DB-EC621F868C60@gmail.com \
    --to=casouri@gmail.com \
    --cc=dmitry@gutov.dev \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    --cc=stefankangas@gmail.com \
    --cc=v.pupillo@gmail.com \
    /path/to/YOUR_REPLY

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

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

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).