>From 5447814da30ffe9e9e06095fd567e8169df5fb64 Mon Sep 17 00:00:00 2001 From: Ikumi Keita Date: Sat, 21 Oct 2023 21:16:36 +0900 Subject: [PATCH] Add ugly hack to accept dir local vars with former mode names * tex.el (TeX-hack-former-dir-local-variables): New customize option. (TeX--hack-dir-locals-collect-variables): New function to advice `dir-locals-collect-variables'. When `major-mode' is one of major modes which have former name, pull in directory local variables declared under former name. Take into account the parent mode of the former mode as well. --- tex.el | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/tex.el b/tex.el index d4fded73..72b39e9b 100644 --- a/tex.el +++ b/tex.el @@ -3875,6 +3875,67 @@ Run after mode hooks and file local variables application." ;;;###autoload (put 'TeX-mode 'auctex-function-definition (symbol-function 'TeX-mode)) +;; COMPATIBILITY for Emacs<30 +;; hack for directory local variables +(defcustom TeX-hack-former-dir-local-variables nil + "If non-nil, apply dir local vars under former mode names. +For example, directory local variables prepared for `latex-mode' +will be available in `LaTeX-mode' buffers. +It is highly discouraged to enable this option. Instead, please +rewrite mode names in .dir-locals.el whenever possible." + :group 'TeX-misc + :type 'boolean) + +(advice-add 'dir-locals-collect-variables :around + #'TeX--hack-dir-locals-collect-variables) +(defun TeX--hack-dir-locals-collect-variables (f &rest args) + ;; Call `dir-locals-collect-variables' once. + (let ((result (apply f args)) + entry former former-parent orig-former orig-former-parent) + (when (and TeX-hack-former-dir-local-variables + (setq entry + (cdr + (assq major-mode + ;; MAJOR-MODE FORMER FORMER-PARENT + '((plain-TeX-mode plain-tex-mode nil) + (LaTeX-mode latex-mode nil) + (docTeX-mode doctex-mode latex-mode) + (Texinfo-mode texinfo-mode nil) + (ConTeXt-mode context-mode nil) + (AmSTeX-mode ams-tex-mode nil) + (japanese-plain-TeX-mode japanese-plain-tex-mode plain-tex-mode) + (japanese-LaTeX-mode japanese-latex-mode latex-mode)))))) + (setq former (pop entry) ; former AUCTeX mode name, e.g. latex-mode + former-parent (pop entry)) ; former parent mode name + (setq orig-former-parent (get former 'derived-mode-parent)) + (put former 'derived-mode-parent former-parent) + ;; Very ugly hack to deceive `derived-mode-p'. Suppose + ;; - aaa-mode is an alias of bbb-mode + ;; - major-mode value is aaa-mode + ;; Then (derived-mode-p 'aaa-mode) returns nil on Emacs 28 and + ;; later, which makes `dir-locals-collect-variables' ignore a + ;; directory local variable entry for aaa-mode and look for an + ;; entry for bbb-mode instead. Hence we temporally make + ;; aaa-mode an alias of aaa-mode itself. :-( + (setq orig-former (symbol-function former)) + (fset former former) + (unwind-protect + (let ((major-mode former)) + ;; Append dir local vars with former mode names to return value. + ;; We need the next `setq' because `result' can be nil. + (setq result (nconc result (apply f args)))) + ;; Restore original state. + (put former 'derived-mode-parent orig-former-parent) + (fset former orig-former))) + result)) +;; The above treatment fails to pick the "correct" value when +;; .dir-locals.el assigns different value for the same variable +;; between latex-mode and japanese-latex-mode. In that case, the +;; value for latex-mode is picked up even in japanese-latex-mode +;; buffer, but I couldn't find a workaround. This is just a makeshift +;; for users who don't rewrite .dir-locals.el after all, thus let us +;; provide this as instrument with limitation. + ;;; Hilighting ;; FIXME: It's likely that `hilit-patterns-alist' is much obsolete. -- 2.42.0