]> code.delx.au - gnu-emacs/commitdiff
Make eval-defun on a pre-defined defcustom call any :set function
authorGlenn Morris <rgm@gnu.org>
Sun, 9 Dec 2012 01:04:43 +0000 (17:04 -0800)
committerGlenn Morris <rgm@gnu.org>
Sun, 9 Dec 2012 01:04:43 +0000 (17:04 -0800)
* lisp/emacs-lisp/lisp-mode.el (eval-defun-1): Doc fix.
Respect a defcustom's :set function, if appropriate.
(eval-defun): Doc fix.

* doc/lispref/customize.texi (Variable Definitions): Mention eval-defun
on a defcustom calls the :set function when appropriate.

* etc/NEWS: Mention this.

Fixes: debbugs:109
doc/lispref/ChangeLog
doc/lispref/customize.texi
etc/NEWS
lisp/ChangeLog
lisp/emacs-lisp/lisp-mode.el

index a26bfdc2e4b3559c39d410d468fd7e58c6b732dd..7238d958d8a6dbb579c31727c2a49666c0170d89 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-09  Glenn Morris  <rgm@gnu.org>
+
+       * customize.texi (Variable Definitions): Mention eval-defun
+       on a defcustom calls the :set function when appropriate.
+
 2012-12-06  Paul Eggert  <eggert@cs.ucla.edu>
 
        * doclicense.texi, gpl.texi: Update to latest version from FSF.
index 1fb8bb3e71ab595fb06f5156b38c63a5b88edef1..c8d09760b534b7251cdf2bf64fe16ff82319db3a 100644 (file)
@@ -308,8 +308,10 @@ Every @code{defcustom} should specify @code{:group} at least once.
 When you evaluate a @code{defcustom} form with @kbd{C-M-x} in Emacs Lisp
 mode (@code{eval-defun}), a special feature of @code{eval-defun}
 arranges to set the variable unconditionally, without testing whether
-its value is void.  (The same feature applies to @code{defvar}.)
-@xref{Defining Variables}.
+its value is void.  (The same feature applies to @code{defvar},
+@pxref{Defining Variables}.)  Using @code{eval-defun} on a defcustom
+that is already defined calls the @code{:set} function (see below),
+if there is one.
 
 If you put a @code{defcustom} in a pre-loaded Emacs Lisp file
 (@pxref{Building Emacs}), the standard value installed at dump time
index 242b8929fd238410a2a31d1f3d797f3a92ee1954..361e49afe04e6911a5fcb293e8a38be4f6af494b 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -24,6 +24,11 @@ so we will look at it and add it to the manual.
 * Installation Changes in Emacs 24.4
 * Startup Changes in Emacs 24.4
 * Changes in Emacs 24.4
+
++++
+** `eval-defun' on an already defined defcustom calls the :set function,
+if there is one.
+
 * Editing Changes in Emacs 24.4
 
 \f
index 6bf6726986eb33113d5e02d39247f3df38ecbbf4..8515c110c42f0a2466346887777e06dd5b352b7c 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-09  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/lisp-mode.el (eval-defun-1): Doc fix.
+       Respect a defcustom's :set function, if appropriate.  (Bug#109)
+       (eval-defun): Doc fix.
+
 2012-12-08  Juri Linkov  <juri@jurta.org>
 
        * info.el (Info-copy-current-node-name, Info-breadcrumbs)
index c0380c60e11e86bca376e348cd07d176ff8f7564..df6680a6d941b25cff7960b5f9e8e4b50126c48c 100644 (file)
@@ -830,6 +830,7 @@ this command arranges for all errors to enter the debugger."
 (defun eval-defun-1 (form)
   "Treat some expressions specially.
 Reset the `defvar' and `defcustom' variables to the initial value.
+\(For `defcustom', use the :set function if there is one.)
 Reinitialize the face according to the `defface' specification."
   ;; The code in edebug-defun should be consistent with this, but not
   ;; the same, since this gets a macroexpanded form.
@@ -845,14 +846,19 @@ Reinitialize the face according to the `defface' specification."
        ;; `custom-declare-variable' with a quoted value arg.
        ((and (eq (car form) 'custom-declare-variable)
              (default-boundp (eval (nth 1 form) lexical-binding)))
-        ;; Force variable to be bound.
-        (set-default (eval (nth 1 form) lexical-binding)
-                     ;; The second arg is an expression that evaluates to
-                     ;; an expression.  The second evaluation is the one
-                     ;; normally performed not be normal execution but by
-                     ;; custom-initialize-set (for example), which does not
-                     ;; use lexical-binding.
-                     (eval (eval (nth 2 form) lexical-binding)))
+        ;; Force variable to be bound, using :set function if specified.
+        (let ((setfunc (memq :set form)))
+          (when setfunc
+            (setq setfunc (car-safe (cdr-safe setfunc)))
+            (or (functionp setfunc) (setq setfunc nil)))
+          (funcall (or setfunc 'set-default)
+                   (eval (nth 1 form) lexical-binding)
+                   ;; The second arg is an expression that evaluates to
+                   ;; an expression.  The second evaluation is the one
+                   ;; normally performed not by normal execution but by
+                   ;; custom-initialize-set (for example), which does not
+                   ;; use lexical-binding.
+                   (eval (eval (nth 2 form) lexical-binding))))
         form)
        ;; `defface' is macroexpanded to `custom-declare-face'.
        ((eq (car form) 'custom-declare-face)
@@ -915,11 +921,12 @@ Return the result of evaluation."
 
 If the current defun is actually a call to `defvar' or `defcustom',
 evaluating it this way resets the variable using its initial value
-expression even if the variable already has some other value.
-\(Normally `defvar' and `defcustom' do not alter the value if there
-already is one.)  In an analogous way, evaluating a `defface'
-overrides any customizations of the face, so that it becomes
-defined exactly as the `defface' expression says.
+expression (using the defcustom's :set function if there is one), even
+if the variable already has some other value.  \(Normally `defvar' and
+`defcustom' do not alter the value if there already is one.)  In an
+analogous way, evaluating a `defface' overrides any customizations of
+the face, so that it becomes defined exactly as the `defface' expression
+says.
 
 If `eval-expression-debug-on-error' is non-nil, which is the default,
 this command arranges for all errors to enter the debugger.