bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#68246: 30.0.50; Add non-TS mode as extra parent of TS modes


From: Dmitry Gutov
Subject: bug#68246: 30.0.50; Add non-TS mode as extra parent of TS modes
Date: Wed, 17 Jan 2024 04:41:00 +0200
User-agent: Mozilla Thunderbird

On 16/01/2024 13:06, João Távora wrote:

Agree.  And this is why I'm not crazy about the solution either.  But as
to cluttering the function namespace we could say that (:abstract t) modes
do _not_ generate a function (or do not generate them in the public
namespace -- as I think the function still has to exist for any
concrete submodes down the line to call it).

An "abstract" mode is supposedly one that doesn't do anything. So it doesn't have to be callable.

Anyway, that's +1 feature required for the implementation.

This choice is coupled with the corresponding logic in 'buffer-language'
(whether to keep the replace-regexp-in-string branch).

Yes.  I think we should err on the side on convenience.  What exactly are
the defects can we get?  I can't see anything else but the tuareg-mode, and we
can plug that on our side.  Maybe you can see more.

For example, it would sometimes return ugly non-existent languages like
:help-fns--edit-value, :org-lint--report or :xref--xref-buffer.

What if we filter by prog-mode?  It would leave the ':ruby-base' and
':python-base' as false positives, I guess.  But then we could reasonably
say that anything ending with '-base' is abstract (or use the
aforementioned  explicit abstract prop).

We would also filter out :css, for example. TeX modes also do not derive from prog-mode. TeX does have an LSP server, however.

It would also make ':lisp-data' a language.  But that's not bad.
lisp-data-mode is actually a useful concrete prog-mode derivative,
so I think it's OK to have ':lisp-data' as a language.

We can then have exceptions for some notable cases.  'lisp-mode' is
as we know, for Common Lisp only.

Are there specific uses for get-mode-for-language when there is no
existing buffer?

Yes, I'd say this markdown-mode use is exactly that.  Markdown inserts
some text into a buffer and all it knows is the language it's supposed
to fontify it with.  The major mode has that logic, so it must invoke
the correct (and preferred) major-mode function.

Sorry, I meant get-language-for-mode (which is the one implemented as
buffer-language currently).

Another use is allowing the user to choose major modes for languages,
say from a tutorial or wizard or at Emacs startup.  Say, I prefer
ruby-ts-mode for Ruby, but c++-mode for C++.  It'd be helpful to summarize
those preferences.

This would require capabilities like "get all modes for a language" (not
one of the set of functions mentioned so far, and it'll need a full scan
of major-mode-remap-alist) and "get current mode for a language" (this
one matches markdown-mode's function you posted).

Yes.  I don't see the full scan of m-m-remap-alist as problematic
from a effiency perspective.  If we decide it's the database, it's
the database.   It's unfortunate that the "alist" implementation is
hardcoded in the name (which is why I would prefer a (:language "Foo")
kwarg to define-derived-mode) but we can abstract the alist aspect
away with accessors and do the usual "Do not change this variable
directly, use these accessors instead".

I'm not saying in advance that it will be slow. Just that it's a different function.

BTW, get-current-mode-for-language could be implemented in terms of
set-buffer-language.

What does get-current-mode-for-language do exactly?

The major-mode currently configured to be used for the language (through m-m-a-alist, in the current proposal). set-auto-mode will choose it.

We could have both functions: buffer-language and get-language-for-mode
('get-mode-language'?). Or define one initially and add the other as needed.

Yes.  buffer-language isn't bad, it's a useful helper.  But buffer-language
should be just

     (with-current-buffer buffer (get-language-for-mode major-mode))

Right?  Modulo some caching if it turns out to be very inneficient
(which I really doubt)

Again: this won't work for files where no suitable major mode is
available (e.g. not installed yet).

Right. So maybe

(or (with-current-buffer buffer (get-language-for-mode major-mode))
     (let (kw)
        (and buffer-file-name
             (keywordp (setq kw (alist-get buffer-file-name auto-mode-alist)))
             kw))
     (consult-oracles)
     (error "Don't know what language this is, sorry"))

Replied to this one in another email: referring to the results of the computation of set-auto-mode is easier. But that's a technical detail.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]