From: Glenn Morris Date: Sun, 9 Dec 2012 01:04:43 +0000 (-0800) Subject: Make eval-defun on a pre-defined defcustom call any :set function X-Git-Tag: emacs-24.3.90~173^2~9^2 X-Git-Url: https://code.delx.au/gnu-emacs/commitdiff_plain/c6c08d3f8fe4d2c9e588189e46d60a30ef3e8d20 Make eval-defun on a pre-defined defcustom call any :set function * 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 --- diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index a26bfdc2e4..7238d958d8 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,8 @@ +2012-12-09 Glenn Morris + + * customize.texi (Variable Definitions): Mention eval-defun + on a defcustom calls the :set function when appropriate. + 2012-12-06 Paul Eggert * doclicense.texi, gpl.texi: Update to latest version from FSF. diff --git a/doc/lispref/customize.texi b/doc/lispref/customize.texi index 1fb8bb3e71..c8d09760b5 100644 --- a/doc/lispref/customize.texi +++ b/doc/lispref/customize.texi @@ -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 diff --git a/etc/NEWS b/etc/NEWS index 242b8929fd..361e49afe0 100644 --- 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 diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 6bf6726986..8515c110c4 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2012-12-09 Glenn Morris + + * 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 * info.el (Info-copy-current-node-name, Info-breadcrumbs) diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el index c0380c60e1..df6680a6d9 100644 --- a/lisp/emacs-lisp/lisp-mode.el +++ b/lisp/emacs-lisp/lisp-mode.el @@ -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.