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
This commit is contained in:
parent
858aab4c02
commit
c6c08d3f8f
5 changed files with 40 additions and 15 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
5
etc/NEWS
5
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
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Reference in a new issue