auctex
[Top][All Lists]
Advanced

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

Re: \documentclass does not activate latex-mode


From: Ikumi Keita
Subject: Re: \documentclass does not activate latex-mode
Date: Thu, 18 Aug 2022 16:40:18 +0900

Hi Jean, sorry for late response. I just came back from my summer
vacation.

>>>>> jfbu <jfbu@free.fr> writes:
> when I open a buffer on this file

> ----
> \def\foo{bar}
> \documentclass{foobar}
> \begin{document}
> hello
> \end{document}
> ----

> there is no activation of latex-mode.

> I have to manually type-in M-x latex-mode.

[...]

> Any hint to make my life less miserable?

Actually, AUCTeX is able to activate latex mode correctly, but emacs
built-in tex-mode.el interferes with it, due to the change installed in
emacs 28. :-(

For the time being, you can work around by
(let (entry)
  (while (setq entry (rassq 'tex-mode auto-mode-alist))
    (setcdr entry #'TeX-tex-mode)))
in your personal init file.

> But IMHO, should'nt \documentclass by itself trigger latex-mode?
> It is relatively frequent to have to put code before the
> \documentclass.

Yes. As I wrote above, there was no problem until emacs 27.

[To developpers]
In emacs 28, tex-mode.el changed `tex-mode' activation like this:
----------------------------------------------------------------------
(define-derived-mode tex-mode text-mode "generic-TeX"
  "...doc string..."
  (tex-common-initialization))

(advice-add 'tex-mode :around #'tex--redirect-to-submode)
(defvar tex-mode--recursing nil)
(defun tex--redirect-to-submode (orig-fun)
  "Redirect to one of the submodes when called directly."
  ;; The file may have "mode: tex" in the local variable
  ;; block, in which case we'll be called recursively
  ;; infinitely.  Inhibit that.
  (let ((tex-mode--recursing tex-mode--recursing))
    (funcall (if (or delay-mode-hooks tex-mode--recursing)
                 ;; We're called from one of the children already.
                 orig-fun
               (setq tex-mode--recursing t)
               (tex--guess-mode)))))
----------------------------------------------------------------------
This around advice for `tex-mode' broke AUCTeX's intention. At emacs
startup, AUCTeX adds override advice `TeX-tex-mode' to `tex-mode' in
tex-site.el. However, when tex-mode.el is autoloaded, it futher adds
around advice `tex--redirect-to-submode'.
By the nature of around advice, it bypasses the `orig-fun' (which is
essentially `TeX-tex-mode' by the override advice) and calls
`tex--guess-mode'. `tex--guess-mode' in tex-mode.el is not smart enough
to guess that Jean's example is latex document, ending up with calling
`plain-tex-mode'.

Why on earth does tex-mode.el use advice for its own function? The whole
above piece of code can just be composed up as
----------------------------------------------------------------------
(defvar tex-mode--recursing nil)
(define-derived-mode tex-mode text-mode "generic-TeX"
  "...doc string..."

  ;; The file may have "mode: tex" in the local variable
  ;; block, in which case we'll be called recursively
  ;; infinitely.  Inhibit that.
  (let ((tex-mode--recursing tex-mode--recursing))
    (if (or delay-mode-hooks tex-mode--recursing)
        ;; We're called from one of the children already.
        (tex-common-initialization)
      (setq tex-mode--recursing t)
      (tex--guess-mode))))
----------------------------------------------------------------------
without any advice, if I understand correctly.

I think we should file bug report for tex-mode.el. What do others think?

Regards,
Ikumi Keita
#StandWithUkraine #StopWarInUkraine



reply via email to

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