aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2017-12-27 17:49:39 -0500
committerStefan Monnier2017-12-27 17:49:39 -0500
commitfb619c1c22b986841964b09b7effe42785f3fed8 (patch)
tree4714b2126dd72ce07b9aebe0f4f1321171d8b0b8
parentf16ba58809fa9b83d42f2bb6b4722599bc98b408 (diff)
downloademacs-fb619c1c22b986841964b09b7effe42785f3fed8.tar.gz
emacs-fb619c1c22b986841964b09b7effe42785f3fed8.zip
(delayed-after-hook-functions): Tighten the code a bit
* lisp/subr.el (delayed-mode-hooks, delayed-after-hook-functions): Use defvar-local. (run-mode-hooks): Reset delayed-after-hook-functions before running those functions, in case an error is signaled. * lisp/emacs-lisp/derived.el (define-derived-mode): Don't duplicate code.
-rw-r--r--lisp/emacs-lisp/derived.el10
-rw-r--r--lisp/subr.el12
2 files changed, 9 insertions, 13 deletions
diff --git a/lisp/emacs-lisp/derived.el b/lisp/emacs-lisp/derived.el
index c0ef199424b..3bb8eb4f2f2 100644
--- a/lisp/emacs-lisp/derived.el
+++ b/lisp/emacs-lisp/derived.el
@@ -281,12 +281,10 @@ No problems result if this variable is not bound.
281 ; Splice in the body (if any). 281 ; Splice in the body (if any).
282 ,@body 282 ,@body
283 ) 283 )
284 ;; Run the hooks, if any. 284 ,@(when after-hook
285 (run-mode-hooks ',hook) 285 `((push (lambda () ,after-hook) delayed-after-hook-functions)))
286 ,@(when after-hook 286 ;; Run the hooks (and delayed-after-hook-functions), if any.
287 `((if delay-mode-hooks 287 (run-mode-hooks ',hook)))))
288 (push (lambda () ,after-hook) delayed-after-hook-functions)
289 ,after-hook)))))))
290 288
291;; PUBLIC: find the ultimate class of a derived mode. 289;; PUBLIC: find the ultimate class of a derived mode.
292 290
diff --git a/lisp/subr.el b/lisp/subr.el
index 67209b4d4f6..76d7a1a556d 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1839,15 +1839,13 @@ if it is empty or a duplicate."
1839 1839
1840(defvar delay-mode-hooks nil 1840(defvar delay-mode-hooks nil
1841 "If non-nil, `run-mode-hooks' should delay running the hooks.") 1841 "If non-nil, `run-mode-hooks' should delay running the hooks.")
1842(defvar delayed-mode-hooks nil 1842(defvar-local delayed-mode-hooks nil
1843 "List of delayed mode hooks waiting to be run.") 1843 "List of delayed mode hooks waiting to be run.")
1844(make-variable-buffer-local 'delayed-mode-hooks)
1845(put 'delay-mode-hooks 'permanent-local t) 1844(put 'delay-mode-hooks 'permanent-local t)
1846 1845
1847(defvar delayed-after-hook-functions nil 1846(defvar-local delayed-after-hook-functions nil
1848 "List of delayed :after-hook forms waiting to be run. 1847 "List of delayed :after-hook forms waiting to be run.
1849These forms come from `define-derived-mode'.") 1848These forms come from `define-derived-mode'.")
1850(make-variable-buffer-local 'delayed-after-hook-functions)
1851 1849
1852(defvar change-major-mode-after-body-hook nil 1850(defvar change-major-mode-after-body-hook nil
1853 "Normal hook run in major mode functions, before the mode hooks.") 1851 "Normal hook run in major mode functions, before the mode hooks.")
@@ -1889,9 +1887,9 @@ running their FOO-mode-hook."
1889 (with-demoted-errors "File local-variables error: %s" 1887 (with-demoted-errors "File local-variables error: %s"
1890 (hack-local-variables 'no-mode))) 1888 (hack-local-variables 'no-mode)))
1891 (run-hooks 'after-change-major-mode-hook) 1889 (run-hooks 'after-change-major-mode-hook)
1892 (dolist (fun (nreverse delayed-after-hook-functions)) 1890 (dolist (fun (prog1 (nreverse delayed-after-hook-functions)
1893 (funcall fun)) 1891 (setq delayed-after-hook-functions nil)))
1894 (setq delayed-after-hook-functions nil))) 1892 (funcall fun))))
1895 1893
1896(defmacro delay-mode-hooks (&rest body) 1894(defmacro delay-mode-hooks (&rest body)
1897 "Execute BODY, but delay any `run-mode-hooks'. 1895 "Execute BODY, but delay any `run-mode-hooks'.