GNU bug report logs -
#76781
Fontification of expl3 code
Previous Next
Reported by: Arash Esbati <arash <at> gnu.org>
Date: Thu, 6 Mar 2025 13:00:02 UTC
Severity: normal
Fixed in version 14.1.0
Done: Arash Esbati <arash <at> gnu.org>
Bug is archived. No further changes may be made.
Full log
Message #28 received at 76781 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
Hi Arash,
>>>>> Arash Esbati <arash <at> gnu.org> writes:
> Thanks, and no worries. I've installed the change with commit
> db11f39d. I'm closing this report, we can reopen once you have a closer
> look and something is off.
I found out the origin of this bug. The culprit is that font lock is
turned on too early.
1. Let me begin the discussion with quote of the comment in tex.el for
`find-file-hook':
,----
| ;; Let `TeX-master-file' be called after a new file was opened and
| ;; call `TeX-update-style' on any file opened. [...]
| ;;
| ;; `TeX-update-style' has to be called before
| ;; `global-font-lock-mode', which may also be specified in
| ;; `find-file-hook', gets called. Otherwise style-based
| ;; fontification will break (in XEmacs). That means, `add-hook'
| ;; cannot be called with a non-nil value of the APPEND argument.
| ;;
| ;; `(TeX-master-file nil nil t)' has to be called *before*
| ;; `TeX-update-style' as the latter will call `TeX-master-file'
| ;; without the `ask' bit set.
`----
As this rather old comment implies, AUCTeX assumes that
`TeX-update-style' runs _before_ font lock is turned on and style files
are written under that assumption.
If this assumtion holds, `font-lock-syntax-table' would be
initialized after "expl3" style hook sets the syntax table by
(set-syntax-table LaTeX-expl3-syntax-table)
and fontification would be done as expected.
However, modern emacsens actually don't satisfy that assumption.
Major mode functions run `global-font-lock-mode-enable-in-buffer'
(registered in `after-change-major-mode-hook'), which eventually
runs `font-lock-set-defaults' which set `font-lock-syntax-table'
at that time, copied from `docTeX-mode-syntax-table', not
`LaTeX-expl3-syntax-table'. Thus the fontification was broken.
2. I think that there are two approaches to this bug.
A: To move the call to `TeX-master-file' and `TeX-update-style' from
`find-file-hook' to somewhere run _before_
`after-change-major-mode-hook' and _after_ major mode hook and
local variables entries are applied.
B: To abandon the assumption in question and make a new AUCTeX policy
to write style files assuming that style hooks are run after font
lock is enabled.
In my view, A isn't satisfactory:
o It wouldn't be robust. The detail of the interaction between major
mode function and turning on of font lock can be subject to further
changes in future.
o There is no suitable place for such "somewhere". Looking at the
definition of `run-mode-hooks', the only possibility is to register
the calls as local hook of `after-change-major-mode-hook' but I'm
afraid that such treatment can break in future as described in the
previous item.
(On the other hand, there is a good aspect that we can merge call to
`TeX-update-sytle' for non-file buffer in `TeX-mode-cleanup'.)
If we take approach B, I think the proper solution is to use
`font-latex-add-to-syntax-alist' instead of re-calling
`font-lock-set-defaults' in expl3.el. See the attached patch.
Additionally, we would have to revise similarly existing style files
which install their own syntax tables. I expect this doesn't require
much work; Here is the output of "grep -E set-syntax-table *.el"
under style/ subdirectory:
brazilian.el: (set-syntax-table LaTeX-brazilian-mode-syntax-table)
bulgarian.el: (set-syntax-table LaTeX-bulgarian-mode-syntax-table)
expl3.el: (set-syntax-table LaTeX-expl3-syntax-table)
german.el: (set-syntax-table LaTeX-german-mode-syntax-table)
icelandic.el: (set-syntax-table LaTeX-icelandic-mode-syntax-table)
ngerman.el: (set-syntax-table LaTeX-german-mode-syntax-table)
plfonts.el: (set-syntax-table LaTeX-plfonts-mode-syntax-table)
plhb.el: (set-syntax-table LaTeX-plhb-mode-syntax-table)
polish.el: (set-syntax-table LaTeX-polish-mode-syntax-table)
portuguese.el: (set-syntax-table LaTeX-portuguese-mode-syntax-table)
What do you think about this?
Regards,
Ikumi Keita
#StandWithUkraine #StopWarInUkraine
#Gaza #StopMassiveKilling #CeasefireNOW
[0001-temporal-commit.patch (text/x-diff, attachment)]
This bug report was last modified 55 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.