[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Tree-sitter central configuration variable
From: |
Yuan Fu |
Subject: |
Re: Tree-sitter central configuration variable |
Date: |
Mon, 2 Dec 2024 22:40:56 -0800 |
> On Nov 29, 2024, at 9:22 AM, Ship Mints <shipmints@gmail.com> wrote:
>
> Chiming in with my minor voice. I prefer my mode configurations generally
> self contained and not centralized as a single global configuration variable
> would encourage. When I share my configurations with others, it also suggests
> that if they adopt a global configuration variable on top of what I share, it
> will introduce subtle changes in behavior that I may not at first understand
> the source of when helping others. I definitely prefer proper lisp over an
> opaque configuration variable.
>
> -Stephane
>
> On Fri, Nov 29, 2024 at 12:04 PM Stefan Monnier <monnier@iro.umontreal.ca>
> wrote:
> > Since Emacs 29, I see many people ask about how to configure
> > tree-sitter modes by setting some variable.
>
> This is not specific to tree-sitter.
>
> > It seems that people much prefer setting a variable than adding
> > a major mode hook that calls some functions.
>
> But that boxes them into the subset of possibilities that have been
> pre-imagined by those who designed the set of variables.
>
> > 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)))
> > )))
>
> Sounds to me like this is inventing a new programming language, just one
> that's a lot more restrictive than ELisp.
>
> Is it really better than ELisp which could look like:
>
> (add-hook 'c-ts-mode-hook #'my-c-ts-mode-preferences)
> (defun my-c-ts-mode-preferences ()
> (setq-local treesit-font-lock-level 4)
> (treesit-outline-mode -1)
> (treesit-font-lock-enable '(function property variable))
> (treesit-font-lock-disable '(definition))
> (treesit-font-lock-add-rules
> '( :feature 'my-rules
> :language 'c
> ((some_query) @some-face)))
> (treesit-indent-add-rules
> '((c
> (matcher anchor offset))
> (d
> (matcher anchor offset)))
> ))
>
> Admittedly, the add-hook/defun dance could be improved, and that would
> benefit more than just tree-sitter. E.g. a new macro like
>
> (defmacro custom-set-hook (hook &rest body)
> (declare (indent 1) (debug (sexp def-body)))
> (let ((funname (intern (format "custom-set-hook--%s" hook))))
> `(progn (add-hook ',hook #',funnmame)
> (defun ,funname () ,@body))))
>
> > 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.
>
> I don't really understand what you're referring to, but for
> `treesit-font-lock-add-rules` would could try and auto-add the `:language`?
>
>
> Stefan
>
>
It seems that we’re getting a resounding no here, so I’m gonna drop this :) On
a side note, I was planning to add a convenience function for adding font-lock
rules, so users don’t need to do the append dance. Turns out I’ve already
written one but then forgot about it :)
Maybe what we really need is a good guide/manual section on installing and
configuring tree-sitter major modes. I wrote a detailed guide for writing
tree-sitter major modes, but didn’t write one for installing and configuring
tree-sitter major modes.
Yuan
- Re: Tree-sitter central configuration variable,
Yuan Fu <=