auctex-devel
[Top][All Lists]
Advanced

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

Re: AUCTeX and "builtin latex mode" integration


From: Stefan Monnier
Subject: Re: AUCTeX and "builtin latex mode" integration
Date: Tue, 31 Jan 2023 16:41:01 -0500
User-agent: Gnus/5.13 (Gnus v5.13)

> 1. I first tried [A] because [B] wouldn't be easy to retain
> compatibility for users who have
>    - a lot of files with "mode: latex" tag in the file local variables
>      section.

The `mode:` specifies which function is called to enable the mode,
rather than which value of `major-mode` will be used in the resulting buffer.

`mode: latex` means that we'll call `latex-mode` and that function can
activate AUCTeX's `LaTeX-mode` (which sets `major-mode` to `LaTeX-mode`)
without any trouble.

[ And in Emacs-30, you can use `major-mode-remap-alist` so that
  `mode: latex` will not call `latex-mode` but some other function,
  such as `LaTeX-mode`.  ]

>    - hard-coded mode names in their personal customized codes.

I don't know what problem you're thinking of here.

> The keymaps of AUCTeX LaTeX mode and built-in latex mode have a lot of
> overlaps.

And conflicts, yes :-(

> It seems difficult to me to separate all of them. In
> tex-mode.el, we see:
> ----------------------------------------------------------------------
> (defun tex-define-common-keys (keymap)
>   "Define the keys that we want defined both in TeX mode and in the TeX 
> shell."
>   (define-key keymap "\C-c\C-k" #'tex-kill-job)
>   (define-key keymap "\C-c\C-l" #'tex-recenter-output-buffer)
>   (define-key keymap "\C-c\C-q" #'tex-show-print-queue)
> [...]
>   (define-key keymap "\C-c\C-v" #'tex-view)
> [...]
> (defvar tex-mode-map
>   (let ((map (make-sparse-keymap)))
> [...]
>     (define-key map "\"" #'tex-insert-quote)
>     (define-key map "\n" #'tex-handle-newline)
>     (define-key map "\M-\r" #'latex-insert-item)
> [...]
>     (define-key map "\C-c{" #'tex-insert-braces)
> [...]
>     (define-key map "\C-c\C-c" #'tex-compile)
>     (define-key map "\C-c\C-i" #'tex-bibtex-file)
>     (define-key map "\C-c\C-o" #'latex-insert-block)
>
>     ;; Redundant keybindings, for consistency with SGML mode.
>     (define-key map "\C-c\C-t" #'latex-insert-block)
> [...]
>     (define-key map "\C-c/" #'latex-close-block)
>
>     (define-key map "\C-c\C-e" #'latex-close-block)
> [...]
>     (define-key map "\C-c\C-m" #'tex-feed-input)
> [...]
> (defvar latex-mode-map
>   (let ((map (make-sparse-keymap)))
> [...]
>     (define-key map "\C-c\C-s" #'latex-split-block)
> ----------------------------------------------------------------------
> All these key sequences have different binding in AUCTeX (+RefTeX).
> Thus I don't see a clean way to meet the assumption "if we can arrange
> for latex-mode and auctex-mode not to collide in their keymaps".

[ Side note: RefTeX is also used with plan `latex-mode`.  ]

AFAIK the only clean way is to actually change those bindings.
Yes, users will complain, and it may even break some 3rd party code, so
it'll be somewhat painful.

> In addition, I'm afraid that menus and tool bars are intermixed if we
> use `make-composed-keymap' for these two keymaps.

Indeed.  OTOH you should be able to completely hide the "base" menus (by
overriding their bindings with something silly like the `ignore`
command).

> 2. Thus I tried [B] next, in the hope that we can circumvent the above
> mentioned difficulties by similar workarounds employed in the current
> startup codes and announcement to the users.
>
> If we are to take this approach, I think that the new mode name should
> be, e.g., "LaTeX-mode" because the user-exposed functions and variables
> have that prefix now.

Agreed.

> because tex-mode.el has these lines:
> ----------------------------------------------------------------------
> ;;;###autoload
> (defalias 'TeX-mode #'tex-mode)
> ;;;###autoload
> (defalias 'plain-TeX-mode #'plain-tex-mode)
> ;;;###autoload
> (defalias 'LaTeX-mode #'latex-mode)
> ----------------------------------------------------------------------

Yuck!  These need to go!

> Hence I'd like to request to modify the built-in tex-modes.el to delete
> those lines, or at least to do fboundp test like
> (unless (fboundp 'LaTeX-mode)
>   (defalias 'LaTeX-mode #'latex-mode))
> in, say, emacs-30.

Agreed.  Could you open a bug report for that?
(with me in `X-Debbugs-Cc:`)
[ I wouldn't be surprised if there's a bit of reluctance to do that.  ]

> I'd like to discuss dispatch functions context-**-mode and
> japanese-**-mode here. They only do language-specific set-ups and turn
> into context-mode, latex-mode and plain-tex-mode eventually. In some
> aspects, they are similar with guess functions `tex--guess-mode' and
> `TeX-tex-mode':
> - They can be specified as `mode' tag of file local variable and entry
>   of `auto-mode-alist'.
> - They never hold their own `major-mode' value.
> - When called, they eventually turn into another proper major mode.
> Note that it isn't enough to do as
> (define-derived-mode japanese-latex-mode latex-mode "LaTeX"
>   ...
>   (setq major-mode 'latex-mode)
>   ...)
> because it doesn't respond to directory local variable entry of the form
> ((japanese-latex-mode
>   ...))
> in that case.

Hmm... this seems directly relevant to Emacs-30's new
`major-mode-remap-alist`.  Can you open another bug report (with me in
`X-Debbugs-Cc:`) to discuss this.  Basically, the question is what
notion of "major mode" should be used to lookup the directory-local
variable settings: should it be the major mode specified via `mode:` or
the one held in `major-mode` or yet something else?

> In addition, they don't need their own keymaps and syntax
> tables created by define-derived-mode. (Own hooks and abbrev tables may
> be useful, though.)

You can use `:keymap` and `:syntax-table` args to `define-derived-mode`
to avoid creating their own.


        Stefan




reply via email to

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