Subject: Re: bug#74610: 31.0.50; Submitting mhtml-ts-mode, treesitter alternative to mhtml-mode

From: Juri Linkov <[email-masked]>
Date: Thu, 13 Feb 2025 19:55:59 +0200

>> I think we need now clarify the relation
>> between mhtml-ts-mode and html-ts-mode.
>> 
>> For example, currently I added a new function
>> 'html-ts-mode--outline-predicate' to html-ts-mode.el.
>> Should it be used in mhtml-ts-mode.el as well?
> I have to try but I think so, mhtml-ts-mode is declared as derived from html-
> ts-mode (although it is not very clear to me how derived modes work). The 
> treesit-outline-predicate variable is set by html-ts-mode and mhtml-ts-mode 
> inherits the same value. 

It seems inheritance doesn't work for embedded ts-modes
since even the primary ts-mode should be configured
by aggregation like with treesit-aggregated-simple-imenu-settings,
not by inheritance.

I see that you added TODO for an aggregated version of
treesit-defun-type-regexp.  Then treesit-outline-predicate
also needs an aggregated version, and maybe other settings too.
Ok, I could look how to do this with treesit-outline-predicate.

>> What about other settings?  Should html-ts-mode and mhtml-ts-mode
>> always be kept in sync?  Or html-ts-mode should be obsoleted
>> when it will be superseded by mhtml-ts-mode?
>> 
>> Maybe html-ts-mode would be still needed as a separate mode
>> to be used as embedded submode in such files as e.g.
>> Vue single-file component with *.vue files that contain parts
>> from js-ts-mode, css-ts-mode, and html-ts-mode for templates.
>
> I don't know. In general, I think having simple major modes makes it easier to 
> build more complex aggregations, rather than having to disable some features 
> inherited from complex major modes, as in html-ts-mode: "
>  ;; `html-ts-mode' inherits from `html-mode' that sets
>   ;; regexp-based outline variables.  So need to restore
>   ;; the default values of outline variables to be able
>   ;; to use `treesit-outline-predicate' above.

I checked that neither aggregation nor inheritance from html-ts-mode
can be used for vue-ts-mode since tree-sitter-vue duplicates
HTML grammar in its own grammar.  Even tree-sitter-astro
incorporates a simplified HTML grammar into its own grammar.
This is similar to HTML-like jsx elements in tsx grammar.