]> git.eshelyaron.com Git - emacs.git/commitdiff
Add :before-hook keyword to define-derived-mode
authorPhil Sainty <psainty@orcon.net.nz>
Mon, 22 Apr 2019 06:14:55 +0000 (18:14 +1200)
committerPhil Sainty <psainty@orcon.net.nz>
Mon, 22 Apr 2019 06:14:55 +0000 (18:14 +1200)
* lisp/emacs-lisp/derived.el (define-derived-mode): New keyword
* doc/lispref/modes.texi: Update "(elisp) Derived Modes"
* etc/NEWS: Include under "Lisp Changes in Emacs 27.1"

doc/lispref/modes.texi
etc/NEWS
lisp/emacs-lisp/derived.el

index 4315b70ed72d4afe4b923cbe94143c2d9cb81ec0..925017dbc0c59bebf8e662d7142dbf3f740534ef 100644 (file)
@@ -807,8 +807,8 @@ documentation string.  If you omit @var{docstring},
 @code{define-derived-mode} generates a documentation string.
 
 The @var{keyword-args} are pairs of keywords and values.  The values,
-except for @code{:after-hook}'s, are evaluated.  The following
-keywords are currently supported:
+except for those of @code{:before-hook} and @code{:after-hook}, are
+evaluated.  The following keywords are currently supported:
 
 @table @code
 @item :syntax-table
@@ -832,6 +832,14 @@ this mode.  (Not all major modes have one.)  The command
 @code{customize-mode} uses this.  @code{define-derived-mode} does
 @emph{not} automatically define the specified customization group.
 
+@item :before-hook
+This optional keyword specifies a single Lisp form to evaluate as the
+very first act of the mode function, before any of the functions in
+@code{change-major-mode-hook} have been called.  It should not be
+quoted.  A @code{:before-hook} form is useful when the mode needs to
+see the original buffer state, before @code{kill-all-local-variables}
+has taken effect.
+
 @item :after-hook
 This optional keyword specifies a single Lisp form to evaluate as the
 final act of the mode function, after the mode hooks have been run.
index 4d76143b134722d14535fdb81222b21bae38af7a..00fc933acb9e4707cab04dcf1ee989889c908343 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1632,6 +1632,12 @@ be deleted has been made dead and removed from the frame list.
 The function now returns non-nil when the argument MODE is derived
 from any alias of any of MODES.
 
++++
+** 'define-derived-mode' can now specify a :before-hook form, which
+is evaluated before the 'change-major-mode-hook' functions.  This allows
+the macro to be used to define mode functions which need to act before
+'kill-all-local-variables'.
+
 +++
 ** New frame focus state inspection interface.
 The hooks 'focus-in-hook' and 'focus-out-hook' are now obsolete.
index 6db0584b987ad3dcd72ab5a9d7409e079eec6ca4..00aa70a10aa7ba165f372410aca876e3d3db7587 100644 (file)
@@ -137,6 +137,9 @@ BODY can start with a bunch of keyword arguments.  The following keyword
 :abbrev-table TABLE
        Use TABLE instead of the default (CHILD-abbrev-table).
        A nil value means to simply use the same abbrev-table as the parent.
+:before-hook FORM
+       A single lisp form which will be evaluated before anything else
+       happens in `change-major-mode-hook'.  It should not be quoted.
 :after-hook FORM
        A single lisp form which is evaluated after the mode hooks have been
        run.  It should not be quoted.
@@ -188,6 +191,7 @@ See Info node `(elisp)Derived Modes' for more details."
        (declare-syntax t)
        (hook (derived-mode-hook-name child))
        (group nil)
+        (before-hook nil)
         (after-hook nil))
 
     ;; Process the keyword args.
@@ -196,6 +200,7 @@ See Info node `(elisp)Derived Modes' for more details."
        (:group (setq group (pop body)))
        (:abbrev-table (setq abbrev (pop body)) (setq declare-abbrev nil))
        (:syntax-table (setq syntax (pop body)) (setq declare-syntax nil))
+        (:before-hook (setq before-hook (pop body)))
         (:after-hook (setq after-hook (pop body)))
        (_ (pop body))))
 
@@ -241,6 +246,9 @@ No problems result if this variable is not bound.
        (defun ,child ()
         ,docstring
         (interactive)
+         ,@(when before-hook
+             `((add-hook 'change-major-mode-hook (lambda () ,before-hook)
+                         nil t)))
                                        ; Run the parent.
         (delay-mode-hooks