From: Yuan Fu <casouri@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Lars Ingebrigtsen <larsi@gnus.org>, emacs-devel <emacs-devel@gnu.org>
Subject: Re: Average-user-facing interface for tree-sitter
Date: Mon, 17 Oct 2022 02:07:15 -0700 [thread overview]
Message-ID: <ED6F6961-E52E-494A-84F0-0FE77E2AC446@gmail.com> (raw)
In-Reply-To: <6A0F847F-910D-449B-B461-466493CC9847@gmail.com>
> On Oct 14, 2022, at 10:05 PM, Yuan Fu <casouri@gmail.com> wrote:
>
>
>
>> 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.
If no one has opinions on this, I’m going to implement the central-variable approach, since IMO that one is most fit.
Yuan
next prev parent reply other threads:[~2022-10-17 9:07 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-12 6:11 Average-user-facing interface for tree-sitter Yuan Fu
2022-10-13 0:54 ` [SPAM UNSURE] " Stephen Leake
2022-10-13 6:32 ` Stephen Leake
2022-10-13 6:22 ` Lars Ingebrigtsen
2022-10-13 9:18 ` Robert Pluim
2022-10-13 9:21 ` Lars Ingebrigtsen
2022-10-13 9:32 ` Po Lu
2022-10-13 9:42 ` Robert Pluim
2022-10-13 12:31 ` Stefan Kangas
2022-10-13 9:57 ` Daniel Martín
2022-10-13 10:01 ` [SPAM UNSURE] " Stephen Leake
2022-10-13 14:32 ` Jostein Kjønigsen
2022-10-13 16:14 ` Eli Zaretskii
2022-10-13 17:27 ` Lars Ingebrigtsen
2022-10-13 19:44 ` Yuan Fu
2022-10-14 11:02 ` Lars Ingebrigtsen
2022-10-14 11:22 ` Stephen Leake
2022-10-14 20:10 ` Yuan Fu
2022-10-14 20:19 ` Yuan Fu
2022-10-14 20:49 ` Stefan Monnier
2022-10-14 22:51 ` Yuan Fu
2022-10-15 3:26 ` Stefan Monnier
2022-10-15 5:05 ` Yuan Fu
2022-10-17 9:07 ` Yuan Fu [this message]
2022-10-17 9:15 ` Lars Ingebrigtsen
2022-10-18 20:54 ` Yuan Fu
2022-10-18 21:48 ` Stefan Monnier
2022-10-18 22:06 ` Yuan Fu
2022-10-18 22:31 ` Stefan Monnier
2022-10-18 23:06 ` Yuan Fu
2022-10-19 2:52 ` Stefan Monnier
2022-10-19 3:48 ` [External] : " Drew Adams
2022-10-20 0:23 ` Yuan Fu
2022-10-19 5:35 ` Theodor Thornhill
2022-10-20 0:28 ` Yuan Fu
2022-10-20 7:44 ` Theodor Thornhill
2022-10-20 17:53 ` Stefan Monnier
2022-10-20 18:10 ` Theodor Thornhill
2022-10-20 18:11 ` Theodor Thornhill
2022-10-20 23:06 ` Yuan Fu
2022-10-21 22:10 ` Yuan Fu
2022-10-21 22:35 ` Stefan Monnier
2022-10-23 1:59 ` Fu Yuan
2022-10-23 4:59 ` Theodor Thornhill
2022-10-24 12:57 ` Stefan Monnier
2022-10-24 17:14 ` Stephen Leake
2022-10-24 21:07 ` Stefan Monnier
2022-10-24 20:51 ` Yuan Fu
2022-10-24 23:55 ` Stefan Monnier
2022-10-25 21:37 ` Yuan Fu
2022-10-25 22:49 ` Stefan Monnier
2022-10-27 1:56 ` Yuan Fu
2022-10-27 15:21 ` Stefan Monnier
2022-10-27 15:29 ` Dmitry Gutov
2022-10-28 8:02 ` Yuan Fu
2022-10-24 16:46 ` Stephen Leake
2022-10-18 20:49 ` Stefan Monnier
2022-10-18 20:58 ` Yuan Fu
2022-10-13 13:05 ` Stefan Monnier
-- strict thread matches above, loose matches on Subject: below --
2022-10-15 9:49 Payas Relekar
2022-10-16 11:03 ` Katevan Lomidze
2022-10-16 11:43 ` Eli Zaretskii
2022-10-15 13:03 Ketevan Lomidze
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ED6F6961-E52E-494A-84F0-0FE77E2AC446@gmail.com \
--to=casouri@gmail.com \
--cc=emacs-devel@gnu.org \
--cc=larsi@gnus.org \
--cc=monnier@iro.umontreal.ca \
/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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.