[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Average-user-facing interface for tree-sitter
From: |
Yuan Fu |
Subject: |
Re: Average-user-facing interface for tree-sitter |
Date: |
Fri, 14 Oct 2022 22:05:15 -0700 |
> On Oct 14, 2022, at 8:26 PM, Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>
>> (add-hook 'xxx-mode-hook
>> (lambda () (when (eq major-mode 'xxx-mode)
>> (treesit-mode))))
>>
>> Which again is a bit awkward.
>
> Awkward but possible. Another approach can be:
>
> (add-hook 'xxx-mode-hook #'treesit-mode)
> (add-hook 'yyy-mode-hook (lambda () (treesit-mode -1)))
With the central variable approach, you can do (push ‘(xxx-mode t nil)
treesit-settings), where t means enable, nil means don’t inherit.
>
>> So maybe a central variable isn’t that bad an idea. Could you layout
>> why mapping modes to some information is bad?
>
> Because it needs to be able to say "for this mode and all its derived
> modes" but also "for this mode only" as well as various combinations,
> and then you need to document how it interacts with the major mode's
> hook, ...
Do you mind elaborate on: What are the other combinations? What are the ways a
central variable can interact with major mode hooks?
> Maybe we should devise a way to "centrally" control the value of some
> vars depending on major modes, but if so we should carefully design
> a thing specifically for that, make sure it's sufficiently flexible, and
> then use it for several (any?) variable.
>
> All the vars I've seen so far which do that do it quite naively, which
> works OK for simple cases but breaks down one way or another when you
> start taking derived modes into account. Hence my considering it a code
> smell (just like most uses of the `major-mode` variable).
How about a function mode-specific-value that takes any variable with the
following shape:
((MODE VALUE INHERIT)…)
And returns the right VALUE for the current mode? INHERIT decides whether VALUE
is inherited by MODE’s derived modes. Something like:
(defun mode-specific-value (central-var)
(cl-loop for setting in central-var
for mode = (nth 0 setting)
for value = (nth 1 setting)
for inherit = (nth 2 setting)
if (and (derived-mode-p mode) inherit)
return value
finally return
(if-let ((default (alist-get t central-var))) ; t sets the default
value for all mode.
(car default)
nil)))
This function would handle derived mode ok, but I don’t know what are the other
problems you are think of, maybe you can tell me what this function falls short
for. And we can go from there.
Yuan
- Re: Average-user-facing interface for tree-sitter, (continued)
- Re: Average-user-facing interface for tree-sitter, Stefan Monnier, 2022/10/14
- Re: Average-user-facing interface for tree-sitter, Yuan Fu, 2022/10/14
- Re: Average-user-facing interface for tree-sitter, Stefan Monnier, 2022/10/14
- Re: Average-user-facing interface for tree-sitter,
Yuan Fu <=
- Re: Average-user-facing interface for tree-sitter, Yuan Fu, 2022/10/17
- Re: Average-user-facing interface for tree-sitter, Lars Ingebrigtsen, 2022/10/17
- Re: Average-user-facing interface for tree-sitter, Yuan Fu, 2022/10/18
- Re: Average-user-facing interface for tree-sitter, Stefan Monnier, 2022/10/18
- Re: Average-user-facing interface for tree-sitter, Yuan Fu, 2022/10/18
- Re: Average-user-facing interface for tree-sitter, Stefan Monnier, 2022/10/18
- Re: Average-user-facing interface for tree-sitter, Yuan Fu, 2022/10/18
- Re: Average-user-facing interface for tree-sitter, Stefan Monnier, 2022/10/18
- RE: [External] : Re: Average-user-facing interface for tree-sitter, Drew Adams, 2022/10/18
- Re: Average-user-facing interface for tree-sitter, Yuan Fu, 2022/10/19