GNU bug report logs -
#69191
30.0.50; New var `major-mode-remap-defaults`, for packages
Previous Next
Reported by: Stefan Monnier <monnier <at> iro.umontreal.ca>
Date: Sun, 18 Feb 2024 18:22:04 UTC
Severity: normal
Found in version 30.0.50
Done: Stefan Monnier <monnier <at> iro.umontreal.ca>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 69191 in the body.
You can then email your comments to 69191 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
monnier <at> iro.umontreal.ca, bug-gnu-emacs <at> gnu.org
:
bug#69191
; Package
emacs
.
(Sun, 18 Feb 2024 18:22:05 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Stefan Monnier <monnier <at> iro.umontreal.ca>
:
New bug report received and forwarded. Copy sent to
monnier <at> iro.umontreal.ca, bug-gnu-emacs <at> gnu.org
.
(Sun, 18 Feb 2024 18:22:05 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
Package: Emacs
Version: 30.0.50
While `major-mode-remap-alist` provides a way for users to indicate the
major mode of their choice, I think we need a similar variable for the
use of packages.
The package below accordingly adds a new `major-mode-remap-defaults`
and changes various packages to obey it or make use of it.
I think it nicely cleans the regexp duplication between CC-mode and
`c-ts-mode.el` and also makes it easier/cleaner for users to override
the changes made by `*-ts-mode.el`.
There are some FIXMEs that one might want to address, most importantly
whether we should use an indirection through `major-mode-remap-defaults`
for all TS modes or only for those for which we provide a non-TS mode.
And there's no doc update yet.
Stefan
[major-mode-remap.patch (text/x-diff, inline)]
diff --git a/lisp/files.el b/lisp/files.el
index f67b650cb92..6b80175b157 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -3404,7 +3404,7 @@ set-auto-mode
matches the buffer beginning against `magic-mode-alist',
compares the file name against the entries in `auto-mode-alist',
then matches the buffer beginning against `magic-fallback-mode-alist'.
-It also obeys `major-mode-remap-alist'.
+It also obeys `major-mode-remap-alist' and `major-mode-remap-defaults'.
If `enable-local-variables' is nil, or if the file name matches
`inhibit-local-variables-regexps', this function does not check
@@ -3550,9 +3550,22 @@ major-mode-remap-alist
Every entry is of the form (MODE . FUNCTION) which means that in order
to activate the major mode MODE (specified via something like
`auto-mode-alist', file-local variables, ...) we should actually call
-FUNCTION instead."
+FUNCTION instead.
+FUNCTION can be nil to hide other entries (either in this var or in
+`major-mode-remap-defaults') and means that we should call MODE."
:type '(alist (symbol) (function)))
+(defvar major-mode-remap-defaults nil
+ "Alist mapping file-specified mode to actual mode.
+This works like `major-mode-remap-alist' except it has lower priority
+and it is meant to be modified by packages rather than users.")
+
+(defun major-mode-remap (mode)
+ "Return the function to use to enable MODE."
+ (or (cdr (or (assq mode major-mode-remap-alist)
+ (assq mode major-mode-remap-defaults)))
+ mode))
+
;; When `keep-mode-if-same' is set, we are working on behalf of
;; set-visited-file-name. In that case, if the major mode specified is the
;; same one we already have, don't actually reset it. We don't want to lose
@@ -3569,7 +3582,7 @@ set-auto-mode-0
(eq mode (car set-auto-mode--last))
(eq major-mode (cdr set-auto-mode--last)))))
(when mode
- (funcall (alist-get mode major-mode-remap-alist mode))
+ (funcall (major-mode-remap mode))
(unless (eq mode major-mode)
(setq set-auto-mode--last (cons mode major-mode)))
mode)))
diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index 4ef17daf876..b9064d689cf 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -1439,36 +1439,33 @@ c-or-c++-ts-mode
This function attempts to use file contents to determine whether
the code is C or C++ and based on that chooses whether to enable
`c-ts-mode' or `c++-ts-mode'."
+ ;; FIXME: (declare (obsolete c-or-c++-mode "30.1"))?
(interactive)
- (if (save-excursion
- (save-restriction
- (save-match-data ; Why `save-match-data'?
- (widen)
- (goto-char (point-min))
- (re-search-forward c-ts-mode--c-or-c++-regexp nil t))))
- (c++-ts-mode)
- (c-ts-mode)))
+ (let ((mode
+ (if (save-excursion
+ (save-restriction
+ (save-match-data ; Why `save-match-data'?
+ (widen)
+ (goto-char (point-min))
+ (re-search-forward c-ts-mode--c-or-c++-regexp nil t))))
+ 'c++-ts-mode)
+ 'c-ts-mode))
+ (funcall (major-mode-remap mode))))
+
;; The entries for C++ must come first to prevent *.c files be taken
;; as C++ on case-insensitive filesystems, since *.C files are C++,
;; not C.
(if (treesit-ready-p 'cpp)
- (add-to-list 'auto-mode-alist
- '("\\(\\.ii\\|\\.\\(CC?\\|HH?\\)\\|\\.[ch]\\(pp\\|xx\\|\\+\\+\\)\\|\\.\\(cc\\|hh\\)\\)\\'"
- . c++-ts-mode)))
+ (add-to-list 'major-mode-remap-defaults
+ '(c++-mode . c++-ts-mode)))
(when (treesit-ready-p 'c)
- (add-to-list 'auto-mode-alist
- '("\\(\\.[chi]\\|\\.lex\\|\\.y\\(acc\\)?\\)\\'" . c-ts-mode))
- (add-to-list 'auto-mode-alist '("\\.x[pb]m\\'" . c-ts-mode))
- ;; image-mode's association must be before the C mode, otherwise XPM
- ;; images will be initially visited as C files. Also note that the
- ;; regexp must be different from what files.el does, or else
- ;; add-to-list will not add the association where we want it.
- (add-to-list 'auto-mode-alist '("\\.x[pb]m\\'" . image-mode)))
-
-(if (and (treesit-ready-p 'cpp)
- (treesit-ready-p 'c))
- (add-to-list 'auto-mode-alist '("\\.h\\'" . c-or-c++-ts-mode)))
+ (add-to-list 'major-mode-remap-defaults '(c++-mode . c++-ts-mode))
+ (add-to-list 'major-mode-remap-defaults '(c-mode . c-ts-mode)))
+
+(when (and (treesit-ready-p 'cpp)
+ (treesit-ready-p 'c))
+ (add-to-list 'major-mode-remap-defaults '(c-or-c++-mode . c-or-c++-ts-mode)))
(provide 'c-ts-mode)
(provide 'c++-ts-mode)
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index 64a679eacc7..6e98ce047c3 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -2902,15 +2902,19 @@ c-or-c++-mode
the code is C or C++ and based on that chooses whether to enable
`c-mode' or `c++-mode'."
(interactive)
- (if (save-excursion
- (save-restriction
- (save-match-data
- (widen)
- (goto-char (point-min))
- (re-search-forward c-or-c++-mode--regexp
- (+ (point) c-guess-region-max) t))))
- (c++-mode)
- (c-mode)))
+ (let ((mode
+ (if (save-excursion
+ (save-restriction
+ (save-match-data
+ (widen)
+ (goto-char (point-min))
+ (re-search-forward c-or-c++-mode--regexp
+ (+ (point) c-guess-region-max) t))))
+ 'c++-mode)
+ 'c-mode))
+ (funcall (if (fboundp 'major-mode-remap)
+ (major-mode-remap mode)
+ mode))))
;; Support for C++
diff --git a/lisp/progmodes/go-ts-mode.el b/lisp/progmodes/go-ts-mode.el
index 65adc1c55ea..296e4d0037d 100644
--- a/lisp/progmodes/go-ts-mode.el
+++ b/lisp/progmodes/go-ts-mode.el
@@ -262,6 +262,8 @@ go-ts-mode
(treesit-major-mode-setup)))
(if (treesit-ready-p 'go)
+ ;; FIXME: Should we instead put `go-mode' in `auto-mode-alist'
+ ;; and then use `major-mode-remap-defaults' to map it to `go-ts-mode'?
(add-to-list 'auto-mode-alist '("\\.go\\'" . go-ts-mode)))
(defun go-ts-mode--defun-name (node &optional skip-prefix)
diff --git a/lisp/progmodes/ruby-ts-mode.el b/lisp/progmodes/ruby-ts-mode.el
index 426ae248cac..cdfa3dca498 100644
--- a/lisp/progmodes/ruby-ts-mode.el
+++ b/lisp/progmodes/ruby-ts-mode.el
@@ -1211,18 +1211,8 @@ ruby-ts-mode
(setq-local syntax-propertize-function #'ruby-ts--syntax-propertize))
(if (treesit-ready-p 'ruby)
- ;; Copied from ruby-mode.el.
- (add-to-list 'auto-mode-alist
- (cons (concat "\\(?:\\.\\(?:"
- "rbw?\\|ru\\|rake\\|thor"
- "\\|jbuilder\\|rabl\\|gemspec\\|podspec"
- "\\)"
- "\\|/"
- "\\(?:Gem\\|Rake\\|Cap\\|Thor"
- "\\|Puppet\\|Berks\\|Brew"
- "\\|Vagrant\\|Guard\\|Pod\\)file"
- "\\)\\'")
- 'ruby-ts-mode)))
+ (add-to-list 'major-mode-remap-defaults
+ '(ruby-mode . ruby-ts-mode)))
(provide 'ruby-ts-mode)
diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el
index 5c5ca573f38..d14953ef1c7 100644
--- a/lisp/textmodes/tex-mode.el
+++ b/lisp/textmodes/tex-mode.el
@@ -1032,17 +1032,13 @@ tex--redirect-to-submode
;; `tex--guess-mode' really tries to guess the *type* of file,
;; so we still need to consult `major-mode-remap-alist'
;; to see which mode to use for that type.
- (alist-get mode major-mode-remap-alist mode))))))
+ (major-mode-remap mode))))))
-;; The following three autoloaded aliases appear to conflict with
-;; AUCTeX. We keep those confusing aliases for those users who may
-;; have files annotated with -*- LaTeX -*- (e.g. because they received
+;; Support files annotated with -*- LaTeX -*- (e.g. because they received
;; them from someone using AUCTeX).
-;; FIXME: Turn them into autoloads so that AUCTeX can override them
-;; with its own autoloads? Or maybe rely on `major-mode-remap-alist'?
-;;;###autoload (defalias 'TeX-mode #'tex-mode)
-;;;###autoload (defalias 'plain-TeX-mode #'plain-tex-mode)
-;;;###autoload (defalias 'LaTeX-mode #'latex-mode)
+;;;###autoload (add-to-list 'major-mode-remap-defaults '(TeX-mode . tex-mode))
+;;;###autoload (add-to-list 'major-mode-remap-defaults '(plain-TeX-mode . plain-tex-mode))
+;;;###autoload (add-to-list 'major-mode-remap-defaults '(LaTeX-mode . latex-mode))
;;;###autoload
(define-derived-mode plain-tex-mode tex-mode "TeX"
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#69191
; Package
emacs
.
(Wed, 21 Feb 2024 13:46:01 GMT)
Full text and
rfc822 format available.
Message #8 received at 69191 <at> debbugs.gnu.org (full text, mbox):
Stefan Monnier [2024-02-16 10:45 -0500] wrote:
> While `major-mode-remap-alist` provides a way for users to indicate the
> major mode of their choice, I think we need a similar variable for the
> use of packages.
>
> The package below accordingly adds a new `major-mode-remap-defaults`
> and changes various packages to obey it or make use of it.
> I think it nicely cleans the regexp duplication between CC-mode and
> `c-ts-mode.el` and also makes it easier/cleaner for users to override
> the changes made by `*-ts-mode.el`.
SGTM.
> There are some FIXMEs that one might want to address, most importantly
> whether we should use an indirection through `major-mode-remap-defaults`
> for all TS modes or only for those for which we provide a non-TS mode.
My gut says: we shouldn't add out-of-tree modes (e.g. go-mode) to
auto-mode-alist (they should and already do that themselves); and so
long as TS modes are viewed as an optional alternative, then they should
be responsible for setting up major-mode-remap-defaults (so it should be
a no-op if they remap from an out-of-tree mode that is not installed).
If/as TS modes become more canonical, perhaps the remapping should be
bidirectional?
> + (let ((mode
> + (if (save-excursion
> + (save-restriction
> + (save-match-data ; Why `save-match-data'?
> + (widen)
> + (goto-char (point-min))
> + (re-search-forward c-ts-mode--c-or-c++-regexp nil t))))
> + 'c++-ts-mode)
> + 'c-ts-mode))
I'm excited for this new let-syntax to catch on, but maybe as a separate
feature request.
> -;;;###autoload (defalias 'TeX-mode #'tex-mode)
> -;;;###autoload (defalias 'plain-TeX-mode #'plain-tex-mode)
> -;;;###autoload (defalias 'LaTeX-mode #'latex-mode)
> +;;;###autoload (add-to-list 'major-mode-remap-defaults '(TeX-mode . tex-mode))
> +;;;###autoload (add-to-list 'major-mode-remap-defaults '(plain-TeX-mode . plain-tex-mode))
> +;;;###autoload (add-to-list 'major-mode-remap-defaults '(LaTeX-mode . latex-mode))
Can we really afford to lose the aliases in loaddefs.el?
There are at least a few in-tree uses of the AUCTeX names.
Thanks,
--
Basil
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#69191
; Package
emacs
.
(Mon, 04 Mar 2024 04:27:04 GMT)
Full text and
rfc822 format available.
Message #11 received at 69191 <at> debbugs.gnu.org (full text, mbox):
>> There are some FIXMEs that one might want to address, most importantly
>> whether we should use an indirection through `major-mode-remap-defaults`
>> for all TS modes or only for those for which we provide a non-TS mode.
>
> My gut says: we shouldn't add out-of-tree modes (e.g. go-mode) to
> auto-mode-alist (they should and already do that themselves); and so
> long as TS modes are viewed as an optional alternative, then they should
> be responsible for setting up major-mode-remap-defaults (so it should be
> a no-op if they remap from an out-of-tree mode that is not installed).
I like the idea of using `go-mode` as the canonical mode, even if we
don't provide it. But I left this part unchanged for now.
>> + (let ((mode
>> + (if (save-excursion
>> + (save-restriction
>> + (save-match-data ; Why `save-match-data'?
>> + (widen)
>> + (goto-char (point-min))
>> + (re-search-forward c-ts-mode--c-or-c++-regexp nil t))))
>> + 'c++-ts-mode)
>> + 'c-ts-mode))
> I'm excited for this new let-syntax to catch on, but maybe as a separate
> feature request.
You think you're funny. eh?
>> -;;;###autoload (defalias 'TeX-mode #'tex-mode)
>> -;;;###autoload (defalias 'plain-TeX-mode #'plain-tex-mode)
>> -;;;###autoload (defalias 'LaTeX-mode #'latex-mode)
>> +;;;###autoload (add-to-list 'major-mode-remap-defaults '(TeX-mode . tex-mode))
>> +;;;###autoload (add-to-list 'major-mode-remap-defaults '(plain-TeX-mode . plain-tex-mode))
>> +;;;###autoload (add-to-list 'major-mode-remap-defaults '(LaTeX-mode . latex-mode))
>
> Can we really afford to lose the aliases in loaddefs.el?
> There are at least a few in-tree uses of the AUCTeX names.
Oops, indeed. Hmm... too bad, it means we still have to keep those
aliases a while longer.
Stefan
Reply sent
to
Stefan Monnier <monnier <at> iro.umontreal.ca>
:
You have taken responsibility.
(Mon, 04 Mar 2024 05:00:02 GMT)
Full text and
rfc822 format available.
Notification sent
to
Stefan Monnier <monnier <at> iro.umontreal.ca>
:
bug acknowledged by developer.
(Mon, 04 Mar 2024 05:00:02 GMT)
Full text and
rfc822 format available.
Message #16 received at 69191-done <at> debbugs.gnu.org (full text, mbox):
Pushed with corresponding updates,
Stefan
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#69191
; Package
emacs
.
(Wed, 06 Mar 2024 00:05:01 GMT)
Full text and
rfc822 format available.
Message #19 received at 69191 <at> debbugs.gnu.org (full text, mbox):
On 04/03/2024 06:25, Stefan Monnier via Bug reports for GNU Emacs, the
Swiss army knife of text editors wrote:
>>> There are some FIXMEs that one might want to address, most importantly
>>> whether we should use an indirection through `major-mode-remap-defaults`
>>> for all TS modes or only for those for which we provide a non-TS mode.
>> My gut says: we shouldn't add out-of-tree modes (e.g. go-mode) to
>> auto-mode-alist (they should and already do that themselves); and so
>> long as TS modes are viewed as an optional alternative, then they should
>> be responsible for setting up major-mode-remap-defaults (so it should be
>> a no-op if they remap from an out-of-tree mode that is not installed).
> I like the idea of using `go-mode` as the canonical mode, even if we
> don't provide it. But I left this part unchanged for now.
The idea seems attractive, but what's going to happen in such a
configuration when go-ts-mode.el hasn't been loaded yet, and go-mode is
(without additional effort by the user) is not installed?
Just an error like
File mode specification error: (void-function go-mode)
, right?
I guess it's a bit more meaningful than silently visiting .go files in
fundamental-mode, but is that meaningful enough?
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#69191
; Package
emacs
.
(Wed, 06 Mar 2024 02:55:01 GMT)
Full text and
rfc822 format available.
Message #22 received at 69191 <at> debbugs.gnu.org (full text, mbox):
> The idea seems attractive, but what's going to happen in such
> a configuration when go-ts-mode.el hasn't been loaded yet, and go-mode is
> (without additional effort by the user) is not installed?
I'd expect that `go-ts-mode.el` would setup both `auto-mode-alist` and`
and `major-mode-remap-defaults` at the same time (probably at the same
time as the function's autoload), so I don't foresee any problem there.
[ There is a problem with `set-auto-mode` which may skip/ignore the
`go-mode` specification before even looking it up in
`major-mode-remap`, but that's in the process of being fixed
as part of bug#67795. ]
Stefan
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#69191
; Package
emacs
.
(Wed, 06 Mar 2024 23:17:02 GMT)
Full text and
rfc822 format available.
Message #25 received at 69191 <at> debbugs.gnu.org (full text, mbox):
On 06/03/2024 04:54, Stefan Monnier wrote:
>> The idea seems attractive, but what's going to happen in such
>> a configuration when go-ts-mode.el hasn't been loaded yet, and go-mode is
>> (without additional effort by the user) is not installed?
>
> I'd expect that `go-ts-mode.el` would setup both `auto-mode-alist` and`
> and `major-mode-remap-defaults` at the same time (probably at the same
> time as the function's autoload), so I don't foresee any problem there.
I suppose that's good for consistency, but proportionally less useful at
the same time.
The practical side of having go-mode in auto-mode-alist is being able to
build some "language association" at runtine, right? Or how did you
imagine this being used?
> [ There is a problem with `set-auto-mode` which may skip/ignore the
> `go-mode` specification before even looking it up in
> `major-mode-remap`, but that's in the process of being fixed
> as part of bug#67795. ]
>
>
> Stefan
>
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#69191
; Package
emacs
.
(Thu, 07 Mar 2024 03:41:02 GMT)
Full text and
rfc822 format available.
Message #28 received at 69191 <at> debbugs.gnu.org (full text, mbox):
>> I'd expect that `go-ts-mode.el` would setup both `auto-mode-alist` and`
>> and `major-mode-remap-defaults` at the same time (probably at the same
>> time as the function's autoload), so I don't foresee any problem there.
> I suppose that's good for consistency, but proportionally less useful at the
> same time.
Yeah probably not terribly useful. Nicer in terms of principles but not
clear if it would pay off.
Stefan
bug archived.
Request was from
Debbugs Internal Request <help-debbugs <at> gnu.org>
to
internal_control <at> debbugs.gnu.org
.
(Thu, 04 Apr 2024 11:24:27 GMT)
Full text and
rfc822 format available.
This bug report was last modified 1 year and 77 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.