* Tree-sitter and major mode inheritance @ 2022-11-16 20:45 Yuan Fu 2022-11-18 21:54 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Jostein Kjønigsen 2022-11-19 9:41 ` Tree-sitter and major mode inheritance Yuan Fu 0 siblings, 2 replies; 60+ messages in thread From: Yuan Fu @ 2022-11-16 20:45 UTC (permalink / raw) To: emacs-devel So I’m trying to merge css-ts-mode with css-mode. Scss-mode inherits css-mode, but if user enables tree-sitter for css-mode, scss-mode will inherit all that tree-sitter setup, and lose all the native css setup. Then if a user doesn’t want to enable tree-sitter in scss-mode, too bad: scss-mode breaks. Essentially scss-mode needs to be able to control which parts of css-mode’s setup it wants to inherit—native setup or tree-sitter setup—regardless of whether css-mode enables tree-sitter or not. I wonder if we can do something like this: css-mode | +---------+-----+-----------+ | | | css-native-mode css-ts-mode scss-mode | +----+------------+ | | scss-native-mode scss-ts-mode css-mode: a virtual mode, only sets up basic things that both native and tree-sitter mode needs, like comment-start. css-native-mode: native setup css-ts-mode: tree-sitter setup scss-mode: a virtual mode, inherits css-mode scss-native-mode: native setup scss-ts-mode: tree-sitter setup And user could use major-mode-remap-alist to choose which mode they want: (css-mode . css-ts-mode) for enabling tree-sitter (css-mode . css-native-mode) for not enabling tree-sitter This could also used for other modes, like c-mode: c-mode, c-native-mode (cc-mode), c-ts-mode. Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-16 20:45 Tree-sitter and major mode inheritance Yuan Fu @ 2022-11-18 21:54 ` Jostein Kjønigsen 2022-11-18 22:34 ` Philip Kaludercic ` (2 more replies) 2022-11-19 9:41 ` Tree-sitter and major mode inheritance Yuan Fu 1 sibling, 3 replies; 60+ messages in thread From: Jostein Kjønigsen @ 2022-11-18 21:54 UTC (permalink / raw) To: Yuan Fu, emacs-devel, Theodor Thornhill, Eli Zaretskii [-- Attachment #1: Type: text/plain, Size: 4662 bytes --] Hey everyone. I know this has been said before, by people which by far has been contributing much more than me... But I still don't think it's a good idea to replace the implementation in existing major-modes with tree-sitter implementations, nor selectively activate tree-sitter in major-modes prone to inhetitence and derivation. Me and Theodor faced these same issues with "our" C# and TypeScript major-modes, and the only "clean" way we agreed we could make this work was to create wholly new implementations. I can come up with many good, objective reasons for this, but I think Theodor has already represented this view fairly well. While for the sake of brevity, I'll not diving deeply into this particular thing, I will say this: A new tree-sitter based major-mode free of compatibility concerns allowed us to create entirely new major-modes fixing most of our existing bugs, faster than we before would be able to fix a single bug. My personal view is that mixing existing major-modes with tree-sitter represents absolutely the worst of all worlds. It maintains all existing complexities, provides us with very few benefits, and at the same time adds complexities we didn't use to have. To me, that's a net negative. Somewhat surprising to me, I see this is a somewhat controversial point of view and not as clear cut a matter as I would have expected it to be. I realize and respect that final decisions in these matter might take some time to mature. Time which given our current approach detracts from the momentum tree-sitter has been having. At this point poor Yuan Fu here has spent quite a bit of time and effort getting a core tree-sitter interface into Emacs. I would really hate to see all that effort be for nothing, because we end up conflating a creating a core tree-sitter feature with how this feature should best be employed in subsequent major-modes. So in the name of pragmatism, I propose a compromise of sorts. Instead of waiting for "every" major-mode to be re-implemented into a tree-sitter derivative in the feature/tree-sitter branch before we merge... How about we just accept the current "core" tree-sitter implementation as good enough, and consider merging that to git master as is. This will allow us to land one important mile-stone, while giving us the head-room to further discuss how we should best implement/reimplement/"upgrade" existing major-modes to take advantage of tree-sitter. It will also allow third-party packages to make use of tree-sitter in Emacs core instead coming up with its own implementation, beginning a defacto standardization of this new API (which I may note already has a competing implementation in MELPA). That is to say: We should land the core library, with holding it hostage to all its possible consumers being implemented. How about it? Are there any good arguments for NOT merging feature/tree-sitter at this point? :) -- Kind regards *Jostein Kjønigsen* jostein@kjonigsen.net 🍵 jostein@gmail.com https://jostein.kjønigsen.no <https://jostein.kjønigsen.no> On 16.11.2022 21:45, Yuan Fu wrote: > So I’m trying to merge css-ts-mode with css-mode. Scss-mode inherits css-mode, but if user enables tree-sitter for css-mode, scss-mode will inherit all that tree-sitter setup, and lose all the native css setup. Then if a user doesn’t want to enable tree-sitter in scss-mode, too bad: scss-mode breaks. > > Essentially scss-mode needs to be able to control which parts of css-mode’s setup it wants to inherit—native setup or tree-sitter setup—regardless of whether css-mode enables tree-sitter or not. > > I wonder if we can do something like this: > > css-mode > | > +---------+-----+-----------+ > | | | > css-native-mode css-ts-mode scss-mode > | > +----+------------+ > | | > scss-native-mode scss-ts-mode > > css-mode: a virtual mode, only sets up basic things that both native and tree-sitter mode needs, like comment-start. > css-native-mode: native setup > css-ts-mode: tree-sitter setup > > scss-mode: a virtual mode, inherits css-mode > scss-native-mode: native setup > scss-ts-mode: tree-sitter setup > > And user could use major-mode-remap-alist to choose which mode they want: > > (css-mode . css-ts-mode) for enabling tree-sitter > (css-mode . css-native-mode) for not enabling tree-sitter > > This could also used for other modes, like c-mode: c-mode, c-native-mode (cc-mode), c-ts-mode. > > Yuan [-- Attachment #2: Type: text/html, Size: 5607 bytes --] ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-18 21:54 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Jostein Kjønigsen @ 2022-11-18 22:34 ` Philip Kaludercic 2022-11-18 22:58 ` Yuan Fu 2022-11-19 8:29 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Eli Zaretskii 2022-11-18 22:52 ` Yuan Fu 2022-11-19 8:16 ` Eli Zaretskii 2 siblings, 2 replies; 60+ messages in thread From: Philip Kaludercic @ 2022-11-18 22:34 UTC (permalink / raw) To: Jostein Kjønigsen Cc: Yuan Fu, emacs-devel, Theodor Thornhill, Eli Zaretskii, jostein Jostein Kjønigsen <jostein@secure.kjonigsen.net> writes: > Instead of waiting for "every" major-mode to be re-implemented into a > tree-sitter derivative in the feature/tree-sitter branch before we > merge... How about we just accept the current "core" tree-sitter > implementation as good enough, and consider merging that to git master > as is. I think this sounds like a good idea -- as someone who has mostly just been following the discussions. The core bindings and major modes that are based on these are separate issues, with a clear dependency linked them. As an aside: This might also be a good opportunity to clean up some of the current major mode implementations and make them more consistent. The issue with custom options to enable tree-sitter for every major mode has revealed an inherent duplication of features. There are other inconsistencies, especially regarding bindings for equivalent operations (e.g. in interpreted language with a repl, how to load function into the current session: Lisp, Prolog, Python all differ in minor details). I can imagine a more specialised `define-generic-mode' could be of use here, along with more "abstract" major modes for various types of programming languages (using `prog-mode' as a base to add `compiled-prog-mode' that has generic commands for building program, `interpreted-prog-mode' that has generic commands for REPL communication, ...), where the tree-sitter configuration would be one of the attributes these modes would specify. [...] > How about it? Are there any good arguments for NOT merging > feature/tree-sitter at this point? :) The current branch has major modes, should these be deleted before merging? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-18 22:34 ` Philip Kaludercic @ 2022-11-18 22:58 ` Yuan Fu 2022-11-18 23:36 ` Stefan Monnier 2022-11-19 7:09 ` Philip Kaludercic 2022-11-19 8:29 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Eli Zaretskii 1 sibling, 2 replies; 60+ messages in thread From: Yuan Fu @ 2022-11-18 22:58 UTC (permalink / raw) To: Philip Kaludercic Cc: Jostein Kjønigsen, emacs-devel, Theodor Thornhill, Eli Zaretskii, jostein > On Nov 18, 2022, at 2:34 PM, Philip Kaludercic <philipk@posteo.net> wrote: > > Jostein Kjønigsen <jostein@secure.kjonigsen.net> writes: > >> Instead of waiting for "every" major-mode to be re-implemented into a >> tree-sitter derivative in the feature/tree-sitter branch before we >> merge... How about we just accept the current "core" tree-sitter >> implementation as good enough, and consider merging that to git master >> as is. > > I think this sounds like a good idea -- as someone who has mostly just > been following the discussions. The core bindings and major modes that > are based on these are separate issues, with a clear dependency linked > them. > > As an aside: This might also be a good opportunity to clean up some of > the current major mode implementations and make them more consistent. > The issue with custom options to enable tree-sitter for every major mode > has revealed an inherent duplication of features. There are other > inconsistencies, especially regarding bindings for equivalent operations > (e.g. in interpreted language with a repl, how to load function into the > current session: Lisp, Prolog, Python all differ in minor details). I’ve though of this too, other things are indent level, and documentation. I wrote ghelp[1] to get a uniform interface for getting documentation in different major modes (because I don’t have the heart to understand and modify help.el). A builtin, unified documentation system would be nice, like eldoc. But eldoc is for at-point short and quick signature/doc more than for full-fledged documentation like help.el. > I can imagine a more specialised `define-generic-mode' could be of use > here, along with more "abstract" major modes for various types of > programming languages (using `prog-mode' as a base to add > `compiled-prog-mode' that has generic commands for building program, > `interpreted-prog-mode' that has generic commands for REPL > communication, ...), where the tree-sitter configuration would be one of > the attributes these modes would specify. Sounds nice. Though what do you mean by “one of the attributes”? >> How about it? Are there any good arguments for NOT merging >> feature/tree-sitter at this point? :) > > The current branch has major modes, should these be deleted before > merging? I think they can stay, we’ll work on them and improve them before branch is cut. Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-18 22:58 ` Yuan Fu @ 2022-11-18 23:36 ` Stefan Monnier 2022-11-19 7:09 ` Philip Kaludercic 1 sibling, 0 replies; 60+ messages in thread From: Stefan Monnier @ 2022-11-18 23:36 UTC (permalink / raw) To: Yuan Fu Cc: Philip Kaludercic, Jostein Kjønigsen, emacs-devel, Theodor Thornhill, Eli Zaretskii, jostein > I’ve though of this too, other things are indent level, and > documentation. I wrote ghelp[1] to get a uniform interface for getting > documentation in different major modes (because I don’t have the heart to > understand and modify help.el). A builtin, unified documentation system > would be nice, like eldoc. But eldoc is for at-point short and quick > signature/doc more than for full-fledged documentation like help.el. help.el does it specifically for ELisp and doesn't try to present a language-independent interface for other languages. We could/should change that, but I agree that it's not easy. We may want to extract some of that code to make it available for other uses, but I suspect it will be a small part of it. In that vicinity there is also `info-lookup-symbol` (aka `C-h S`) and `xref.el`. Stefan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-18 22:58 ` Yuan Fu 2022-11-18 23:36 ` Stefan Monnier @ 2022-11-19 7:09 ` Philip Kaludercic 2022-11-19 14:07 ` Standardized access to a REPL (was: Suggesting that feature/tree-sitter be merged) Stefan Monnier 1 sibling, 1 reply; 60+ messages in thread From: Philip Kaludercic @ 2022-11-19 7:09 UTC (permalink / raw) To: Yuan Fu Cc: Jostein Kjønigsen, emacs-devel, Theodor Thornhill, Eli Zaretskii, jostein Yuan Fu <casouri@gmail.com> writes: >> On Nov 18, 2022, at 2:34 PM, Philip Kaludercic <philipk@posteo.net> wrote: >> >> Jostein Kjønigsen <jostein@secure.kjonigsen.net> writes: >> >>> Instead of waiting for "every" major-mode to be re-implemented into a >>> tree-sitter derivative in the feature/tree-sitter branch before we >>> merge... How about we just accept the current "core" tree-sitter >>> implementation as good enough, and consider merging that to git master >>> as is. >> >> I think this sounds like a good idea -- as someone who has mostly just >> been following the discussions. The core bindings and major modes that >> are based on these are separate issues, with a clear dependency linked >> them. >> >> As an aside: This might also be a good opportunity to clean up some of >> the current major mode implementations and make them more consistent. >> The issue with custom options to enable tree-sitter for every major mode >> has revealed an inherent duplication of features. There are other >> inconsistencies, especially regarding bindings for equivalent operations >> (e.g. in interpreted language with a repl, how to load function into the >> current session: Lisp, Prolog, Python all differ in minor details). > > I’ve though of this too, other things are indent level, and > documentation. I wrote ghelp[1] to get a uniform interface for getting > documentation in different major modes (because I don’t have the heart > to understand and modify help.el). A builtin, unified documentation > system would be nice, like eldoc. But eldoc is for at-point short and > quick signature/doc more than for full-fledged documentation like > help.el. I suppose you forgot the link: https://github.com/casouri/ghelp. Perhaps it could be added to ELPA, and one day to the core? >> I can imagine a more specialised `define-generic-mode' could be of use >> here, along with more "abstract" major modes for various types of >> programming languages (using `prog-mode' as a base to add >> `compiled-prog-mode' that has generic commands for building program, >> `interpreted-prog-mode' that has generic commands for REPL >> communication, ...), where the tree-sitter configuration would be one of >> the attributes these modes would specify. > > Sounds nice. Though what do you mean by “one of the attributes”? If we think of this as a declarative block, something like (define-prog-mode foo :type 'compiled :syntax (tree-sitter-syntax 'foo) :doc-func #'foo-get-docs ...) would have a list of attributes (what kind of a programming language, how to indent, how to fetch documentation, ...), one of which would be how syntax and fontification is calculated. >>> How about it? Are there any good arguments for NOT merging >>> feature/tree-sitter at this point? :) >> >> The current branch has major modes, should these be deleted before >> merging? > > I think they can stay, we’ll work on them and improve them before branch is cut. Ok, sounds good. > Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Standardized access to a REPL (was: Suggesting that feature/tree-sitter be merged) 2022-11-19 7:09 ` Philip Kaludercic @ 2022-11-19 14:07 ` Stefan Monnier 2022-11-19 15:03 ` Standardized access to a REPL Philip Kaludercic 0 siblings, 1 reply; 60+ messages in thread From: Stefan Monnier @ 2022-11-19 14:07 UTC (permalink / raw) To: Philip Kaludercic Cc: Yuan Fu, Jostein Kjønigsen, emacs-devel, Theodor Thornhill, Eli Zaretskii, jostein [-- Attachment #1: Type: text/plain, Size: 933 bytes --] >>> `compiled-prog-mode' that has generic commands for building program, >>> `interpreted-prog-mode' that has generic commands for REPL [...] > (define-prog-mode foo > :type 'compiled <soapbox> Let me point out that the idea that some languages are compiled and others are interpreted is bogus. This is a property of a language's *implementation* and not of the language per se. And of course, here we don't even really care about this facet of the implementation: you're using those terms as a proxy for whether we use a REPL or a batch-compiler. </soapbox> Many languages have both REPLs and batch compilers (like, say ELisp), so a major mode needs to be able to offer access to both functionalities at the same time. Regarding the original suggestion to provide a uniform access to a REPL, I started on this a long time ago, but never got it "finished" :-( I attached what I still have of that effort. Stefan [-- Attachment #2: prog-proc.el --] [-- Type: application/emacs-lisp, Size: 13137 bytes --] ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Standardized access to a REPL 2022-11-19 14:07 ` Standardized access to a REPL (was: Suggesting that feature/tree-sitter be merged) Stefan Monnier @ 2022-11-19 15:03 ` Philip Kaludercic 2022-11-19 16:07 ` Stefan Monnier 0 siblings, 1 reply; 60+ messages in thread From: Philip Kaludercic @ 2022-11-19 15:03 UTC (permalink / raw) To: Stefan Monnier Cc: Yuan Fu, Jostein Kjønigsen, emacs-devel, Theodor Thornhill, Eli Zaretskii, jostein Stefan Monnier <monnier@iro.umontreal.ca> writes: >>>> `compiled-prog-mode' that has generic commands for building program, >>>> `interpreted-prog-mode' that has generic commands for REPL > [...] >> (define-prog-mode foo >> :type 'compiled > > <soapbox> > Let me point out that the idea that some languages are compiled and > others are interpreted is bogus. This is a property of a language's > *implementation* and not of the language per se. > And of course, here we don't even really care about this facet of the > implementation: you're using those terms as a proxy for whether we use > a REPL or a batch-compiler. > </soapbox> > > Many languages have both REPLs and batch compilers (like, say ELisp), so > a major mode needs to be able to offer access to both functionalities at > the same time. Good point, that also indicates that that using `derive-major-mode' is not the right approach, because (AFAIK) major modes span a tree, not a DAG. Perhaps it would be better to extend prog-mode and bind keys in the default map that call methods with the current major mode. These can then either implement the methods or indicate that the feature (evaluating in a REPL when using C) is not supported. > Regarding the original suggestion to provide a uniform access to a REPL, > I started on this a long time ago, but never got it "finished" :-( > I attached what I still have of that effort. Sounds interesting, I'll take a look at it. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Standardized access to a REPL 2022-11-19 15:03 ` Standardized access to a REPL Philip Kaludercic @ 2022-11-19 16:07 ` Stefan Monnier 2022-11-19 16:10 ` Philip Kaludercic 0 siblings, 1 reply; 60+ messages in thread From: Stefan Monnier @ 2022-11-19 16:07 UTC (permalink / raw) To: Philip Kaludercic Cc: Yuan Fu, Jostein Kjønigsen, emacs-devel, Theodor Thornhill, Eli Zaretskii, jostein > Perhaps it would be better to extend prog-mode and bind keys in the > default map that call methods with the current major mode. Agreed. [ And my muscle memory says that `C-c C-c` should be used for "send this buffer to its natural destination". ] Stefan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Standardized access to a REPL 2022-11-19 16:07 ` Stefan Monnier @ 2022-11-19 16:10 ` Philip Kaludercic 2022-11-19 16:18 ` Eli Zaretskii 0 siblings, 1 reply; 60+ messages in thread From: Philip Kaludercic @ 2022-11-19 16:10 UTC (permalink / raw) To: Stefan Monnier Cc: Yuan Fu, Jostein Kjønigsen, emacs-devel, Theodor Thornhill, Eli Zaretskii, jostein Stefan Monnier <monnier@iro.umontreal.ca> writes: >> Perhaps it would be better to extend prog-mode and bind keys in the >> default map that call methods with the current major mode. > > Agreed. > [ And my muscle memory says that `C-c C-c` should be used for "send this > buffer to its natural destination". ] I don't know if some a thing is even practical, but I'd want to bind C-c C-c to a generalised `do-what-i-mean' command that is context sensitive, and even bound globally. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Standardized access to a REPL 2022-11-19 16:10 ` Philip Kaludercic @ 2022-11-19 16:18 ` Eli Zaretskii 2022-11-19 22:31 ` Stefan Monnier 0 siblings, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 16:18 UTC (permalink / raw) To: Philip Kaludercic; +Cc: monnier, casouri, jostein, emacs-devel, theo, jostein > From: Philip Kaludercic <philipk@posteo.net> > Cc: Yuan Fu <casouri@gmail.com>, Jostein Kjønigsen > <jostein@secure.kjonigsen.net>, emacs-devel <emacs-devel@gnu.org>, > Theodor Thornhill <theo@thornhill.no>, Eli Zaretskii <eliz@gnu.org>, > jostein@kjonigsen.net > Date: Sat, 19 Nov 2022 16:10:58 +0000 > > I don't know if some a thing is even practical, but I'd want to bind C-c > C-c to a generalised `do-what-i-mean' command that is context sensitive, > and even bound globally. "C-c C-c" doesn't mean DWIM, it means "I'm done with whatever I was doing, use the result as appropriate". ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Standardized access to a REPL 2022-11-19 16:18 ` Eli Zaretskii @ 2022-11-19 22:31 ` Stefan Monnier 2022-11-20 9:25 ` Philip Kaludercic 0 siblings, 1 reply; 60+ messages in thread From: Stefan Monnier @ 2022-11-19 22:31 UTC (permalink / raw) To: Eli Zaretskii Cc: Philip Kaludercic, casouri, jostein, emacs-devel, theo, jostein > "C-c C-c" doesn't mean DWIM, it means "I'm done with whatever I was > doing, use the result as appropriate". I agree, and I suspect Philip agrees as well :-) Stefan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Standardized access to a REPL 2022-11-19 22:31 ` Stefan Monnier @ 2022-11-20 9:25 ` Philip Kaludercic 0 siblings, 0 replies; 60+ messages in thread From: Philip Kaludercic @ 2022-11-20 9:25 UTC (permalink / raw) To: Stefan Monnier Cc: Eli Zaretskii, casouri, jostein, emacs-devel, theo, jostein Stefan Monnier <monnier@iro.umontreal.ca> writes: >> "C-c C-c" doesn't mean DWIM, it means "I'm done with whatever I was >> doing, use the result as appropriate". > > I agree, and I suspect Philip agrees as well :-) Yes, I didn't phrase that perfectly. What I had in mind was Org's usage of C-c C-c that is context sensitive. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-18 22:34 ` Philip Kaludercic 2022-11-18 22:58 ` Yuan Fu @ 2022-11-19 8:29 ` Eli Zaretskii 2022-11-19 10:46 ` Philip Kaludercic 1 sibling, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 8:29 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jostein, casouri, emacs-devel, theo, jostein > From: Philip Kaludercic <philipk@posteo.net> > Cc: Yuan Fu <casouri@gmail.com>, emacs-devel <emacs-devel@gnu.org>, > Theodor Thornhill <theo@thornhill.no>, Eli Zaretskii <eliz@gnu.org>, > jostein@kjonigsen.net > Date: Fri, 18 Nov 2022 22:34:13 +0000 > > Jostein Kjønigsen <jostein@secure.kjonigsen.net> writes: > > > Instead of waiting for "every" major-mode to be re-implemented into a > > tree-sitter derivative in the feature/tree-sitter branch before we > > merge... How about we just accept the current "core" tree-sitter > > implementation as good enough, and consider merging that to git master > > as is. > > I think this sounds like a good idea -- as someone who has mostly just > been following the discussions. The core bindings and major modes that > are based on these are separate issues, with a clear dependency linked > them. From where I stand, it makes very little sense to release Emacs 29 with tree-sitter support that is limited to primitives and some minimal Lisp glue on top of that. Tree-sitter was added to Emacs to allow major modes provide better support for editing program source code, so having tree-sitter "support" in Emacs 29 that didn't include at least several major modes using it would be disappointing at best. It would mean we ourselves have no idea how to make major modes use the feature. Moreover, adding those few major modes on the branch exposed several deficiencies in the original design and implementation, and required changes to make the integration better; releasing Emacs 29 with those issues unresolved (and unknown) would require significant, sometimes incompatible changes in the future, which is another reason why it would be wrong. Basically, my firm belief is that adding to Emacs infrastructure without user-level applications built on that infrastructure is wrong and runs the risk of producing features that are not used or need deep surgery before they become useful. We should avoid doing that as much as possible. > As an aside: This might also be a good opportunity to clean up some of > the current major mode implementations and make them more consistent. > The issue with custom options to enable tree-sitter for every major mode > has revealed an inherent duplication of features. There are other > inconsistencies, especially regarding bindings for equivalent operations > (e.g. in interpreted language with a repl, how to load function into the > current session: Lisp, Prolog, Python all differ in minor details). Cleaning up major modes is a Good Thing that needs no opportunities. We should do that whenever we know and agree how. > The current branch has major modes, should these be deleted before > merging? Definitely not! These modes are there because we want Emacs 29 to have them, and we want users to use them and report back. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 8:29 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Eli Zaretskii @ 2022-11-19 10:46 ` Philip Kaludercic 2022-11-19 11:36 ` Eli Zaretskii 2022-11-19 21:34 ` Dmitry Gutov 0 siblings, 2 replies; 60+ messages in thread From: Philip Kaludercic @ 2022-11-19 10:46 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jostein, casouri, emacs-devel, theo, jostein Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: Yuan Fu <casouri@gmail.com>, emacs-devel <emacs-devel@gnu.org>, >> Theodor Thornhill <theo@thornhill.no>, Eli Zaretskii <eliz@gnu.org>, >> jostein@kjonigsen.net >> Date: Fri, 18 Nov 2022 22:34:13 +0000 >> >> Jostein Kjønigsen <jostein@secure.kjonigsen.net> writes: >> >> > Instead of waiting for "every" major-mode to be re-implemented into a >> > tree-sitter derivative in the feature/tree-sitter branch before we >> > merge... How about we just accept the current "core" tree-sitter >> > implementation as good enough, and consider merging that to git master >> > as is. >> >> I think this sounds like a good idea -- as someone who has mostly just >> been following the discussions. The core bindings and major modes that >> are based on these are separate issues, with a clear dependency linked >> them. > > From where I stand, it makes very little sense to release Emacs 29 > with tree-sitter support that is limited to primitives and some > minimal Lisp glue on top of that. Tree-sitter was added to Emacs to > allow major modes provide better support for editing program source > code, so having tree-sitter "support" in Emacs 29 that didn't include > at least several major modes using it would be disappointing at best. > It would mean we ourselves have no idea how to make major modes use > the feature. Moreover, adding those few major modes on the branch > exposed several deficiencies in the original design and > implementation, and required changes to make the integration better; > releasing Emacs 29 with those issues unresolved (and unknown) would > require significant, sometimes incompatible changes in the future, > which is another reason why it would be wrong. > > Basically, my firm belief is that adding to Emacs infrastructure > without user-level applications built on that infrastructure is wrong > and runs the risk of producing features that are not used or need deep > surgery before they become useful. We should avoid doing that as much > as possible. My question is, do these user-level applications have to be distributed along with Emacs, or could they be made to be "explicitly" opt-in by installing them from ELPA. In-core appears to usually bring a commitment to maintain a library, and deprecating can take years. If Emacs 29 lays the technical foundations, the low-level API for treesitter to work, we can have packages on ELPA experiment with the higher-level abstractions. Whatever is the most successful approach, can be added to Emacs later on. >> As an aside: This might also be a good opportunity to clean up some of >> the current major mode implementations and make them more consistent. >> The issue with custom options to enable tree-sitter for every major mode >> has revealed an inherent duplication of features. There are other >> inconsistencies, especially regarding bindings for equivalent operations >> (e.g. in interpreted language with a repl, how to load function into the >> current session: Lisp, Prolog, Python all differ in minor details). > > Cleaning up major modes is a Good Thing that needs no opportunities. > We should do that whenever we know and agree how. Fair enough, but just as above I think these kinds of experiments are better made outside of the core, in ELPA, to avoid committing to mistakes. If it works out, it can be added. >> The current branch has major modes, should these be deleted before >> merging? > > Definitely not! These modes are there because we want Emacs 29 to > have them, and we want users to use them and report back. IIUC these modes aren't ripe yet, or at least aren't satisfying replacements for the existing modes. If tree-sitter were not to be merged for that reason, that would delay the ability to use tree-sitter on a widespread basis for at least another release. My proposal above would make it possible, and encourage users to report on their experience, while allowing for the flexibility to make the right decisions in the long term. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 10:46 ` Philip Kaludercic @ 2022-11-19 11:36 ` Eli Zaretskii 2022-11-19 12:15 ` Philip Kaludercic 2022-11-19 21:34 ` Dmitry Gutov 1 sibling, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 11:36 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jostein, casouri, emacs-devel, theo, jostein > From: Philip Kaludercic <philipk@posteo.net> > Cc: jostein@secure.kjonigsen.net, casouri@gmail.com, emacs-devel@gnu.org, > theo@thornhill.no, jostein@kjonigsen.net > Date: Sat, 19 Nov 2022 10:46:41 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > > From where I stand, it makes very little sense to release Emacs 29 > > with tree-sitter support that is limited to primitives and some > > minimal Lisp glue on top of that. Tree-sitter was added to Emacs to > > allow major modes provide better support for editing program source > > code, so having tree-sitter "support" in Emacs 29 that didn't include > > at least several major modes using it would be disappointing at best. > > It would mean we ourselves have no idea how to make major modes use > > the feature. Moreover, adding those few major modes on the branch > > exposed several deficiencies in the original design and > > implementation, and required changes to make the integration better; > > releasing Emacs 29 with those issues unresolved (and unknown) would > > require significant, sometimes incompatible changes in the future, > > which is another reason why it would be wrong. > > > > Basically, my firm belief is that adding to Emacs infrastructure > > without user-level applications built on that infrastructure is wrong > > and runs the risk of producing features that are not used or need deep > > surgery before they become useful. We should avoid doing that as much > > as possible. > > My question is, do these user-level applications have to be distributed > along with Emacs, or could they be made to be "explicitly" opt-in by > installing them from ELPA. It depends, the decision should be on a case by case basis, IMO. For functionality that is part of what we want Emacs to have, yes, it should be distributed with Emacs. > In-core appears to usually bring a commitment to maintain a library, > and deprecating can take years. If Emacs 29 lays the technical > foundations, the low-level API for treesitter to work, we can have > packages on ELPA experiment with the higher-level abstractions. > Whatever is the most successful approach, can be added to Emacs > later on. Emacs cannot come without support for important programming languages, that would make no sense. If we want to move towards tree-sitter as the basis for some aspects of such major modes, we must have this in core. Having such important parts of Emacs in ELPA when we don't have a way of bundling ELPA packages with an Emacs release tarball means a deficiency in released versions of Emacs, so we should not go that way. I don't see why what was done on the branch with introducing tree-sitter capabilities into major modes should be considered "experiments", let alone not "successful". What parts of that concretely do you think belong to these categories, and why? More generally, why should we be afraid of including new stuff in Emacs, and instead designate it "experimental" and put it on ELPA? We never did that in the past, and I don't see why would we want that now or in the future. ELPA is not a platform for "experiments" in Emacs development; the master branch and the feature branches are that platform. > >> As an aside: This might also be a good opportunity to clean up some of > >> the current major mode implementations and make them more consistent. > >> The issue with custom options to enable tree-sitter for every major mode > >> has revealed an inherent duplication of features. There are other > >> inconsistencies, especially regarding bindings for equivalent operations > >> (e.g. in interpreted language with a repl, how to load function into the > >> current session: Lisp, Prolog, Python all differ in minor details). > > > > Cleaning up major modes is a Good Thing that needs no opportunities. > > We should do that whenever we know and agree how. > > Fair enough, but just as above I think these kinds of experiments are > better made outside of the core, in ELPA, to avoid committing to > mistakes. If it works out, it can be added. No, we should do that on feature branches, not on ELPA. Certainly so for changes that require changes on the C level. Again, ELPA is not a place where we should develop Emacs. > >> The current branch has major modes, should these be deleted before > >> merging? > > > > Definitely not! These modes are there because we want Emacs 29 to > > have them, and we want users to use them and report back. > > IIUC these modes aren't ripe yet, or at least aren't satisfying > replacements for the existing modes. What concretely isn't ripe? And please note that Emacs 29 won't be released tomorrow or the next week. We have the whole release cycle ahead of us to figure out what is not yet ripe for a release and either fix that or (in extreme cases) remove that from Emacs. I see no reason to make these decisions today. We used the feature branch for initial shakeup and stabilization, and we now think the tree-sitter support is mature enough to let more people use it and provide their feedback. > If tree-sitter were not to be merged for that reason, that would > delay the ability to use tree-sitter on a widespread basis for at > least another release. My proposal above would make it possible, > and encourage users to report on their experience, while allowing > for the flexibility to make the right decisions in the long term. If that was your reasoning, then I think you are three steps ahead of where we are, and you are trying to find solutions for problems that don't necessarily exist. We should see what concrete problems are left after the merge, and take it from there. We have ample time for figuring that out and fixing whatever will need fixing. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 11:36 ` Eli Zaretskii @ 2022-11-19 12:15 ` Philip Kaludercic 2022-11-19 13:05 ` Eli Zaretskii 0 siblings, 1 reply; 60+ messages in thread From: Philip Kaludercic @ 2022-11-19 12:15 UTC (permalink / raw) To: Eli Zaretskii; +Cc: jostein, casouri, emacs-devel, theo, jostein Eli Zaretskii <eliz@gnu.org> writes: >> From: Philip Kaludercic <philipk@posteo.net> >> Cc: jostein@secure.kjonigsen.net, casouri@gmail.com, emacs-devel@gnu.org, >> theo@thornhill.no, jostein@kjonigsen.net >> Date: Sat, 19 Nov 2022 10:46:41 +0000 >> >> Eli Zaretskii <eliz@gnu.org> writes: >> >> > From where I stand, it makes very little sense to release Emacs 29 >> > with tree-sitter support that is limited to primitives and some >> > minimal Lisp glue on top of that. Tree-sitter was added to Emacs to >> > allow major modes provide better support for editing program source >> > code, so having tree-sitter "support" in Emacs 29 that didn't include >> > at least several major modes using it would be disappointing at best. >> > It would mean we ourselves have no idea how to make major modes use >> > the feature. Moreover, adding those few major modes on the branch >> > exposed several deficiencies in the original design and >> > implementation, and required changes to make the integration better; >> > releasing Emacs 29 with those issues unresolved (and unknown) would >> > require significant, sometimes incompatible changes in the future, >> > which is another reason why it would be wrong. >> > >> > Basically, my firm belief is that adding to Emacs infrastructure >> > without user-level applications built on that infrastructure is wrong >> > and runs the risk of producing features that are not used or need deep >> > surgery before they become useful. We should avoid doing that as much >> > as possible. >> >> My question is, do these user-level applications have to be distributed >> along with Emacs, or could they be made to be "explicitly" opt-in by >> installing them from ELPA. > > It depends, the decision should be on a case by case basis, IMO. For > functionality that is part of what we want Emacs to have, yes, it > should be distributed with Emacs. > >> In-core appears to usually bring a commitment to maintain a library, >> and deprecating can take years. If Emacs 29 lays the technical >> foundations, the low-level API for treesitter to work, we can have >> packages on ELPA experiment with the higher-level abstractions. >> Whatever is the most successful approach, can be added to Emacs >> later on. > > Emacs cannot come without support for important programming languages, > that would make no sense. If we want to move towards tree-sitter as > the basis for some aspects of such major modes, we must have this in > core. Having such important parts of Emacs in ELPA when we don't have > a way of bundling ELPA packages with an Emacs release tarball means a > deficiency in released versions of Emacs, so we should not go that > way. > > I don't see why what was done on the branch with introducing > tree-sitter capabilities into major modes should be considered > "experiments", let alone not "successful". What parts of that > concretely do you think belong to these categories, and why? > > More generally, why should we be afraid of including new stuff in > Emacs, and instead designate it "experimental" and put it on ELPA? We > never did that in the past, and I don't see why would we want that now > or in the future. ELPA is not a platform for "experiments" in Emacs > development; the master branch and the feature branches are that > platform. > >> >> As an aside: This might also be a good opportunity to clean up some of >> >> the current major mode implementations and make them more consistent. >> >> The issue with custom options to enable tree-sitter for every major mode >> >> has revealed an inherent duplication of features. There are other >> >> inconsistencies, especially regarding bindings for equivalent operations >> >> (e.g. in interpreted language with a repl, how to load function into the >> >> current session: Lisp, Prolog, Python all differ in minor details). >> > >> > Cleaning up major modes is a Good Thing that needs no opportunities. >> > We should do that whenever we know and agree how. >> >> Fair enough, but just as above I think these kinds of experiments are >> better made outside of the core, in ELPA, to avoid committing to >> mistakes. If it works out, it can be added. > > No, we should do that on feature branches, not on ELPA. Certainly so > for changes that require changes on the C level. > > Again, ELPA is not a place where we should develop Emacs. > >> >> The current branch has major modes, should these be deleted before >> >> merging? >> > >> > Definitely not! These modes are there because we want Emacs 29 to >> > have them, and we want users to use them and report back. >> >> IIUC these modes aren't ripe yet, or at least aren't satisfying >> replacements for the existing modes. > > What concretely isn't ripe? Jostein said: Me and Theodor faced these same issues with "our" C# and TypeScript major-modes, and the only "clean" way we agreed we could make this work was to create wholly new implementations. I can come up with many good, objective reasons for this, but I think Theodor has already represented this view fairly well. > And please note that Emacs 29 won't be released tomorrow or the next > week. We have the whole release cycle ahead of us to figure out what > is not yet ripe for a release and either fix that or (in extreme > cases) remove that from Emacs. I see no reason to make these > decisions today. We used the feature branch for initial shakeup and > stabilization, and we now think the tree-sitter support is mature > enough to let more people use it and provide their feedback. Naturally, I didn't understand this to be a discussion on an immediate decision. >> If tree-sitter were not to be merged for that reason, that would >> delay the ability to use tree-sitter on a widespread basis for at >> least another release. My proposal above would make it possible, >> and encourage users to report on their experience, while allowing >> for the flexibility to make the right decisions in the long term. > > If that was your reasoning, then I think you are three steps ahead of > where we are, and you are trying to find solutions for problems that > don't necessarily exist. We should see what concrete problems are > left after the merge, and take it from there. We have ample time for > figuring that out and fixing whatever will need fixing. You are right, I'll have to test the branch more seriously. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 12:15 ` Philip Kaludercic @ 2022-11-19 13:05 ` Eli Zaretskii 0 siblings, 0 replies; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 13:05 UTC (permalink / raw) To: Philip Kaludercic; +Cc: jostein, casouri, emacs-devel, theo, jostein > From: Philip Kaludercic <philipk@posteo.net> > Cc: jostein@secure.kjonigsen.net, casouri@gmail.com, emacs-devel@gnu.org, > theo@thornhill.no, jostein@kjonigsen.net > Date: Sat, 19 Nov 2022 12:15:10 +0000 > > >> IIUC these modes aren't ripe yet, or at least aren't satisfying > >> replacements for the existing modes. > > > > What concretely isn't ripe? > > Jostein said: > > Me and Theodor faced these same issues with "our" C# and TypeScript > major-modes, and the only "clean" way we agreed we could make this > work was to create wholly new implementations. I can come up with many > good, objective reasons for this, but I think Theodor has already > represented this view fairly well. That's Jostein's opinion. We've heard it before, and AFAIU the branch addresses these problems in ways that at least to me look adequate and consistent with how I'd like to see this feature in Emacs 29. In particular, the TypeScript mode in the branch is indeed a separate mode. Any other problems that will be flagged before the release we will handle when they pop up. > > If that was your reasoning, then I think you are three steps ahead of > > where we are, and you are trying to find solutions for problems that > > don't necessarily exist. We should see what concrete problems are > > left after the merge, and take it from there. We have ample time for > > figuring that out and fixing whatever will need fixing. > > You are right, I'll have to test the branch more seriously. Thanks. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 10:46 ` Philip Kaludercic 2022-11-19 11:36 ` Eli Zaretskii @ 2022-11-19 21:34 ` Dmitry Gutov 1 sibling, 0 replies; 60+ messages in thread From: Dmitry Gutov @ 2022-11-19 21:34 UTC (permalink / raw) To: Philip Kaludercic, Eli Zaretskii Cc: jostein, casouri, emacs-devel, theo, jostein On 19.11.2022 12:46, Philip Kaludercic wrote: > My question is, do these user-level applications have to be distributed > along with Emacs, or could they be made to be "explicitly" opt-in by > installing them from ELPA. In-core appears to usually bring a > commitment to maintain a library, and deprecating can take years. If > Emacs 29 lays the technical foundations, the low-level API for > treesitter to work, we can have packages on ELPA experiment with the > higher-level abstractions. Whatever is the most successful approach, > can be added to Emacs later on. Wasn't https://github.com/emacs-tree-sitter/elisp-tree-sitter that way for us to experiment with approaches before bring TS to the core? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-18 21:54 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Jostein Kjønigsen 2022-11-18 22:34 ` Philip Kaludercic @ 2022-11-18 22:52 ` Yuan Fu 2022-11-19 5:21 ` Theodor Thornhill 2022-11-19 7:36 ` Stefan Kangas 2022-11-19 8:16 ` Eli Zaretskii 2 siblings, 2 replies; 60+ messages in thread From: Yuan Fu @ 2022-11-18 22:52 UTC (permalink / raw) To: jostein; +Cc: emacs-devel, Theodor Thornhill, Eli Zaretskii > On Nov 18, 2022, at 1:54 PM, Jostein Kjønigsen <jostein@secure.kjonigsen.net> wrote: > > Hey everyone. > > I know this has been said before, by people which by far has been contributing much more than me... But I still don't think it's a good idea to replace the implementation in existing major-modes with tree-sitter implementations, nor selectively activate tree-sitter in major-modes prone to inhetitence and derivation. > > Me and Theodor faced these same issues with "our" C# and TypeScript major-modes, and the only "clean" way we agreed we could make this work was to create wholly new implementations. I can come up with many good, objective reasons for this, but I think Theodor has already represented this view fairly well. > > While for the sake of brevity, I'll not diving deeply into this particular thing, I will say this: A new tree-sitter based major-mode free of compatibility concerns allowed us to create entirely new major-modes fixing most of our existing bugs, faster than we before would be able to fix a single bug. My personal view is that mixing existing major-modes with tree-sitter represents absolutely the worst of all worlds. It maintains all existing complexities, provides us with very few benefits, and at the same time adds complexities we didn't use to have. To me, that's a net negative. > > Somewhat surprising to me, I see this is a somewhat controversial point of view and not as clear cut a matter as I would have expected it to be. I realize and respect that final decisions in these matter might take some time to mature. Time which given our current approach detracts from the momentum tree-sitter has been having. Hey Jostein, Thank you very much for your thoughtful input! I originally thought of tree-sitter as merely a mean/tool that major modes could use to enhance their features. But in reality it seems that tree-sitter replaces a large enough chunk of a major-mode’s responsibility, which has caused all these compatibility problems we’ve encountered. Examples include undoing cc-mode’s setup when turning on tree-sitter, invalidating many existing major-mode variables, and the major mode inheritance problem I presented in the previous message. These difficulties has nudged us to decouple the tree-sitter and non-tree-sitter version further and further, from trying to make tree-sitter a feature that enables/disabled in a major mode by a command, to a major mode configuration that causes the major mode to setup differently, to my suggestion of using separate major mode but share a single virtual parent mode. I think using separate major mode but share a single virtual parent mode gets the benefit of both worlds: 1. Tree-sitter and non-tree-sitter are separated in different modes, meaning it gets all the benefit Jostein and Theo described. 2. Backward-compatible. Existing configuration to the non-tree-sitter version works as they do before. (Here I’m mainly thinking about hooks: Hooks added to c-mode-hook still runs in c-native-mode.) 3. Solves the inheritance problem I described. 4. Minimal changes to the existing modes. > At this point poor Yuan Fu here has spent quite a bit of time and effort getting a core tree-sitter interface into Emacs. I would really hate to see all that effort be for nothing, because we end up conflating a creating a core tree-sitter feature with how this feature should best be employed in subsequent major-modes. > > So in the name of pragmatism, I propose a compromise of sorts. > > Instead of waiting for "every" major-mode to be re-implemented into a tree-sitter derivative in the feature/tree-sitter branch before we merge... How about we just accept the current "core" tree-sitter implementation as good enough, and consider merging that to git master as is. > > This will allow us to land one important mile-stone, while giving us the head-room to further discuss how we should best implement/reimplement/"upgrade" existing major-modes to take advantage of tree-sitter. > > It will also allow third-party packages to make use of tree-sitter in Emacs core instead coming up with its own implementation, beginning a defacto standardization of this new API (which I may note already has a competing implementation in MELPA). > > That is to say: We should land the core library, with holding it hostage to all its possible consumers being implemented. > > How about it? Are there any good arguments for NOT merging feature/tree-sitter at this point? :) The good news is, feature/tree-sitter is merging in a few days! And we’ll make further improvements on the master. So rest assured! :-) I think we can at least get C, Python, Javascript, Typescript, Bash, JONS and CSS to go with the up coming release, largely thanks to Theo’s (and tree-sitter’s) productivity. I personally don’t know enough of C++ and Java to polish them, but they have a good chance too. Taking a step back, I think developing major mode support with the tree-sitter API is a good idea. We found countless shortcomings of the API when developing major modes with it. Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-18 22:52 ` Yuan Fu @ 2022-11-19 5:21 ` Theodor Thornhill 2022-11-19 18:35 ` Eli Zaretskii 2022-11-19 7:36 ` Stefan Kangas 1 sibling, 1 reply; 60+ messages in thread From: Theodor Thornhill @ 2022-11-19 5:21 UTC (permalink / raw) To: Yuan Fu, jostein; +Cc: emacs-devel, Eli Zaretskii >The good news is, feature/tree-sitter is merging in a few days! And we’ll make further improvements on the master. So rest assured! :-) I think we can at least get C, Python, Javascript, Typescript, Bash, JONS and CSS to go with the up coming release, largely thanks to Theo’s (and tree-sitter’s) productivity. I personally don’t know enough of C++ and Java to polish them, but they have a good chance too. Java should be good to - modulo some tweaks. I'm using it daily at work already :) > >Taking a step back, I think developing major mode support with the tree-sitter API is a good idea. We found countless shortcomings of the API when developing major modes with it. > >Yuan I don't think I have much more to add to this discussion than what I've already have been yapping on about for weeks ;) Looking forward to the merge! Theo ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 5:21 ` Theodor Thornhill @ 2022-11-19 18:35 ` Eli Zaretskii 2022-11-19 18:46 ` Theodor Thornhill 0 siblings, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 18:35 UTC (permalink / raw) To: Theodor Thornhill; +Cc: casouri, jostein, emacs-devel > Date: Sat, 19 Nov 2022 06:21:12 +0100 > From: Theodor Thornhill <theo@thornhill.no> > CC: emacs-devel <emacs-devel@gnu.org>, Eli Zaretskii <eliz@gnu.org> > > >The good news is, feature/tree-sitter is merging in a few days! And we’ll make further improvements on the master. So rest assured! :-) I think we can at least get C, Python, Javascript, Typescript, Bash, JONS and CSS to go with the up coming release, largely thanks to Theo’s (and tree-sitter’s) productivity. I personally don’t know enough of C++ and Java to polish them, but they have a good chance too. > > Java should be good to - modulo some tweaks. I'm using it daily at work already :) Btw, should we add C# to c-ts-mode.el? Or did we already discuss that and decided against? I don't remember, sorry. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 18:35 ` Eli Zaretskii @ 2022-11-19 18:46 ` Theodor Thornhill 2022-11-19 18:51 ` Eli Zaretskii 0 siblings, 1 reply; 60+ messages in thread From: Theodor Thornhill @ 2022-11-19 18:46 UTC (permalink / raw) To: Eli Zaretskii; +Cc: casouri, jostein, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> Date: Sat, 19 Nov 2022 06:21:12 +0100 >> From: Theodor Thornhill <theo@thornhill.no> >> CC: emacs-devel <emacs-devel@gnu.org>, Eli Zaretskii <eliz@gnu.org> >> >> >The good news is, feature/tree-sitter is merging in a few days! And >> >we’ll make further improvements on the master. So rest assured! :-) >> >I think we can at least get C, Python, Javascript, Typescript, Bash, >> >JONS and CSS to go with the up coming release, largely thanks to >> >Theo’s (and tree-sitter’s) productivity. I personally don’t know >> >enough of C++ and Java to polish them, but they have a good chance >> >too. >> >> Java should be good to - modulo some tweaks. I'm using it daily at work already :) > > Btw, should we add C# to c-ts-mode.el? Or did we already discuss that and > decided against? I don't remember, sorry. I don't think we decided against, and we didn't really discuss it. IIRC your "challenge" was for the cc modes already included in emacs, and C# is not that. But seeing how there's a functioning cc-based c#-mode, I could tweak that to include both. The Cc mode variant is very stable and have been for some time already. There's no need to maintain the one in ELPA, and as I'm the author of it I think we can merge both? So we can have in-tree support for c# whether or not you have tree-sitter enabled? I can whip up a patch for that if you want, or we could just add the tree-sitter variant. In any case, I think c#-mode should probably not be inside of c-ts-mode, considering that it's not a superset of C, like C++, but its own entity. What do you think? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 18:46 ` Theodor Thornhill @ 2022-11-19 18:51 ` Eli Zaretskii 2022-11-19 18:59 ` Theodor Thornhill 0 siblings, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 18:51 UTC (permalink / raw) To: Theodor Thornhill; +Cc: casouri, jostein, emacs-devel > From: Theodor Thornhill <theo@thornhill.no> > Cc: casouri@gmail.com, jostein@kjonigsen.net, emacs-devel@gnu.org > Date: Sat, 19 Nov 2022 19:46:07 +0100 > > Eli Zaretskii <eliz@gnu.org> writes: > > > Btw, should we add C# to c-ts-mode.el? Or did we already discuss that and > > decided against? I don't remember, sorry. > > I don't think we decided against, and we didn't really discuss it. IIRC > your "challenge" was for the cc modes already included in emacs, and C# > is not that. But seeing how there's a functioning cc-based c#-mode, I > could tweak that to include both. The Cc mode variant is very stable > and have been for some time already. There's no need to maintain the > one in ELPA, and as I'm the author of it I think we can merge both? So > we can have in-tree support for c# whether or not you have tree-sitter > enabled? I can whip up a patch for that if you want, or we could just > add the tree-sitter variant. In any case, I think c#-mode should > probably not be inside of c-ts-mode, considering that it's not a > superset of C, like C++, but its own entity. > > What do you think? It's fine with me to have C# support both with and without tree-sitter, if it's indeed easy. Thanks. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 18:51 ` Eli Zaretskii @ 2022-11-19 18:59 ` Theodor Thornhill 0 siblings, 0 replies; 60+ messages in thread From: Theodor Thornhill @ 2022-11-19 18:59 UTC (permalink / raw) To: Eli Zaretskii; +Cc: casouri, jostein, emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: Theodor Thornhill <theo@thornhill.no> >> Cc: casouri@gmail.com, jostein@kjonigsen.net, emacs-devel@gnu.org >> Date: Sat, 19 Nov 2022 19:46:07 +0100 >> >> Eli Zaretskii <eliz@gnu.org> writes: >> >> > Btw, should we add C# to c-ts-mode.el? Or did we already discuss that and >> > decided against? I don't remember, sorry. >> >> I don't think we decided against, and we didn't really discuss it. IIRC >> your "challenge" was for the cc modes already included in emacs, and C# >> is not that. But seeing how there's a functioning cc-based c#-mode, I >> could tweak that to include both. The Cc mode variant is very stable >> and have been for some time already. There's no need to maintain the >> one in ELPA, and as I'm the author of it I think we can merge both? So >> we can have in-tree support for c# whether or not you have tree-sitter >> enabled? I can whip up a patch for that if you want, or we could just >> add the tree-sitter variant. In any case, I think c#-mode should >> probably not be inside of c-ts-mode, considering that it's not a >> superset of C, like C++, but its own entity. >> >> What do you think? > > It's fine with me to have C# support both with and without tree-sitter, if it's > indeed easy. Gotcha. The few commits that has happened after I rewrote the cc mode variant should be compliant assignment-wise, but I'll double-check. Most are very, very small. @jostein, could we just iterate on it the next couple of days? I can do the coding, but I'm not bathing in C# these days, so it would be nice with some real life usage too :-) Theo ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-18 22:52 ` Yuan Fu 2022-11-19 5:21 ` Theodor Thornhill @ 2022-11-19 7:36 ` Stefan Kangas 2022-11-19 8:09 ` Eli Zaretskii 1 sibling, 1 reply; 60+ messages in thread From: Stefan Kangas @ 2022-11-19 7:36 UTC (permalink / raw) To: Yuan Fu, jostein; +Cc: emacs-devel, Theodor Thornhill, Eli Zaretskii Yuan Fu <casouri@gmail.com> writes: > The good news is, feature/tree-sitter is merging in a few days! And > we’ll make further improvements on the master. So rest assured! :-) I > think we can at least get C, Python, Javascript, Typescript, Bash, > JONS and CSS to go with the up coming release, largely thanks to > Theo’s (and tree-sitter’s) productivity. I personally don’t know > enough of C++ and Java to polish them, but they have a good chance > too. That's very exciting news! Thanks Yuan, Theodor and all others who contributed. There seems to be a whole lot of figuring out left to do with both the API and how the major modes should be implemented. Would it make sense to ship the `tree-sitter' feature (and related modes) as explicitly "experimental", to allow us to make changes in Emacs 30 without overly worrying about backwards-compatibility? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 7:36 ` Stefan Kangas @ 2022-11-19 8:09 ` Eli Zaretskii 2022-11-19 11:25 ` Stefan Kangas 0 siblings, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 8:09 UTC (permalink / raw) To: Stefan Kangas; +Cc: casouri, jostein, emacs-devel, theo > From: Stefan Kangas <stefankangas@gmail.com> > Date: Fri, 18 Nov 2022 23:36:30 -0800 > Cc: emacs-devel <emacs-devel@gnu.org>, Theodor Thornhill <theo@thornhill.no>, Eli Zaretskii <eliz@gnu.org> > > Yuan Fu <casouri@gmail.com> writes: > > > The good news is, feature/tree-sitter is merging in a few days! And > > we’ll make further improvements on the master. So rest assured! :-) I > > think we can at least get C, Python, Javascript, Typescript, Bash, > > JONS and CSS to go with the up coming release, largely thanks to > > Theo’s (and tree-sitter’s) productivity. I personally don’t know > > enough of C++ and Java to polish them, but they have a good chance > > too. > > That's very exciting news! Thanks Yuan, Theodor and all others who > contributed. > > There seems to be a whole lot of figuring out left to do with both the > API and how the major modes should be implemented. Would it make sense > to ship the `tree-sitter' feature (and related modes) as explicitly > "experimental", to allow us to make changes in Emacs 30 without overly > worrying about backwards-compatibility? The intent is for Emacs 29 to include several modes based on tree-sitter, and several others to have optional features based on tree-sitter. Based on the state of the soon-to-be-merged branch, I see no reason to declare its support as experimental. As for backwards-compatibility, you will have to be more specific. Which features or APIs you see on the branch are in your opinion likely to change significantly after the release of Emacs 29? We need to consider these on a case by case basis. Personally, I think that we had this figured out in a way that won't create incompatibilities and yet allow changes, but maybe I'm missing something. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 8:09 ` Eli Zaretskii @ 2022-11-19 11:25 ` Stefan Kangas 2022-11-19 11:49 ` Theodor Thornhill 2022-11-19 12:03 ` Eli Zaretskii 0 siblings, 2 replies; 60+ messages in thread From: Stefan Kangas @ 2022-11-19 11:25 UTC (permalink / raw) To: Eli Zaretskii; +Cc: casouri, jostein, emacs-devel, theo Eli Zaretskii <eliz@gnu.org> writes: > The intent is for Emacs 29 to include several modes based on > tree-sitter, and several others to have optional features based on > tree-sitter. Based on the state of the soon-to-be-merged branch, I > see no reason to declare its support as experimental. My comment was more general, as IIUC we are still seeing quite a bit of movement even in the low-level fundamentals on that branch, as recently as the last week or two. But if you and others are happy to declare our tree-sitter support stable, so much the better. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 11:25 ` Stefan Kangas @ 2022-11-19 11:49 ` Theodor Thornhill 2022-11-19 12:03 ` Eli Zaretskii 1 sibling, 0 replies; 60+ messages in thread From: Theodor Thornhill @ 2022-11-19 11:49 UTC (permalink / raw) To: Stefan Kangas, Eli Zaretskii; +Cc: casouri, jostein, emacs-devel Stefan Kangas <stefankangas@gmail.com> writes: > Eli Zaretskii <eliz@gnu.org> writes: > >> The intent is for Emacs 29 to include several modes based on >> tree-sitter, and several others to have optional features based on >> tree-sitter. Based on the state of the soon-to-be-merged branch, I >> see no reason to declare its support as experimental. > > My comment was more general, as IIUC we are still seeing quite a bit of > movement even in the low-level fundamentals on that branch, as recently > as the last week or two. But if you and others are happy to declare our > tree-sitter support stable, so much the better. Only one of the modes is auto-enabled, and that one is because it is missing support altogether natively in Emacs. The others are second-class to their older counterparts, and likely will be for years to come. My personal suggestion is to just keep them separate, as interested parties will find and enable these anyways. If at some point tree-sitter is so ubiquitous that it being second class doesn't make sense anymore we can make it the default. That's why I don't think we need to make it experimental: people that will be early adopters will likely compile emacs from master and get improvements incrementally, though they should be usable enough for others to use, should a package manager provide the integration within the stable Emacs 29 package. I agree with Eli in that providing only the api and "glue-code" would guarantee that people will just create their own, external variants that'll be hard to remove should we provide our own down the line. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-19 11:25 ` Stefan Kangas 2022-11-19 11:49 ` Theodor Thornhill @ 2022-11-19 12:03 ` Eli Zaretskii 1 sibling, 0 replies; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 12:03 UTC (permalink / raw) To: Stefan Kangas; +Cc: casouri, jostein, emacs-devel, theo > From: Stefan Kangas <stefankangas@gmail.com> > Date: Sat, 19 Nov 2022 03:25:11 -0800 > Cc: casouri@gmail.com, jostein@kjonigsen.net, emacs-devel@gnu.org, > theo@thornhill.no > > Eli Zaretskii <eliz@gnu.org> writes: > > > The intent is for Emacs 29 to include several modes based on > > tree-sitter, and several others to have optional features based on > > tree-sitter. Based on the state of the soon-to-be-merged branch, I > > see no reason to declare its support as experimental. > > My comment was more general, as IIUC we are still seeing quite a bit of > movement even in the low-level fundamentals on that branch, as recently > as the last week or two. We will merge the tree-sitter branch to master, but Emacs 29 release is still several moons ahead, and the master branch is used for developing Emacs, including low-level stuff, all the time. IOW, the fact that the tree-sitter support is still in flux is normal and should not preclude us from landing it on master. And if we want it to be part of Emacs 29, we cannot wait any longer. > But if you and others are happy to declare our tree-sitter support > stable, so much the better. It is stable enough to have it on master, yes. Not stable enough to release Emacs with it, but then Emacs 29 as a whole is nowhere near that status, either. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) 2022-11-18 21:54 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Jostein Kjønigsen 2022-11-18 22:34 ` Philip Kaludercic 2022-11-18 22:52 ` Yuan Fu @ 2022-11-19 8:16 ` Eli Zaretskii 2 siblings, 0 replies; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 8:16 UTC (permalink / raw) To: jostein; +Cc: casouri, emacs-devel, theo > Date: Fri, 18 Nov 2022 22:54:49 +0100 > From: Jostein Kjønigsen <jostein@secure.kjonigsen.net> > > I know this has been said before, by people which by far has been contributing much more than me... But I > still don't think it's a good idea to replace the implementation in existing major-modes with tree-sitter > implementations, nor selectively activate tree-sitter in major-modes prone to inhetitence and derivation. > > Me and Theodor faced these same issues with "our" C# and TypeScript major-modes, and the only "clean" > way we agreed we could make this work was to create wholly new implementations. I can come up with > many good, objective reasons for this, but I think Theodor has already represented this view fairly well. > > While for the sake of brevity, I'll not diving deeply into this particular thing, I will say this: A new tree-sitter > based major-mode free of compatibility concerns allowed us to create entirely new major-modes fixing most > of our existing bugs, faster than we before would be able to fix a single bug. My personal view is that mixing > existing major-modes with tree-sitter represents absolutely the worst of all worlds. It maintains all existing > complexities, provides us with very few benefits, and at the same time adds complexities we didn't use to > have. To me, that's a net negative. > > Somewhat surprising to me, I see this is a somewhat controversial point of view and not as clear cut a > matter as I would have expected it to be. I realize and respect that final decisions in these matter might take > some time to mature. Time which given our current approach detracts from the momentum tree-sitter has > been having. You are looking at this from the POV of developing these features. But we have another vantage point to consider: that of our users. From their POV, we cannot replace existing modes with completely new and separate implementations, we must provide a migration path which will allow users to decide when and whether they want to switch to the tree-sitter based implementation. This will also allow us to improve the tree-sitter support of the modes by collecting user feedback sooner rather than later. So we decided to have a hybrid approach: in some modes to provide separate implementations, and in others to provide optional features that users can selectively switch on. > Instead of waiting for "every" major-mode to be re-implemented into a tree-sitter derivative in the > feature/tree-sitter branch before we merge... How about we just accept the current "core" tree-sitter > implementation as good enough, and consider merging that to git master as is. Here you are preaching to the choir, since the decision to merge soon was already made. And it cannot be otherwise, since the time of cutting the emacs-29 release branch is closing up, and we said 2 months ago that we intend to release Emacs 29 with tree-sitter support. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-16 20:45 Tree-sitter and major mode inheritance Yuan Fu 2022-11-18 21:54 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Jostein Kjønigsen @ 2022-11-19 9:41 ` Yuan Fu 2022-11-19 10:26 ` Eli Zaretskii 1 sibling, 1 reply; 60+ messages in thread From: Yuan Fu @ 2022-11-19 9:41 UTC (permalink / raw) To: emacs-devel; +Cc: Stefan Monnier, Eli Zaretskii, Theodor Thornhill > On Nov 16, 2022, at 12:45 PM, Yuan Fu <casouri@gmail.com> wrote: > > So I’m trying to merge css-ts-mode with css-mode. Scss-mode inherits css-mode, but if user enables tree-sitter for css-mode, scss-mode will inherit all that tree-sitter setup, and lose all the native css setup. Then if a user doesn’t want to enable tree-sitter in scss-mode, too bad: scss-mode breaks. > > Essentially scss-mode needs to be able to control which parts of css-mode’s setup it wants to inherit—native setup or tree-sitter setup—regardless of whether css-mode enables tree-sitter or not. > > I wonder if we can do something like this: > > css-mode > | > +---------+-----+-----------+ > | | | > css-native-mode css-ts-mode scss-mode > | > +----+------------+ > | | > scss-native-mode scss-ts-mode > > css-mode: a virtual mode, only sets up basic things that both native and tree-sitter mode needs, like comment-start. > css-native-mode: native setup > css-ts-mode: tree-sitter setup > > scss-mode: a virtual mode, inherits css-mode > scss-native-mode: native setup > scss-ts-mode: tree-sitter setup > > And user could use major-mode-remap-alist to choose which mode they want: > > (css-mode . css-ts-mode) for enabling tree-sitter > (css-mode . css-native-mode) for not enabling tree-sitter > > This could also used for other modes, like c-mode: c-mode, c-native-mode (cc-mode), c-ts-mode. > > Yuan Anyway, does anyone think this is a good/bad idea? Should I go implement this on css, js, c, etc? It can also be the other way around: instead of having c-mode being the virtual mode, we can leave c-mode as-is, and have a c-base-mode inherited by c-mode and c-ts-mode. And similarly rss-base-mode, rss-mode, and rss-ts-mode. Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 9:41 ` Tree-sitter and major mode inheritance Yuan Fu @ 2022-11-19 10:26 ` Eli Zaretskii 2022-11-19 10:29 ` Po Lu ` (2 more replies) 0 siblings, 3 replies; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 10:26 UTC (permalink / raw) To: Yuan Fu; +Cc: emacs-devel, monnier, theo > From: Yuan Fu <casouri@gmail.com> > Date: Sat, 19 Nov 2022 01:41:47 -0800 > Cc: Stefan Monnier <monnier@iro.umontreal.ca>, > Eli Zaretskii <eliz@gnu.org>, > Theodor Thornhill <theo@thornhill.no> > > Anyway, does anyone think this is a good/bad idea? Should I go implement this on css, js, c, etc? It can also be the other way around: instead of having c-mode being the virtual mode, we can leave c-mode as-is, and have a c-base-mode inherited by c-mode and c-ts-mode. And similarly rss-base-mode, rss-mode, and rss-ts-mode. I'd prefer leaving the original modes as-is. That should cause less compatibility problems, I think. Stefan, any thoughts? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 10:26 ` Eli Zaretskii @ 2022-11-19 10:29 ` Po Lu 2022-11-19 15:19 ` Stefan Monnier 2022-11-19 21:39 ` Dmitry Gutov 2 siblings, 0 replies; 60+ messages in thread From: Po Lu @ 2022-11-19 10:29 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Yuan Fu, emacs-devel, monnier, theo Eli Zaretskii <eliz@gnu.org> writes: > I'd prefer leaving the original modes as-is. That should cause less > compatibility problems, I think. +1 ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 10:26 ` Eli Zaretskii 2022-11-19 10:29 ` Po Lu @ 2022-11-19 15:19 ` Stefan Monnier 2022-11-19 17:17 ` Yuan Fu 2022-11-20 0:38 ` Po Lu 2022-11-19 21:39 ` Dmitry Gutov 2 siblings, 2 replies; 60+ messages in thread From: Stefan Monnier @ 2022-11-19 15:19 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Yuan Fu, emacs-devel, theo >> Anyway, does anyone think this is a good/bad idea? Should I go implement >> this on css, js, c, etc? It can also be the other way around: instead of >> having c-mode being the virtual mode, we can leave c-mode as-is, and have >> a c-base-mode inherited by c-mode and c-ts-mode. And similarly >> rss-base-mode, rss-mode, and rss-ts-mode. > > I'd prefer leaving the original modes as-is. That should cause less > compatibility problems, I think. > > Stefan, any thoughts? To the extent that Emacs-29's new `major-mode-remap-alist` can be used to select which mode to use, we can indeed leave the original modes as-is. Another argument in favor is that it's a bit tricky to make `<foo>-mode` both the parent mode and the standard entry point: we do that for `tex-mode` but the implementation is ugly. [ If it weren't for this implementation problem, it would be my favorite choice. So maybe the better option is to add specific support for that in `define-derived-mode`, where we could implement it cleanly and thus also fix the ugly gymnastics of `tex-mode`. ] OTOH it's a bit jarring to have the generic term `<foo>-mode` refer to a specific implementation. For that reason, my preference is for: - `<foo>-<abstract/parent/base/common>-mode` as the shared parent. - `<foo>-mode` as a dispatch function that calls the appropriate specific major mode which could be `<foo>-ts-mode`, or `cc-<foo>-mode`, or `<foo>-with-JSX-mode`, or ... Stefan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 15:19 ` Stefan Monnier @ 2022-11-19 17:17 ` Yuan Fu 2022-11-19 17:52 ` Eli Zaretskii 2022-11-20 0:38 ` Po Lu 1 sibling, 1 reply; 60+ messages in thread From: Yuan Fu @ 2022-11-19 17:17 UTC (permalink / raw) To: Stefan Monnier; +Cc: Eli Zaretskii, emacs-devel, theo > On Nov 19, 2022, at 7:19 AM, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > >>> Anyway, does anyone think this is a good/bad idea? Should I go implement >>> this on css, js, c, etc? It can also be the other way around: instead of >>> having c-mode being the virtual mode, we can leave c-mode as-is, and have >>> a c-base-mode inherited by c-mode and c-ts-mode. And similarly >>> rss-base-mode, rss-mode, and rss-ts-mode. >> >> I'd prefer leaving the original modes as-is. That should cause less >> compatibility problems, I think. >> >> Stefan, any thoughts? > > To the extent that Emacs-29's new `major-mode-remap-alist` can be used > to select which mode to use, we can indeed leave the original modes > as-is. > > Another argument in favor is that it's a bit tricky to make `<foo>-mode` > both the parent mode and the standard entry point: we do that for > `tex-mode` but the implementation is ugly. > [ If it weren't for this implementation problem, it would be my > favorite choice. So maybe the better option is to add specific support > for that in `define-derived-mode`, where we could implement it > cleanly and thus also fix the ugly gymnastics of `tex-mode`. ] > > OTOH it's a bit jarring to have the generic term `<foo>-mode` refer to > a specific implementation. > > For that reason, my preference is for: > > - `<foo>-<abstract/parent/base/common>-mode` as the shared parent. > - `<foo>-mode` as a dispatch function that calls the appropriate specific > major mode which could be `<foo>-ts-mode`, or `cc-<foo>-mode`, or > `<foo>-with-JSX-mode`, or … If we are already renaming existing modes (cc-<foo>-mode), why don’t we use the generic name <foo>-mode for the virtual parent mode? It would be nicer if the generic mode (<foo>-mode) is an actual mode, with mode hooks, keycaps, etc, rather than simply a dispatch function. Plus, if we make <foo>-mode a command rather, all existing configuration of <foo>-mode breaks: there is no such major mode anymore, users need to use either <foo>-base-mode or one of <foo>-cc/ts-mode. Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 17:17 ` Yuan Fu @ 2022-11-19 17:52 ` Eli Zaretskii 2022-11-19 21:45 ` Yuan Fu 0 siblings, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-19 17:52 UTC (permalink / raw) To: Yuan Fu; +Cc: monnier, emacs-devel, theo > From: Yuan Fu <casouri@gmail.com> > Date: Sat, 19 Nov 2022 09:17:11 -0800 > Cc: Eli Zaretskii <eliz@gnu.org>, > emacs-devel@gnu.org, > theo@thornhill.no > > If we are already renaming existing modes (cc-<foo>-mode), why don’t we use the generic name <foo>-mode for the virtual parent mode? It would be nicer if the generic mode (<foo>-mode) is an actual mode, with mode hooks, keycaps, etc, rather than simply a dispatch function. I already said that I prefer not to rename existing modes. Such renaming will break too many init files and other Lisp programs. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 17:52 ` Eli Zaretskii @ 2022-11-19 21:45 ` Yuan Fu 2022-11-20 7:05 ` Eli Zaretskii 0 siblings, 1 reply; 60+ messages in thread From: Yuan Fu @ 2022-11-19 21:45 UTC (permalink / raw) To: Eli Zaretskii; +Cc: monnier, emacs-devel, theo > On Nov 19, 2022, at 9:52 AM, Eli Zaretskii <eliz@gnu.org> wrote: > >> From: Yuan Fu <casouri@gmail.com> >> Date: Sat, 19 Nov 2022 09:17:11 -0800 >> Cc: Eli Zaretskii <eliz@gnu.org>, >> emacs-devel@gnu.org, >> theo@thornhill.no >> >> If we are already renaming existing modes (cc-<foo>-mode), why don’t we use the generic name <foo>-mode for the virtual parent mode? It would be nicer if the generic mode (<foo>-mode) is an actual mode, with mode hooks, keycaps, etc, rather than simply a dispatch function. > > I already said that I prefer not to rename existing modes. Such > renaming will break too many init files and other Lisp programs. I guess we can at least try it for a bit? Because hook, keymaps, etc, should just work, that’s the point of major mode inheritance, after all. C-native-mode will run all the setup for c-mode, plus setup for c-native-mode. Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 21:45 ` Yuan Fu @ 2022-11-20 7:05 ` Eli Zaretskii 0 siblings, 0 replies; 60+ messages in thread From: Eli Zaretskii @ 2022-11-20 7:05 UTC (permalink / raw) To: Yuan Fu; +Cc: monnier, emacs-devel, theo > From: Yuan Fu <casouri@gmail.com> > Date: Sat, 19 Nov 2022 13:45:41 -0800 > Cc: monnier@iro.umontreal.ca, > emacs-devel@gnu.org, > theo@thornhill.no > > > > > On Nov 19, 2022, at 9:52 AM, Eli Zaretskii <eliz@gnu.org> wrote: > > > >> From: Yuan Fu <casouri@gmail.com> > >> Date: Sat, 19 Nov 2022 09:17:11 -0800 > >> Cc: Eli Zaretskii <eliz@gnu.org>, > >> emacs-devel@gnu.org, > >> theo@thornhill.no > >> > >> If we are already renaming existing modes (cc-<foo>-mode), why don’t we use the generic name <foo>-mode for the virtual parent mode? It would be nicer if the generic mode (<foo>-mode) is an actual mode, with mode hooks, keycaps, etc, rather than simply a dispatch function. > > > > I already said that I prefer not to rename existing modes. Such > > renaming will break too many init files and other Lisp programs. > > I guess we can at least try it for a bit? "Try" in what way? > Because hook, keymaps, etc, should just work, that’s the point of major mode inheritance, after all. C-native-mode will run all the setup for c-mode, plus setup for c-native-mode. Renaming public symbols is BAAAAD! It causes breakage for many users and Lisp programs. It will either cause large-scale renaming of hooks, keymaps, etc., which will break user init files; or it will cause confusion (because a hook for cc-FOO-mode will be called cc-mode-hook and not the expected cc-FOO-mode-hook). And that is just the tip of the iceberg. Why cannot we have the solution we already discussed and agreed upon: . modes that didn't exist before Emacs 29 will require tree-sitter . modes that existed before Emacs 29 will either - offer tree-sitter support as an optional feature, via a minor mode or a defcustom; or - add a completely new major mode with a different name that requires tree-sitter If you need to add a FOO-base-mode to make it easier to share between tree-sitter and non-tree-sitter modes features that are common to both, it's fine with me to add such *-base-modes, but they should not be in any auto-mode alist, and should generally be only an implementation detail mostly hidden from users. What is the problem with the above? I thought we already agreed on that, so how come this issue pops up time and again? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 15:19 ` Stefan Monnier 2022-11-19 17:17 ` Yuan Fu @ 2022-11-20 0:38 ` Po Lu 1 sibling, 0 replies; 60+ messages in thread From: Po Lu @ 2022-11-20 0:38 UTC (permalink / raw) To: Stefan Monnier; +Cc: Eli Zaretskii, Yuan Fu, emacs-devel, theo Stefan Monnier <monnier@iro.umontreal.ca> writes: > To the extent that Emacs-29's new `major-mode-remap-alist` can be used > to select which mode to use, we can indeed leave the original modes > as-is. Yes, but you seem to contradict that preference below: > - `<foo>-mode` as a dispatch function that calls the appropriate specific > major mode which could be `<foo>-ts-mode`, or `cc-<foo>-mode`, or > `<foo>-with-JSX-mode`, or ... Why can't c-ts-mode be a separate mode, unrelated to c-mode in any way? AFAIU it's supposed to be an optional feature users are supposed to turn on for themselves. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 10:26 ` Eli Zaretskii 2022-11-19 10:29 ` Po Lu 2022-11-19 15:19 ` Stefan Monnier @ 2022-11-19 21:39 ` Dmitry Gutov 2022-11-19 21:49 ` Yuan Fu 2022-11-20 6:51 ` Eli Zaretskii 2 siblings, 2 replies; 60+ messages in thread From: Dmitry Gutov @ 2022-11-19 21:39 UTC (permalink / raw) To: Eli Zaretskii, Yuan Fu; +Cc: emacs-devel, monnier, theo On 19.11.2022 12:26, Eli Zaretskii wrote: >> From: Yuan Fu<casouri@gmail.com> >> Date: Sat, 19 Nov 2022 01:41:47 -0800 >> Cc: Stefan Monnier<monnier@iro.umontreal.ca>, >> Eli Zaretskii<eliz@gnu.org>, >> Theodor Thornhill<theo@thornhill.no> >> >> Anyway, does anyone think this is a good/bad idea? Should I go implement this on css, js, c, etc? It can also be the other way around: instead of having c-mode being the virtual mode, we can leave c-mode as-is, and have a c-base-mode inherited by c-mode and c-ts-mode. And similarly rss-base-mode, rss-mode, and rss-ts-mode. > I'd prefer leaving the original modes as-is. That should cause less > compatibility problems, I think. Eli, what's your solution for the problem, then? E.g. js-mode enables tree-sitter, and installs some stuff based on it. But js2-mode inherits from js-mode (meaning, it will run the same setup code, and then some of its own), yet it has its own parser. Which will cause all sorts of conflicts with tree-sitter. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 21:39 ` Dmitry Gutov @ 2022-11-19 21:49 ` Yuan Fu 2022-11-19 22:03 ` Dmitry Gutov 2022-11-20 7:05 ` Eli Zaretskii 2022-11-20 6:51 ` Eli Zaretskii 1 sibling, 2 replies; 60+ messages in thread From: Yuan Fu @ 2022-11-19 21:49 UTC (permalink / raw) To: Dmitry Gutov; +Cc: Eli Zaretskii, emacs-devel, monnier, theo > On Nov 19, 2022, at 1:39 PM, Dmitry Gutov <dgutov@yandex.ru> wrote: > > On 19.11.2022 12:26, Eli Zaretskii wrote: >>> From: Yuan Fu<casouri@gmail.com> >>> Date: Sat, 19 Nov 2022 01:41:47 -0800 >>> Cc: Stefan Monnier<monnier@iro.umontreal.ca>, >>> Eli Zaretskii<eliz@gnu.org>, >>> Theodor Thornhill<theo@thornhill.no> >>> >>> Anyway, does anyone think this is a good/bad idea? Should I go implement this on css, js, c, etc? It can also be the other way around: instead of having c-mode being the virtual mode, we can leave c-mode as-is, and have a c-base-mode inherited by c-mode and c-ts-mode. And similarly rss-base-mode, rss-mode, and rss-ts-mode. >> I'd prefer leaving the original modes as-is. That should cause less >> compatibility problems, I think. > > Eli, what's your solution for the problem, then? > > E.g. js-mode enables tree-sitter, and installs some stuff based on it. > > But js2-mode inherits from js-mode (meaning, it will run the same setup code, and then some of its own), yet it has its own parser. Which will cause all sorts of conflicts with tree-sitter. Actually, that’s evidence supporting his preference: js-mode will remain to be the native implementation, so inheriting from it is exactly as before. Js-ts-mode will install tree-sitter stuff. And js-base-mode wouldn’t do much. Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 21:49 ` Yuan Fu @ 2022-11-19 22:03 ` Dmitry Gutov 2022-11-19 22:36 ` Dmitry Gutov 2022-11-20 7:11 ` Eli Zaretskii 2022-11-20 7:05 ` Eli Zaretskii 1 sibling, 2 replies; 60+ messages in thread From: Dmitry Gutov @ 2022-11-19 22:03 UTC (permalink / raw) To: Yuan Fu; +Cc: Eli Zaretskii, emacs-devel, monnier, theo On 19.11.2022 23:49, Yuan Fu wrote: > Actually, that’s evidence supporting his preference: js-mode will remain to be the native implementation, so inheriting from it is exactly as before. Js-ts-mode will install tree-sitter stuff. And js-base-mode wouldn’t do much. But js-base-mode will be used in auto-mode-alist? That should work, I think. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 22:03 ` Dmitry Gutov @ 2022-11-19 22:36 ` Dmitry Gutov 2022-11-19 23:36 ` Yuan Fu 2022-11-20 7:11 ` Eli Zaretskii 1 sibling, 1 reply; 60+ messages in thread From: Dmitry Gutov @ 2022-11-19 22:36 UTC (permalink / raw) To: Yuan Fu; +Cc: Eli Zaretskii, emacs-devel, monnier, theo On 20.11.2022 00:03, Dmitry Gutov wrote: > On 19.11.2022 23:49, Yuan Fu wrote: >> Actually, that’s evidence supporting his preference: js-mode will >> remain to be the native implementation, so inheriting from it is >> exactly as before. Js-ts-mode will install tree-sitter stuff. And >> js-base-mode wouldn’t do much. > > But js-base-mode will be used in auto-mode-alist? > > That should work, I think. Could we make the dispatcher "modes" regular functions, though? Keeping them out of the inheritance chain. That would make (derived-mode-p 'js-base-mode) always fail, of course, but if we are talking about existing code, there will be checks like (derived-mode-p 'js-mode) which are going to fail anyway now because js-js-mode isn't going to derive from js-mode. Could this be solvable through major-mode-remap-alist? And if they (base modes) are not real modes, call it something like js-mode-dispatch or js-mode-virtual. Or js-mode-choose, etc, something with a verb at the end might do a better signal that it's not a "mode" and there is no point in inheriting or doing derived-mode-p checks on it. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 22:36 ` Dmitry Gutov @ 2022-11-19 23:36 ` Yuan Fu 2022-11-19 23:42 ` Dmitry Gutov 0 siblings, 1 reply; 60+ messages in thread From: Yuan Fu @ 2022-11-19 23:36 UTC (permalink / raw) To: Dmitry Gutov; +Cc: Eli Zaretskii, emacs-devel, monnier, theo > On Nov 19, 2022, at 2:36 PM, Dmitry Gutov <dgutov@yandex.ru> wrote: > > On 20.11.2022 00:03, Dmitry Gutov wrote: >> On 19.11.2022 23:49, Yuan Fu wrote: >>> Actually, that’s evidence supporting his preference: js-mode will remain to be the native implementation, so inheriting from it is exactly as before. Js-ts-mode will install tree-sitter stuff. And js-base-mode wouldn’t do much. >> But js-base-mode will be used in auto-mode-alist? >> That should work, I think. > > Could we make the dispatcher "modes" regular functions, though? Keeping them out of the inheritance chain. > > That would make (derived-mode-p 'js-base-mode) always fail, of course, but if we are talking about existing code, there will be checks like (derived-mode-p 'js-mode) which are going to fail anyway now because js-js-mode isn't going to derive from js-mode. Could this be solvable through major-mode-remap-alist? > > And if they (base modes) are not real modes, call it something like js-mode-dispatch or js-mode-virtual. Or js-mode-choose, etc, something with a verb at the end might do a better signal that it's not a "mode" and there is no point in inheriting or doing derived-mode-p checks on it. If we keep js-mode as-is, and add js-base-mode and js-ts-mode, (derived-mode-p ‘js-mode) should keep working as before, or maybe I’m msiunderstanding your question? Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 23:36 ` Yuan Fu @ 2022-11-19 23:42 ` Dmitry Gutov 2022-11-20 7:28 ` Eli Zaretskii 0 siblings, 1 reply; 60+ messages in thread From: Dmitry Gutov @ 2022-11-19 23:42 UTC (permalink / raw) To: Yuan Fu; +Cc: Eli Zaretskii, emacs-devel, monnier, theo On 20.11.2022 01:36, Yuan Fu wrote: > If we keep js-mode as-is, and add js-base-mode and js-ts-mode, (derived-mode-p ‘js-mode) should keep working as before, or maybe I’m msiunderstanding your question? (derived-mode-p 'js-mode) will return nil in js-ts-mode. Which could be a problem when this call is used as a substitute for a file type check (e.g. "are we editing a JavaScript file?"), which is one of its common uses. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 23:42 ` Dmitry Gutov @ 2022-11-20 7:28 ` Eli Zaretskii 2022-11-20 13:22 ` Dmitry Gutov 0 siblings, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-20 7:28 UTC (permalink / raw) To: Dmitry Gutov; +Cc: casouri, emacs-devel, monnier, theo > Date: Sun, 20 Nov 2022 01:42:04 +0200 > Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, > monnier@iro.umontreal.ca, theo@thornhill.no > From: Dmitry Gutov <dgutov@yandex.ru> > > On 20.11.2022 01:36, Yuan Fu wrote: > > If we keep js-mode as-is, and add js-base-mode and js-ts-mode, (derived-mode-p ‘js-mode) should keep working as before, or maybe I’m msiunderstanding your question? > > (derived-mode-p 'js-mode) will return nil in js-ts-mode. > > Which could be a problem when this call is used as a substitute for a > file type check (e.g. "are we editing a JavaScript file?"), which is one > of its common uses. This test can only work on the assumption that there's a single parent mode for all the modes which support a given programming language. This is a fragile assumption, so code which is based on it is broken and should be fixed. IOW, I don't think we should feel ourselves bound by this fragile assumption (assuming the solution we decide on breaks it). ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 7:28 ` Eli Zaretskii @ 2022-11-20 13:22 ` Dmitry Gutov 2022-11-20 14:49 ` Eli Zaretskii 0 siblings, 1 reply; 60+ messages in thread From: Dmitry Gutov @ 2022-11-20 13:22 UTC (permalink / raw) To: Eli Zaretskii; +Cc: casouri, emacs-devel, monnier, theo On 20.11.2022 09:28, Eli Zaretskii wrote: >> Date: Sun, 20 Nov 2022 01:42:04 +0200 >> Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, >> monnier@iro.umontreal.ca, theo@thornhill.no >> From: Dmitry Gutov <dgutov@yandex.ru> >> >> On 20.11.2022 01:36, Yuan Fu wrote: >>> If we keep js-mode as-is, and add js-base-mode and js-ts-mode, (derived-mode-p ‘js-mode) should keep working as before, or maybe I’m msiunderstanding your question? >> >> (derived-mode-p 'js-mode) will return nil in js-ts-mode. >> >> Which could be a problem when this call is used as a substitute for a >> file type check (e.g. "are we editing a JavaScript file?"), which is one >> of its common uses. > > This test can only work on the assumption that there's a single parent mode > for all the modes which support a given programming language. Technically correct, the best kind of correct. > This is a > fragile assumption, so code which is based on it is broken and should be > fixed. Okay then, but then we'll need to learn another way to ask that question. Previously, we did try to ensure (not always successfully) a single inheritance chain between such modes. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 13:22 ` Dmitry Gutov @ 2022-11-20 14:49 ` Eli Zaretskii 2022-11-20 15:24 ` Dmitry Gutov 0 siblings, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-20 14:49 UTC (permalink / raw) To: Dmitry Gutov; +Cc: casouri, emacs-devel, monnier, theo > Date: Sun, 20 Nov 2022 15:22:40 +0200 > Cc: casouri@gmail.com, emacs-devel@gnu.org, monnier@iro.umontreal.ca, > theo@thornhill.no > From: Dmitry Gutov <dgutov@yandex.ru> > > > This is a > > fragile assumption, so code which is based on it is broken and should be > > fixed. > > Okay then, but then we'll need to learn another way to ask that > question. I guess. I admit I didn't know derived-mode-p was being used for such tests. Would it make sense to use alternatives, as in (or (derived-mode-p 'js-mode) (derived-mode-p 'js-ts-mode)) ? Or maybe we should add a new predicate, which will take a LANGUAGE argument, and use some database of known modes internally to call derived-mode-p as above? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 14:49 ` Eli Zaretskii @ 2022-11-20 15:24 ` Dmitry Gutov 0 siblings, 0 replies; 60+ messages in thread From: Dmitry Gutov @ 2022-11-20 15:24 UTC (permalink / raw) To: Eli Zaretskii; +Cc: casouri, emacs-devel, monnier, theo On 20.11.2022 16:49, Eli Zaretskii wrote: >> Date: Sun, 20 Nov 2022 15:22:40 +0200 >> Cc: casouri@gmail.com, emacs-devel@gnu.org, monnier@iro.umontreal.ca, >> theo@thornhill.no >> From: Dmitry Gutov <dgutov@yandex.ru> >> >>> This is a >>> fragile assumption, so code which is based on it is broken and should be >>> fixed. >> >> Okay then, but then we'll need to learn another way to ask that >> question. > > I guess. I admit I didn't know derived-mode-p was being used for such > tests. > > Would it make sense to use alternatives, as in > > (or (derived-mode-p 'js-mode) > (derived-mode-p 'js-ts-mode)) > > ? Those kind of lists are going to be inherently non-exhaustive. > Or maybe we should add a new predicate, which will take a LANGUAGE argument, > and use some database of known modes internally to call derived-mode-p as > above? Some kind of new registry could be the answer, but it would be nice to manage using the existing tools/variables somehow. Stefan has touched on this issue in https://debbugs.gnu.org/58075 ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 22:03 ` Dmitry Gutov 2022-11-19 22:36 ` Dmitry Gutov @ 2022-11-20 7:11 ` Eli Zaretskii 2022-11-20 9:19 ` Yuan Fu 1 sibling, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-20 7:11 UTC (permalink / raw) To: Dmitry Gutov; +Cc: casouri, emacs-devel, monnier, theo > Date: Sun, 20 Nov 2022 00:03:35 +0200 > Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, > monnier@iro.umontreal.ca, theo@thornhill.no > From: Dmitry Gutov <dgutov@yandex.ru> > > On 19.11.2022 23:49, Yuan Fu wrote: > > Actually, that’s evidence supporting his preference: js-mode will remain to be the native implementation, so inheriting from it is exactly as before. Js-ts-mode will install tree-sitter stuff. And js-base-mode wouldn’t do much. > > But js-base-mode will be used in auto-mode-alist? NO!!! auto-mode-alist should keep using js-mode, as it does today. js-base-mode, if we need it, should just be a vehicle for easy sharing of common stuff between several modes that pertain to the same or similar languages. It should NOT be visible to users, so should not appear in any variables users are likely to customize. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 7:11 ` Eli Zaretskii @ 2022-11-20 9:19 ` Yuan Fu 2022-11-20 10:02 ` Eli Zaretskii 0 siblings, 1 reply; 60+ messages in thread From: Yuan Fu @ 2022-11-20 9:19 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Dmitry Gutov, emacs-devel, monnier, theo > On Nov 19, 2022, at 11:11 PM, Eli Zaretskii <eliz@gnu.org> wrote: > >> Date: Sun, 20 Nov 2022 00:03:35 +0200 >> Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, >> monnier@iro.umontreal.ca, theo@thornhill.no >> From: Dmitry Gutov <dgutov@yandex.ru> >> >> On 19.11.2022 23:49, Yuan Fu wrote: >>> Actually, that’s evidence supporting his preference: js-mode will remain to be the native implementation, so inheriting from it is exactly as before. Js-ts-mode will install tree-sitter stuff. And js-base-mode wouldn’t do much. >> >> But js-base-mode will be used in auto-mode-alist? > > NO!!! auto-mode-alist should keep using js-mode, as it does today. > > js-base-mode, if we need it, should just be a vehicle for easy sharing of > common stuff between several modes that pertain to the same or similar > languages. It should NOT be visible to users, so should not appear in any > variables users are likely to customize. Alright, changing js-mode to ja-native-mode is indeed a bad idea. So this is what I did: for eg, js-mode, I created js-ts-mode and js-base-mode. Js-mode and js-ts-mode inherits js-base-mode. Auto-mode-alist has javascript-mode (that’s what’s in the list right now, I didn’t change it). If a user wants to use tree-sitter for javascript, they can add (javascript-mode . js-ts-mode) into major-mode-remap-alist. If someone wants js-mode and js-ts-mode to share the same configuration, he needs to configure js-base-mode. So js-base-mode isn’t completely invisible. Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 9:19 ` Yuan Fu @ 2022-11-20 10:02 ` Eli Zaretskii 2022-11-20 22:57 ` Yuan Fu 0 siblings, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-20 10:02 UTC (permalink / raw) To: Yuan Fu; +Cc: dgutov, emacs-devel, monnier, theo > From: Yuan Fu <casouri@gmail.com> > Date: Sun, 20 Nov 2022 01:19:13 -0800 > Cc: Dmitry Gutov <dgutov@yandex.ru>, > emacs-devel@gnu.org, > monnier@iro.umontreal.ca, > theo@thornhill.no > > > > > On Nov 19, 2022, at 11:11 PM, Eli Zaretskii <eliz@gnu.org> wrote: > > > >> Date: Sun, 20 Nov 2022 00:03:35 +0200 > >> Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, > >> monnier@iro.umontreal.ca, theo@thornhill.no > >> From: Dmitry Gutov <dgutov@yandex.ru> > >> > >> On 19.11.2022 23:49, Yuan Fu wrote: > >>> Actually, that’s evidence supporting his preference: js-mode will remain to be the native implementation, so inheriting from it is exactly as before. Js-ts-mode will install tree-sitter stuff. And js-base-mode wouldn’t do much. > >> > >> But js-base-mode will be used in auto-mode-alist? > > > > NO!!! auto-mode-alist should keep using js-mode, as it does today. > > > > js-base-mode, if we need it, should just be a vehicle for easy sharing of > > common stuff between several modes that pertain to the same or similar > > languages. It should NOT be visible to users, so should not appear in any > > variables users are likely to customize. > > Alright, changing js-mode to ja-native-mode is indeed a bad idea. So this is what I did: for eg, js-mode, I created js-ts-mode and js-base-mode. Js-mode and js-ts-mode inherits js-base-mode. Auto-mode-alist has javascript-mode (that’s what’s in the list right now, I didn’t change it). > > If a user wants to use tree-sitter for javascript, they can add (javascript-mode . js-ts-mode) into major-mode-remap-alist. Or manually turn on js-ts-mode. Or customize auto-mode-alist to have js-ts-mode be used in preference to js-mode. Right? > If someone wants js-mode and js-ts-mode to share the same configuration, he needs to configure js-base-mode. So js-base-mode isn’t completely invisible. We should not advertise js-base-mode. If people want to share configurations between two modes, they should do that explicitly via their own hook function, or via copying the configurations. (And some of the configurations cannot be shared anyway, because the two modes use different features for font-lock and indentation.) ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 10:02 ` Eli Zaretskii @ 2022-11-20 22:57 ` Yuan Fu 0 siblings, 0 replies; 60+ messages in thread From: Yuan Fu @ 2022-11-20 22:57 UTC (permalink / raw) To: Eli Zaretskii; +Cc: dgutov, emacs-devel, monnier, theo > On Nov 20, 2022, at 2:02 AM, Eli Zaretskii <eliz@gnu.org> wrote: > >> From: Yuan Fu <casouri@gmail.com> >> Date: Sun, 20 Nov 2022 01:19:13 -0800 >> Cc: Dmitry Gutov <dgutov@yandex.ru>, >> emacs-devel@gnu.org, >> monnier@iro.umontreal.ca, >> theo@thornhill.no >> >> >> >>> On Nov 19, 2022, at 11:11 PM, Eli Zaretskii <eliz@gnu.org> wrote: >>> >>>> Date: Sun, 20 Nov 2022 00:03:35 +0200 >>>> Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, >>>> monnier@iro.umontreal.ca, theo@thornhill.no >>>> From: Dmitry Gutov <dgutov@yandex.ru> >>>> >>>> On 19.11.2022 23:49, Yuan Fu wrote: >>>>> Actually, that’s evidence supporting his preference: js-mode will remain to be the native implementation, so inheriting from it is exactly as before. Js-ts-mode will install tree-sitter stuff. And js-base-mode wouldn’t do much. >>>> >>>> But js-base-mode will be used in auto-mode-alist? >>> >>> NO!!! auto-mode-alist should keep using js-mode, as it does today. >>> >>> js-base-mode, if we need it, should just be a vehicle for easy sharing of >>> common stuff between several modes that pertain to the same or similar >>> languages. It should NOT be visible to users, so should not appear in any >>> variables users are likely to customize. >> >> Alright, changing js-mode to ja-native-mode is indeed a bad idea. So this is what I did: for eg, js-mode, I created js-ts-mode and js-base-mode. Js-mode and js-ts-mode inherits js-base-mode. Auto-mode-alist has javascript-mode (that’s what’s in the list right now, I didn’t change it). >> >> If a user wants to use tree-sitter for javascript, they can add (javascript-mode . js-ts-mode) into major-mode-remap-alist. > > Or manually turn on js-ts-mode. Or customize auto-mode-alist to have > js-ts-mode be used in preference to js-mode. Right? Right. > >> If someone wants js-mode and js-ts-mode to share the same configuration, he needs to configure js-base-mode. So js-base-mode isn’t completely invisible. > > We should not advertise js-base-mode. If people want to share > configurations between two modes, they should do that explicitly via their > own hook function, or via copying the configurations. (And some of the > configurations cannot be shared anyway, because the two modes use different > features for font-lock and indentation.) Right. Yuan ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 21:49 ` Yuan Fu 2022-11-19 22:03 ` Dmitry Gutov @ 2022-11-20 7:05 ` Eli Zaretskii 2022-11-20 17:12 ` Dmitry Gutov 1 sibling, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-20 7:05 UTC (permalink / raw) To: Yuan Fu; +Cc: dgutov, emacs-devel, monnier, theo > From: Yuan Fu <casouri@gmail.com> > Date: Sat, 19 Nov 2022 13:49:50 -0800 > Cc: Eli Zaretskii <eliz@gnu.org>, > emacs-devel@gnu.org, > monnier@iro.umontreal.ca, > theo@thornhill.no > > > > > On Nov 19, 2022, at 1:39 PM, Dmitry Gutov <dgutov@yandex.ru> wrote: > > > > On 19.11.2022 12:26, Eli Zaretskii wrote: > >>> From: Yuan Fu<casouri@gmail.com> > >>> Date: Sat, 19 Nov 2022 01:41:47 -0800 > >>> Cc: Stefan Monnier<monnier@iro.umontreal.ca>, > >>> Eli Zaretskii<eliz@gnu.org>, > >>> Theodor Thornhill<theo@thornhill.no> > >>> > >>> Anyway, does anyone think this is a good/bad idea? Should I go implement this on css, js, c, etc? It can also be the other way around: instead of having c-mode being the virtual mode, we can leave c-mode as-is, and have a c-base-mode inherited by c-mode and c-ts-mode. And similarly rss-base-mode, rss-mode, and rss-ts-mode. > >> I'd prefer leaving the original modes as-is. That should cause less > >> compatibility problems, I think. > > > > Eli, what's your solution for the problem, then? > > > > E.g. js-mode enables tree-sitter, and installs some stuff based on it. > > > > But js2-mode inherits from js-mode (meaning, it will run the same setup code, and then some of its own), yet it has its own parser. Which will cause all sorts of conflicts with tree-sitter. > > Actually, that’s evidence supporting his preference: js-mode will remain to be the native implementation, so inheriting from it is exactly as before. Js-ts-mode will install tree-sitter stuff. And js-base-mode wouldn’t do much. Why do we need js-base-mode? what will it do? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 7:05 ` Eli Zaretskii @ 2022-11-20 17:12 ` Dmitry Gutov 2022-11-20 17:34 ` Eli Zaretskii 0 siblings, 1 reply; 60+ messages in thread From: Dmitry Gutov @ 2022-11-20 17:12 UTC (permalink / raw) To: Eli Zaretskii, Yuan Fu; +Cc: emacs-devel, monnier, theo On 20.11.2022 09:05, Eli Zaretskii wrote: > Why do we need js-base-mode? what will it do? I was under the impression that it would dispatch either to js-mode or to js-ts-mode based on the value of some global defcustom like treesit-global-modes (similar in structure for font-lock-global-modes). But I guess not. If that choice is going to be made instead through auto-mode-alist and major-mode-remap-alist. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 17:12 ` Dmitry Gutov @ 2022-11-20 17:34 ` Eli Zaretskii 0 siblings, 0 replies; 60+ messages in thread From: Eli Zaretskii @ 2022-11-20 17:34 UTC (permalink / raw) To: Dmitry Gutov; +Cc: casouri, emacs-devel, monnier, theo > Date: Sun, 20 Nov 2022 19:12:27 +0200 > Cc: emacs-devel@gnu.org, monnier@iro.umontreal.ca, theo@thornhill.no > From: Dmitry Gutov <dgutov@yandex.ru> > > On 20.11.2022 09:05, Eli Zaretskii wrote: > > Why do we need js-base-mode? what will it do? > > I was under the impression that it would dispatch either to js-mode or > to js-ts-mode based on the value of some global defcustom like > treesit-global-modes (similar in structure for font-lock-global-modes). > > But I guess not. If that choice is going to be made instead through > auto-mode-alist and major-mode-remap-alist. Yes, I prefer to hide the *-base-mode modes from users as much as possible, or not have them at all. I think it will prevent confusion. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-19 21:39 ` Dmitry Gutov 2022-11-19 21:49 ` Yuan Fu @ 2022-11-20 6:51 ` Eli Zaretskii 2022-11-20 12:45 ` Dmitry Gutov 1 sibling, 1 reply; 60+ messages in thread From: Eli Zaretskii @ 2022-11-20 6:51 UTC (permalink / raw) To: Dmitry Gutov; +Cc: casouri, emacs-devel, monnier, theo > Date: Sat, 19 Nov 2022 23:39:37 +0200 > Cc: emacs-devel@gnu.org, monnier@iro.umontreal.ca, theo@thornhill.no > From: Dmitry Gutov <dgutov@yandex.ru> > > On 19.11.2022 12:26, Eli Zaretskii wrote: > >> From: Yuan Fu<casouri@gmail.com> > >> Date: Sat, 19 Nov 2022 01:41:47 -0800 > >> Cc: Stefan Monnier<monnier@iro.umontreal.ca>, > >> Eli Zaretskii<eliz@gnu.org>, > >> Theodor Thornhill<theo@thornhill.no> > >> > >> Anyway, does anyone think this is a good/bad idea? Should I go implement this on css, js, c, etc? It can also be the other way around: instead of having c-mode being the virtual mode, we can leave c-mode as-is, and have a c-base-mode inherited by c-mode and c-ts-mode. And similarly rss-base-mode, rss-mode, and rss-ts-mode. > > I'd prefer leaving the original modes as-is. That should cause less > > compatibility problems, I think. > > Eli, what's your solution for the problem, then? I don't think I understand the question. Several (3, AFAIU) solutions were proposed, one of them leaves the original modes intact and either adds opt-in features to the original modes to turn on tree-sitter support, or adds an entirely new mode which requires tree-sitter. This is the solution I prefer. > E.g. js-mode enables tree-sitter, and installs some stuff based on it. Only if tree-sitter is available, AFAICT. Btw, if that happens automatically, then it isn't what I meant -- I meant tree-sitter to be an explicitly opt-in feature in modes which existed before Emacs 29 and worked without tree-sitter. > But js2-mode inherits from js-mode (meaning, it will run the same setup > code, and then some of its own), yet it has its own parser. Which will > cause all sorts of conflicts with tree-sitter. js2-mode is not in Emacs, so I cannot control what it does. Ideally, it will need only minor adjustments (like making sure it doesn't turn on tree-sitter if it doesn't want to) or none at all. If our changes somehow break js2-mode, we should discuss the details and try to fix the breakage as much as is reasonable from our side. The details aren't important from where I stand; what is important is that users of js-mode can still use the mode even if they don't have tree-sitter installed or don't want to use it even if it is installed. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 6:51 ` Eli Zaretskii @ 2022-11-20 12:45 ` Dmitry Gutov 2022-11-20 14:42 ` Eli Zaretskii 0 siblings, 1 reply; 60+ messages in thread From: Dmitry Gutov @ 2022-11-20 12:45 UTC (permalink / raw) To: Eli Zaretskii; +Cc: casouri, emacs-devel, monnier, theo On 20.11.2022 08:51, Eli Zaretskii wrote: >> But js2-mode inherits from js-mode (meaning, it will run the same setup >> code, and then some of its own), yet it has its own parser. Which will >> cause all sorts of conflicts with tree-sitter. > js2-mode is not in Emacs, so I cannot control what it does. Ideally, it > will need only minor adjustments (like making sure it doesn't turn on > tree-sitter if it doesn't want to) or none at all. That was my question: how would those "minor adjustments" look if not the way Yuan proposed things. > If our changes somehow break js2-mode, we should discuss the details and try > to fix the breakage as much as is reasonable from our side. The details > aren't important from where I stand; what is important is that users of > js-mode can still use the mode even if they don't have tree-sitter installed > or don't want to use it even if it is installed. I agree with that goal, of course. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: Tree-sitter and major mode inheritance 2022-11-20 12:45 ` Dmitry Gutov @ 2022-11-20 14:42 ` Eli Zaretskii 0 siblings, 0 replies; 60+ messages in thread From: Eli Zaretskii @ 2022-11-20 14:42 UTC (permalink / raw) To: Dmitry Gutov; +Cc: casouri, emacs-devel, monnier, theo > Date: Sun, 20 Nov 2022 14:45:59 +0200 > Cc: casouri@gmail.com, emacs-devel@gnu.org, monnier@iro.umontreal.ca, > theo@thornhill.no > From: Dmitry Gutov <dgutov@yandex.ru> > > On 20.11.2022 08:51, Eli Zaretskii wrote: > >> But js2-mode inherits from js-mode (meaning, it will run the same setup > >> code, and then some of its own), yet it has its own parser. Which will > >> cause all sorts of conflicts with tree-sitter. > > js2-mode is not in Emacs, so I cannot control what it does. Ideally, it > > will need only minor adjustments (like making sure it doesn't turn on > > tree-sitter if it doesn't want to) or none at all. > > That was my question: how would those "minor adjustments" look if not > the way Yuan proposed things. I don't know, sorry. First, Yuan didn't yet finish adjusting the code to what we have said here today. And on top of that, I'm not familiar with js2-mode, so I'd be grateful if someone else could tell what would be needed there (when that is clear). ^ permalink raw reply [flat|nested] 60+ messages in thread
end of thread, other threads:[~2022-11-20 22:57 UTC | newest] Thread overview: 60+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-11-16 20:45 Tree-sitter and major mode inheritance Yuan Fu 2022-11-18 21:54 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Jostein Kjønigsen 2022-11-18 22:34 ` Philip Kaludercic 2022-11-18 22:58 ` Yuan Fu 2022-11-18 23:36 ` Stefan Monnier 2022-11-19 7:09 ` Philip Kaludercic 2022-11-19 14:07 ` Standardized access to a REPL (was: Suggesting that feature/tree-sitter be merged) Stefan Monnier 2022-11-19 15:03 ` Standardized access to a REPL Philip Kaludercic 2022-11-19 16:07 ` Stefan Monnier 2022-11-19 16:10 ` Philip Kaludercic 2022-11-19 16:18 ` Eli Zaretskii 2022-11-19 22:31 ` Stefan Monnier 2022-11-20 9:25 ` Philip Kaludercic 2022-11-19 8:29 ` Suggesting that feature/tree-sitter be merged (was Re: Tree-sitter and major mode inheritance) Eli Zaretskii 2022-11-19 10:46 ` Philip Kaludercic 2022-11-19 11:36 ` Eli Zaretskii 2022-11-19 12:15 ` Philip Kaludercic 2022-11-19 13:05 ` Eli Zaretskii 2022-11-19 21:34 ` Dmitry Gutov 2022-11-18 22:52 ` Yuan Fu 2022-11-19 5:21 ` Theodor Thornhill 2022-11-19 18:35 ` Eli Zaretskii 2022-11-19 18:46 ` Theodor Thornhill 2022-11-19 18:51 ` Eli Zaretskii 2022-11-19 18:59 ` Theodor Thornhill 2022-11-19 7:36 ` Stefan Kangas 2022-11-19 8:09 ` Eli Zaretskii 2022-11-19 11:25 ` Stefan Kangas 2022-11-19 11:49 ` Theodor Thornhill 2022-11-19 12:03 ` Eli Zaretskii 2022-11-19 8:16 ` Eli Zaretskii 2022-11-19 9:41 ` Tree-sitter and major mode inheritance Yuan Fu 2022-11-19 10:26 ` Eli Zaretskii 2022-11-19 10:29 ` Po Lu 2022-11-19 15:19 ` Stefan Monnier 2022-11-19 17:17 ` Yuan Fu 2022-11-19 17:52 ` Eli Zaretskii 2022-11-19 21:45 ` Yuan Fu 2022-11-20 7:05 ` Eli Zaretskii 2022-11-20 0:38 ` Po Lu 2022-11-19 21:39 ` Dmitry Gutov 2022-11-19 21:49 ` Yuan Fu 2022-11-19 22:03 ` Dmitry Gutov 2022-11-19 22:36 ` Dmitry Gutov 2022-11-19 23:36 ` Yuan Fu 2022-11-19 23:42 ` Dmitry Gutov 2022-11-20 7:28 ` Eli Zaretskii 2022-11-20 13:22 ` Dmitry Gutov 2022-11-20 14:49 ` Eli Zaretskii 2022-11-20 15:24 ` Dmitry Gutov 2022-11-20 7:11 ` Eli Zaretskii 2022-11-20 9:19 ` Yuan Fu 2022-11-20 10:02 ` Eli Zaretskii 2022-11-20 22:57 ` Yuan Fu 2022-11-20 7:05 ` Eli Zaretskii 2022-11-20 17:12 ` Dmitry Gutov 2022-11-20 17:34 ` Eli Zaretskii 2022-11-20 6:51 ` Eli Zaretskii 2022-11-20 12:45 ` Dmitry Gutov 2022-11-20 14:42 ` Eli Zaretskii
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.