diff options
| author | Stefan Monnier | 2017-12-27 17:49:39 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2017-12-27 17:49:39 -0500 |
| commit | fb619c1c22b986841964b09b7effe42785f3fed8 (patch) | |
| tree | 4714b2126dd72ce07b9aebe0f4f1321171d8b0b8 | |
| parent | f16ba58809fa9b83d42f2bb6b4722599bc98b408 (diff) | |
| download | emacs-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.el | 10 | ||||
| -rw-r--r-- | lisp/subr.el | 12 |
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. |
| 1849 | These forms come from `define-derived-mode'.") | 1848 | These 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'. |