unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#30101: 25.3; defcustom does not clear old :options when reevaluated
@ 2018-01-13 22:14 Tim Landscheidt
  2018-01-14 20:32 ` Tim Landscheidt
  2020-08-29 15:11 ` Mauro Aranda
  0 siblings, 2 replies; 8+ messages in thread
From: Tim Landscheidt @ 2018-01-13 22:14 UTC (permalink / raw)
  To: 30101

If one evaluates first:

| (defcustom tmp-test-variable2 nil
|   "A vowel."
|   :type 'alist
|   :options '("A" "F" "I" "O" "U"))

and then changes "F" to "E" and evaluates:

| (defcustom tmp-test-variable2 nil
|   "A vowel."
|   :type 'alist
|   :options '("A" "E" "I" "O" "U"))

the resulting customization page looks like:

| Hide Tmp Test Variable2:
| [ ] Key: E
|     Value: nil
| [ ] Key: A
|     Value: nil
| [ ] Key: F
|     Value: nil
| [ ] Key: I
|     Value: nil
| [ ] Key: O
|     Value: nil
| [ ] Key: U
|     Value: nil
| INS
|     State : STANDARD.
|    A vowel.
| Groups: Nil

i. e., it is the superset of the :options of the two calls.
This is unexpected and undocumented.

AFAICT, this behaviour stems from lisp/custom.el's:

| […]
|                 ((eq keyword :options)
|                  (if (get symbol 'custom-options)
|                      ;; Slow safe code to avoid duplicates.
|                      (mapc (lambda (option)
|                              (custom-add-option symbol option))
|                            value)
|                    ;; Fast code for the common case.
|                    (put symbol 'custom-options (copy-sequence value))))
| […]

which has not been substantially touched since the initial
revision (d543e20b611fc289b174aa82cab940d873a586ff).

Is there any harm in always putting the copied sequence un-
conditionally?

(Workaround: (put 'tmp-test-variable2 'custom-options nil).)





^ permalink raw reply	[flat|nested] 8+ messages in thread

* bug#30101: 25.3; defcustom does not clear old :options when reevaluated
  2018-01-13 22:14 bug#30101: 25.3; defcustom does not clear old :options when reevaluated Tim Landscheidt
@ 2018-01-14 20:32 ` Tim Landscheidt
  2018-01-15  5:16   ` Eli Zaretskii
  2020-08-29 15:11 ` Mauro Aranda
  1 sibling, 1 reply; 8+ messages in thread
From: Tim Landscheidt @ 2018-01-14 20:32 UTC (permalink / raw)
  To: 30101

Further reading shows that this cumultative behaviour is
needed via custom-add-option by various files that enhance
the options of a different file's variables with it:

| [tim@passepartout ~/src/emacs]$ git grep custom-add-option -- \*.el
| lisp/calendar/diary-lib.el:(custom-add-option 'gnus-article-prepare-hook 'diary-from-outlook-gnus)
| lisp/custom.el:                      (custom-add-option symbol option))
| lisp/custom.el:(defun custom-add-option (symbol option)
| lisp/custom.el:(defalias 'custom-add-frequent-value 'custom-add-option)
| lisp/emacs-lisp/checkdoc.el:(custom-add-option 'emacs-lisp-mode-hook 'checkdoc-minor-mode)
| lisp/eshell/esh-mode.el:(custom-add-option 'eshell-pre-command-hook 'eshell-push-command-mark)
| lisp/eshell/esh-mode.el:(custom-add-option 'eshell-pre-command-hook 'eshell-push-command-mark)
| lisp/eshell/esh-mode.el:(custom-add-option 'eshell-input-filter-functions 'eshell-kill-new)
| lisp/eshell/esh-mode.el:(custom-add-option 'eshell-output-filter-functions
| lisp/eshell/esh-mode.el:(custom-add-option 'eshell-output-filter-functions
| lisp/eshell/esh-mode.el:(custom-add-option 'eshell-output-filter-functions
| lisp/eshell/esh-mode.el:(custom-add-option 'eshell-output-filter-functions
| lisp/gnus/message.el:(custom-add-option 'message-setup-hook 'message-check-recipients)
| lisp/gnus/nnmail.el:(custom-add-option 'nnmail-prepare-incoming-header-hook
| lisp/simple.el:(custom-add-option 'text-mode-hook 'turn-on-auto-fill)
| lisp/textmodes/flyspell.el:(custom-add-option 'text-mode-hook 'turn-on-flyspell)
| [tim@passepartout ~/src/emacs]$

So this behaviour cannot be changed, but should be document-
ed.





^ permalink raw reply	[flat|nested] 8+ messages in thread

* bug#30101: 25.3; defcustom does not clear old :options when reevaluated
  2018-01-14 20:32 ` Tim Landscheidt
@ 2018-01-15  5:16   ` Eli Zaretskii
  0 siblings, 0 replies; 8+ messages in thread
From: Eli Zaretskii @ 2018-01-15  5:16 UTC (permalink / raw)
  To: Tim Landscheidt; +Cc: 30101

> From: Tim Landscheidt <tim@tim-landscheidt.de>
> Date: Sun, 14 Jan 2018 20:32:19 +0000
> 
> So this behaviour cannot be changed, but should be document-
> ed.

Patches to document this will be welcome.

Thanks.





^ permalink raw reply	[flat|nested] 8+ messages in thread

* bug#30101: 25.3; defcustom does not clear old :options when reevaluated
  2018-01-13 22:14 bug#30101: 25.3; defcustom does not clear old :options when reevaluated Tim Landscheidt
  2018-01-14 20:32 ` Tim Landscheidt
@ 2020-08-29 15:11 ` Mauro Aranda
  2020-08-29 15:41   ` Eli Zaretskii
  1 sibling, 1 reply; 8+ messages in thread
From: Mauro Aranda @ 2020-08-29 15:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 30101, tim


[-- Attachment #1.1: Type: text/plain, Size: 299 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Tim Landscheidt <tim@tim-landscheidt.de>
>> Date: Sun, 14 Jan 2018 20:32:19 +0000
>>
>> So this behaviour cannot be changed, but should be document-
>> ed.
>
> Patches to document this will be welcome.
>
> Thanks.

I took a shot at it.  Please review.

[-- Attachment #1.2: Type: text/html, Size: 491 bytes --]

[-- Attachment #2: 0001-Improve-documentation-for-custom-options.patch --]
[-- Type: text/x-patch, Size: 2120 bytes --]

From 2315d1e3cec264ef89daea51772ee348ab187a3e Mon Sep 17 00:00:00 2001
From: Mauro Aranda <maurooaranda@gmail.com>
Date: Sat, 29 Aug 2020 12:04:27 -0300
Subject: [PATCH] Improve documentation for custom :options

* doc/lispref/customize.texi (Defining Customization Variables):
Mention that re-evaluating a defcustom form doesn't reset custom
options.  (Bug#30101)
* lisp/custom.el (custom-add-option): Mention the plist case in the
docstring.
---
 doc/lispref/customize.texi | 6 ++++++
 lisp/custom.el             | 9 +++++++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/doc/lispref/customize.texi b/doc/lispref/customize.texi
index 2a72276bc5..ee94c5e54e 100644
--- a/doc/lispref/customize.texi
+++ b/doc/lispref/customize.texi
@@ -479,6 +479,12 @@ Variable Definitions
    'my-lisp-mode-initialization)
 @end example
 
+Re-evaluating a @code{defcustom} form of an already defined user
+option does not clear the reasonable values added by previous
+evaluations, or by calls to @code{custom-add-frequent-value}.  This
+way, Lisp programs can add reasonable values for user options not yet
+defined.
+
 @defun custom-add-frequent-value symbol value
 For the customization option @var{symbol}, add @var{value} to the
 list of reasonable values.
diff --git a/lisp/custom.el b/lisp/custom.el
index 7581457ce8..8c09fa8ed0 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -578,9 +578,14 @@ custom-add-dependencies
 (defun custom-add-option (symbol option)
   "To the variable SYMBOL add OPTION.
 
+Custom then presents OPTION to the user as a suggested member
+for the value of SYMBOL.
+
 If SYMBOL's custom type is a hook, OPTION should be a hook member.
-If SYMBOL's custom type is an alist, OPTION specifies a symbol
-to offer to the user as a possible key in the alist.
+If SYMBOL's custom type is an alist, OPTION specifies a possible key
+in the alist.
+Similarly, if SYMBOL's custom type is a plist, OPTION specifies
+a possible name in the plist.
 For other custom types, this has no effect."
   (let ((options (get symbol 'custom-options)))
     (unless (member option options)
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* bug#30101: 25.3; defcustom does not clear old :options when reevaluated
  2020-08-29 15:11 ` Mauro Aranda
@ 2020-08-29 15:41   ` Eli Zaretskii
  2020-08-29 16:17     ` Mauro Aranda
  0 siblings, 1 reply; 8+ messages in thread
From: Eli Zaretskii @ 2020-08-29 15:41 UTC (permalink / raw)
  To: Mauro Aranda; +Cc: 30101, tim

> From: Mauro Aranda <maurooaranda@gmail.com>
> Date: Sat, 29 Aug 2020 12:11:07 -0300
> Cc: tim@tim-landscheidt.de, 30101@debbugs.gnu.org
> 
> I took a shot at it.  Please review.

Thanks, I have a few comments.

> * doc/lispref/customize.texi (Defining Customization Variables):
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The name in parentheses should be the name of the node, not of the
section.

> +Re-evaluating a @code{defcustom} form of an already defined user
> +option does not clear the reasonable values added by previous
> +evaluations, or by calls to @code{custom-add-frequent-value}.  This
> +way, Lisp programs can add reasonable values for user options not yet
> +defined.

This doesn't emphasize the fact that you are talking about
reevaluation after changing the option's values.  Without that, this
text doesn't drive the point home.

Also, I'd suggest to drop the "reasonable" part, as it gets in the way
of understanding the important parts by distracting the reader to
think about what "reasonable" means in this context.

> --- a/lisp/custom.el
> +++ b/lisp/custom.el
> @@ -578,9 +578,14 @@ custom-add-dependencies
>  (defun custom-add-option (symbol option)
>    "To the variable SYMBOL add OPTION.
>  
> +Custom then presents OPTION to the user as a suggested member
> +for the value of SYMBOL.
> +
>  If SYMBOL's custom type is a hook, OPTION should be a hook member.
> -If SYMBOL's custom type is an alist, OPTION specifies a symbol
> -to offer to the user as a possible key in the alist.
> +If SYMBOL's custom type is an alist, OPTION specifies a possible key
> +in the alist.
> +Similarly, if SYMBOL's custom type is a plist, OPTION specifies
> +a possible name in the plist.
>  For other custom types, this has no effect."

I don't think I understand what this tries to accomplish, or how it is
relevant to the issue discussed here.





^ permalink raw reply	[flat|nested] 8+ messages in thread

* bug#30101: 25.3; defcustom does not clear old :options when reevaluated
  2020-08-29 15:41   ` Eli Zaretskii
@ 2020-08-29 16:17     ` Mauro Aranda
  2020-09-01 15:00       ` Lars Ingebrigtsen
  0 siblings, 1 reply; 8+ messages in thread
From: Mauro Aranda @ 2020-08-29 16:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 30101, tim


[-- Attachment #1.1: Type: text/plain, Size: 2262 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> * doc/lispref/customize.texi (Defining Customization Variables):
>                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> The name in parentheses should be the name of the node, not of the
> section.

Right, sorry.

>> +Re-evaluating a @code{defcustom} form of an already defined user
>> +option does not clear the reasonable values added by previous
>> +evaluations, or by calls to @code{custom-add-frequent-value}.  This
>> +way, Lisp programs can add reasonable values for user options not yet
>> +defined.
>
> This doesn't emphasize the fact that you are talking about
> reevaluation after changing the option's values.  Without that, this
> text doesn't drive the point home.

Then perhaps it makes sense to split the paragraph, and talk about that
when describing the :options keyword?  I did that in this new patch.

> Also, I'd suggest to drop the "reasonable" part, as it gets in the way
> of understanding the important parts by distracting the reader to
> think about what "reasonable" means in this context.

Fair enough.  Dropped it.

>> --- a/lisp/custom.el
>> +++ b/lisp/custom.el
>> @@ -578,9 +578,14 @@ custom-add-dependencies
>>  (defun custom-add-option (symbol option)
>>    "To the variable SYMBOL add OPTION.
>>
>> +Custom then presents OPTION to the user as a suggested member
>> +for the value of SYMBOL.
>> +
>>  If SYMBOL's custom type is a hook, OPTION should be a hook member.
>> -If SYMBOL's custom type is an alist, OPTION specifies a symbol
>> -to offer to the user as a possible key in the alist.
>> +If SYMBOL's custom type is an alist, OPTION specifies a possible key
>> +in the alist.
>> +Similarly, if SYMBOL's custom type is a plist, OPTION specifies
>> +a possible name in the plist.
>>  For other custom types, this has no effect."
>
> I don't think I understand what this tries to accomplish, or how it is
> relevant to the issue discussed here.

The docstring didn't mention what was the effect if SYMBOL was a plist,
so I thought I'd take the chance of improving the docstring for the
function that also affects the suggested values.  But maybe that can be
left for another patch, so I dropped it in this new one.

Thanks for reviewing, I hope this patch is better.

[-- Attachment #1.2: Type: text/html, Size: 2784 bytes --]

[-- Attachment #2: 0001-Improve-documentation-for-custom-options.patch --]
[-- Type: text/x-patch, Size: 1503 bytes --]

From 14c226017b0e868cf68aef8f4d3b9a1e8cd94ab7 Mon Sep 17 00:00:00 2001
From: Mauro Aranda <maurooaranda@gmail.com>
Date: Sat, 29 Aug 2020 13:07:32 -0300
Subject: [PATCH] Improve documentation for custom :options

* doc/lispref/customize.texi (Variable Definitions):
Mention that re-evaluating a defcustom form doesn't reset custom
options.  (Bug#30101)
---
 doc/lispref/customize.texi | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/doc/lispref/customize.texi b/doc/lispref/customize.texi
index 2a72276bc5..fcfc0d297e 100644
--- a/doc/lispref/customize.texi
+++ b/doc/lispref/customize.texi
@@ -358,6 +358,10 @@ Variable Definitions
 @code{hook}, @code{plist} and @code{alist}.  See the definition of the
 individual types for a description of how to use @code{:options}.
 
+Re-evaluating a @code{defcustom} form with a different :options value
+does not clear the values added by previous evaluations, or by
+calls to @code{custom-add-frequent-value} (see below).
+
 @item :set @var{setfunction}
 @kindex set@r{, @code{defcustom} keyword}
 Specify @var{setfunction} as the way to change the value of this
@@ -485,6 +489,10 @@ Variable Definitions
 
 The precise effect of adding a value depends on the customization type
 of @var{symbol}.
+
+Since evaluating a @code{defcustom} form does not clear values added
+previously, Lisp programs can use this function to add values for user
+options not yet defined.
 @end defun
 
 Internally, @code{defcustom} uses the symbol property
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* bug#30101: 25.3; defcustom does not clear old :options when reevaluated
  2020-08-29 16:17     ` Mauro Aranda
@ 2020-09-01 15:00       ` Lars Ingebrigtsen
  2020-09-01 20:23         ` Mauro Aranda
  0 siblings, 1 reply; 8+ messages in thread
From: Lars Ingebrigtsen @ 2020-09-01 15:00 UTC (permalink / raw)
  To: Mauro Aranda; +Cc: 30101, tim

Mauro Aranda <maurooaranda@gmail.com> writes:

> Thanks for reviewing, I hope this patch is better.

Looks good to me -- I've now applied it to Emacs 28 (with a minor
rewording for clarity).

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 8+ messages in thread

* bug#30101: 25.3; defcustom does not clear old :options when reevaluated
  2020-09-01 15:00       ` Lars Ingebrigtsen
@ 2020-09-01 20:23         ` Mauro Aranda
  0 siblings, 0 replies; 8+ messages in thread
From: Mauro Aranda @ 2020-09-01 20:23 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 30101

[-- Attachment #1: Type: text/plain, Size: 253 bytes --]

Lars Ingebrigtsen <larsi@gnus.org> writes:

> Mauro Aranda <maurooaranda@gmail.com> writes:
>
>> Thanks for reviewing, I hope this patch is better.
>
> Looks good to me -- I've now applied it to Emacs 28 (with a minor
> rewording for clarity).

Thanks!

[-- Attachment #2: Type: text/html, Size: 419 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-09-01 20:23 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-13 22:14 bug#30101: 25.3; defcustom does not clear old :options when reevaluated Tim Landscheidt
2018-01-14 20:32 ` Tim Landscheidt
2018-01-15  5:16   ` Eli Zaretskii
2020-08-29 15:11 ` Mauro Aranda
2020-08-29 15:41   ` Eli Zaretskii
2020-08-29 16:17     ` Mauro Aranda
2020-09-01 15:00       ` Lars Ingebrigtsen
2020-09-01 20:23         ` Mauro Aranda

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).