all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* custom: how do I augment an option?
@ 2012-09-05 17:56 Sam Steingold
  2012-09-05 18:27 ` Jambunathan K
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Sam Steingold @ 2012-09-05 17:56 UTC (permalink / raw)
  To: help-gnu-emacs

If I want to set a custom variable, I can do
--8<---------------cut here---------------start------------->8---
(custom-set-variables
 '(foo 42))
--8<---------------cut here---------------end--------------->8---
in my .emacs.
However, if I want to modify the custom variable, I have to resort to
something like
--8<---------------cut here---------------start------------->8---
(add-hook 'message-load-hook
  (lambda ()
    (add-to-list 'message-syntax-checks
                 '(long-lines . disabled))))
--8<---------------cut here---------------end--------------->8---
because
--8<---------------cut here---------------start------------->8---
(custom-set-variables
 '(message-syntax-checks (adjoin '(long-lines . disabled)
                                 message-syntax-checks
                                 :key 'equal)))
--8<---------------cut here---------------end--------------->8---
will evaluate `message-syntax-checks' too early:
--8<---------------cut here---------------start------------->8---
Debugger entered--Lisp error: (void-variable message-syntax-checks)
  (adjoin (quote (long-lines . disabled)) message-syntax-checks :key (quote equal))
  eval((adjoin (quote (long-lines . disabled)) message-syntax-checks :key (quote equal)))
  custom-initialize-reset(message-syntax-checks (if message-insert-canlock (quote ((sender . disabled))) nil))
  custom-declare-variable(message-syntax-checks...
  byte-code...
  require(message)
  byte-code...
  gnus-msg-mail(nil nil nil nil nil nil nil nil)
  compose-mail(nil nil nil nil)
  call-interactively(compose-mail nil nil)
--8<---------------cut here---------------end--------------->8---
(it also uses a CL function which emacs purists frown upon).

So, how do I use the custom facility to add something to a custom variable?
Thanks!

-- 
Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X 11.0.11103000
http://www.childpsy.net/ http://americancensorship.org http://jihadwatch.org
http://iris.org.il http://think-israel.org http://ffii.org
Don't use force -- get a bigger hammer.




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

* Re: custom: how do I augment an option?
  2012-09-05 17:56 custom: how do I augment an option? Sam Steingold
@ 2012-09-05 18:27 ` Jambunathan K
  2012-09-05 19:18 ` Sam Steingold
       [not found] ` <mailman.8164.1346872698.855.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 11+ messages in thread
From: Jambunathan K @ 2012-09-05 18:27 UTC (permalink / raw)
  To: sds; +Cc: help-gnu-emacs

Sam Steingold <sds@gnu.org> writes:

> (custom-set-variables
>  '(message-syntax-checks (adjoin '(long-lines . disabled)
>                                  message-syntax-checks
>                                  :key 'equal)))
>
> will evaluate `message-syntax-checks' too early:

I think the solution will involve using

    (get 'message-syntax-checks 'saved-value)

See (info "(elisp) Applying Customizations").
-- 



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

* Re: custom: how do I augment an option?
  2012-09-05 17:56 custom: how do I augment an option? Sam Steingold
  2012-09-05 18:27 ` Jambunathan K
@ 2012-09-05 19:18 ` Sam Steingold
  2012-09-05 20:04   ` Drew Adams
       [not found] ` <mailman.8164.1346872698.855.help-gnu-emacs@gnu.org>
  2 siblings, 1 reply; 11+ messages in thread
From: Sam Steingold @ 2012-09-05 19:18 UTC (permalink / raw)
  To: help-gnu-emacs

> * Sam Steingold <fqf@tah.bet> [2012-09-05 13:56:20 -0400]:
>
> (custom-set-variables
>  '(message-syntax-checks (adjoin '(long-lines . disabled)
>                                  message-syntax-checks
>                                  :key 'equal)))
> will evaluate `message-syntax-checks' too early:

The "solution" is
--8<---------------cut here---------------start------------->8---
(custom-set-variables
 '(message-syntax-checks
   (adjoin '(long-lines . disabled)
    (eval (car (get 'message-syntax-checks 'standard-value)))
    :test 'equal)))
--8<---------------cut here---------------end--------------->8---
which uses `eval' on top of `adjoin'.

So, what is the official method?

-- 
Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X 11.0.11103000
http://www.childpsy.net/ http://dhimmi.com http://jihadwatch.org
http://honestreporting.com http://iris.org.il http://thereligionofpeace.com
Save your burned out bulbs for me, I'm building my own dark room.




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

* RE: custom: how do I augment an option?
  2012-09-05 19:18 ` Sam Steingold
@ 2012-09-05 20:04   ` Drew Adams
  2012-09-05 20:45     ` Sam Steingold
  0 siblings, 1 reply; 11+ messages in thread
From: Drew Adams @ 2012-09-05 20:04 UTC (permalink / raw)
  To: sds, help-gnu-emacs

>> If I want to set a custom variable, I can do
>> 
>> (custom-set-variables '(foo 42))
>>
>> in my .emacs.  However, if I want to modify the custom variable,
>> I have to resort to something like
>> 
>> (add-hook 'message-load-hook
>>   (lambda ()
>>     (add-to-list 'message-syntax-checks '(long-lines . disabled))))

No, you do not have to resort to doing that.

> The "solution" is
>
> (custom-set-variables
>  '(message-syntax-checks
>    (adjoin '(long-lines . disabled)
>     (eval (car (get 'message-syntax-checks 'standard-value)))
>     :test 'equal)))
>
> which uses `eval' on top of `adjoin'.
> So, what is the official method?

Sorry, but I don't see what the problem is.  Why not just use Customize?

At the very least you could use Customize to see what it writes out.  If you
start with Emacs -Q and add (long-lines . disabled) to the default value then it
writes this:

'(message-syntax-checks
   (quote ((sender . disabled) (long-lines . disabled))))

`M-x customize-option' lets you not worry about the Lisp form to use.

But if for some reason you prefer to worry about it, the "solution" is to ask
Emacs what Lisp code it uses, i.e., use Customize to see what it does.




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

* Re: custom: how do I augment an option?
  2012-09-05 20:04   ` Drew Adams
@ 2012-09-05 20:45     ` Sam Steingold
  2012-09-05 21:15       ` Drew Adams
  0 siblings, 1 reply; 11+ messages in thread
From: Sam Steingold @ 2012-09-05 20:45 UTC (permalink / raw)
  To: Drew Adams; +Cc: help-gnu-emacs

> * Drew Adams <qerj.nqnzf@benpyr.pbz> [2012-09-05 13:04:36 -0700]:
>
>>> If I want to set a custom variable, I can do
>>> 
>>> (custom-set-variables '(foo 42))
>>>
>>> in my .emacs.  However, if I want to modify the custom variable,
>>> I have to resort to something like
>>> 
>>> (add-hook 'message-load-hook
>>>   (lambda ()
>>>     (add-to-list 'message-syntax-checks '(long-lines . disabled))))
>
> No, you do not have to resort to doing that.
>
>> The "solution" is
>>
>> (custom-set-variables
>>  '(message-syntax-checks
>>    (adjoin '(long-lines . disabled)
>>     (eval (car (get 'message-syntax-checks 'standard-value)))
>>     :test 'equal)))
>>
>> which uses `eval' on top of `adjoin'.
>> So, what is the official method?
>
> Sorry, but I don't see what the problem is.  Why not just use Customize?

I don't like the gui; also see below (sneak preview: customize is broken :-).

> At the very least you could use Customize to see what it writes out.  If you
> start with Emacs -Q and add (long-lines . disabled) to the default value then it
> writes this:
>
> '(message-syntax-checks
>    (quote ((sender . disabled) (long-lines . disabled))))

Hah, but this is wrong!
The correct value of message-syntax-checks depends on message-insert-canlock:

(get 'message-syntax-checks 'standard-value)
==> ((if message-insert-canlock (quote ((sender . disabled))) nil))

While if I go your way, then message-syntax-checks will not depend on
message-insert-canlock!

-- 
Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X 11.0.11103000
http://www.childpsy.net/ http://openvotingconsortium.org
http://ffii.org http://thereligionofpeace.com http://honestreporting.com
Beliefs divide, doubts unite.



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

* RE: custom: how do I augment an option?
  2012-09-05 20:45     ` Sam Steingold
@ 2012-09-05 21:15       ` Drew Adams
  2012-09-05 21:27         ` Drew Adams
  0 siblings, 1 reply; 11+ messages in thread
From: Drew Adams @ 2012-09-05 21:15 UTC (permalink / raw)
  To: sds; +Cc: help-gnu-emacs

> > Why not just use Customize?
> 
> I don't like the gui;

I don't like the GUI either.  Which is why I've made improvement suggestions,
filed bug reports, and come up some extensions of my own.

But I recognize that the GUI at least _works_, and it can often give you answers
to questions like the one you raised.

And I've seen a fair amount of hand-coded customize-workaround stuff in .emacs
files that does _not_ work or does not provide the type-checking and proper
initialization/setting code that Customize provides.

It is not uncommon for people to underestimate Customize, IMO.  Customize is in
fact surprisingly solid, and it does quite a lot that you or I might never think
to do by hand.

IOW, if you don't want to use the GUI then there is a fair amount that you
become responsible for getting right, if you want the same solid result.  This
is even more true if you write code that others will use, since they will do
things differently from what you might expect.

> also see below (sneak preview: customize is broken :-).

Please, don't just tell us here.  `M-x report-emacs-bug', if you think Emacs
code is broken.  That's the only real hope (however slim it might be in some
cases) of getting something fixed.

In all likelihood (my guess), if "customize" does not seem to do the right thing
in this particular case it is not because Customize is broken but because the
programmer who coded this particular user option did not do the right thing.
Those are not the same thing.  And the devil is in the details.  So provide the
details to Emacs Dev by reporting a bug.

You would not say "Lisp is broken" just because some programmer wrote some Lisp
code that didn't work, would you?

> While if I go your way, then message-syntax-checks will not depend on
> message-insert-canlock!

It is not my way.  I don't even use `message-syntax-checks' or Gnus, at all.
And I have _no_ plans to ever do so.

I do use `defcustom' heavily (more and more so), and I do use the Customize GUI.

FWIW, I didn't used to use Customize.  Like you, I was convinced that my reason
for that was that I didn't like the GUI.  I changed my mind about using it years
ago, though I am still of the opinion that the GUI sucks.  And the underlying
Lisp code is virtually impenetrable, if not a mine field.

What does not suck, however, is what Customize _does_, as opposed to how
ugly/inconvenient it might be to use or how hard its code might be to fathom.

I use a separate `custom-file' (Touches pas a mon .emacs!), and I find that
letting Customize handle my option & face customizations is a lot less
problematic than fiddling with the equivalent Lisp code myself.  YMMV.

I'm not trying to convince you - just telling my own story.  IMHO, Customize is
your friend - ugly and hard to understand, but your friend nonetheless.




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

* RE: custom: how do I augment an option?
  2012-09-05 21:15       ` Drew Adams
@ 2012-09-05 21:27         ` Drew Adams
  0 siblings, 0 replies; 11+ messages in thread
From: Drew Adams @ 2012-09-05 21:27 UTC (permalink / raw)
  To: sds; +Cc: help-gnu-emacs

> > also see below (sneak preview: customize is broken :-).
> 
> Please, don't just tell us here.  `M-x report-emacs-bug', if 
> you think Emacs code is broken.  That's the only real hope
> (however slim it might be in some cases) of getting something fixed.
> 
> In all likelihood (my guess), if "customize" does not seem to 
> do the right thing in this particular case it is not because
> Customize is broken but because the programmer who coded this
> particular user option did not do the right thing.
> Those are not the same thing.  And the devil is in the details.
> So provide the details to Emacs Dev by reporting a bug.

BTW, the doc string and source code comments seem to be an admission that there
are some remaining problems.  They suggest that this option is complex and is
not necessarily for most end users to fiddle with.  IOW, this is not your
typical option.

In the doc string:

 Don't touch this variable unless you really know what you're doing.

In the code comments:

 ;; Guess this one shouldn't be easy to customize...
...
 ; Fixme: improve this




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

* Re: custom: how do I augment an option?
       [not found] ` <mailman.8164.1346872698.855.help-gnu-emacs@gnu.org>
@ 2012-09-06 13:14   ` Stefan Monnier
  2012-09-06 13:37     ` Drew Adams
  2012-09-06 18:20     ` Sam Steingold
  0 siblings, 2 replies; 11+ messages in thread
From: Stefan Monnier @ 2012-09-06 13:14 UTC (permalink / raw)
  To: help-gnu-emacs

> So, what is the official method?

There are 3 official methods:
1- forget about flexibility and just set the var to a constant value
   that does not depend on the default value.  That can be done from the GUI.
2- if you want to use actual code (instead of a mere constant), then
   don't use Customize, and use something like the add-hook code you showed.
3- submit a patch for Customize which lets the user specify not just
   a new value but a change (like a "diff") to the default value.
   For lists representing sets, a way for the user to specify elements
   to add and elements to remove would be great.  For lists where order
   matters, the user should additionally have some control over where to
   add elements.
Point 3 would be *really* welcome.

        Stefan


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

* RE: custom: how do I augment an option?
  2012-09-06 13:14   ` Stefan Monnier
@ 2012-09-06 13:37     ` Drew Adams
  2012-09-06 18:20     ` Sam Steingold
  1 sibling, 0 replies; 11+ messages in thread
From: Drew Adams @ 2012-09-06 13:37 UTC (permalink / raw)
  To: 'Stefan Monnier', help-gnu-emacs

> 3- submit a patch for Customize which lets the user specify
>    not just a new value but a change (like a "diff") to the
>    default value. For lists representing sets, a way for the
>    user to specify elements to add and elements to remove
>    would be great.  For lists where order matters, the user
>    should additionally have some control over where to add
>    elements.
> Point 3 would be *really* welcome.

+1

One reason this would be helpful would be simplicity of expression.  But
another, quite important reason IMO, would be some ability to better handle
updates of the default value, e.g. in a new version of the given defcustom.

For example, an option value that is a list of mappings of some kind might have
additional mappings by default in a newer version of the library.  If you have
already customized the option then you might not learn of the added
possibilities.  I see this fairly often.  You've customized based on the old
default value, not the new one.  Given some awareness of the change, you might
now want to customize the option differently.

But this problem of a changed default value is presented even for non-collection
options.  It would be good to have a simple (optional) way for users of a
library to be alerted that the default value of a given option or face that they
have customized has changed.

E.g., if the default value of `foo' was 3, you have customized it to 42, and the
default value is now nil, be able to be alerted to that default change.




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

* Re: custom: how do I augment an option?
  2012-09-06 13:14   ` Stefan Monnier
  2012-09-06 13:37     ` Drew Adams
@ 2012-09-06 18:20     ` Sam Steingold
  2012-10-26 18:21       ` Stefan Monnier
  1 sibling, 1 reply; 11+ messages in thread
From: Sam Steingold @ 2012-09-06 18:20 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

This was originally discussed on gnu-emacs-help, but it appears that the
further discussion should take place on emacs-devel.

I said:

If I want to _modify_ a custom variable, I have to resort to something like
--8<---------------cut here---------------start------------->8---
(add-hook 'message-load-hook
  (lambda ()
    (add-to-list 'message-syntax-checks
                 '(long-lines . disabled))))
--8<---------------cut here---------------end--------------->8---
which will break if `message-syntax-checks' ever acquires a setter
or
--8<---------------cut here---------------start------------->8---
(custom-set-variables
 '(message-syntax-checks
   (cl-adjoin '(long-lines . disabled)
    (eval (car (get 'message-syntax-checks 'standard-value)))
    :test 'equal)))
--8<---------------cut here---------------end--------------->8---
which uses a CL function _and_ also eval.

> * Stefan Monnier <zbaavre@veb.hzbagerny.pn> [2012-09-06 09:14:55 -0400]:
>
>> So, what is the official method?
>
> There are 3 official methods:
> 1- forget about flexibility and just set the var to a constant value
>    that does not depend on the default value.  That can be done from the GUI.

this sucks as it ignores the changes in the default value, as discussed
on gnu-emacs-help.

> 2- if you want to use actual code (instead of a mere constant), then
>    don't use Customize, and use something like the add-hook code you showed.

this sucks in case the custom variable in question ever acquires a
setter, as mentioned above.

> 3- submit a patch for Customize which lets the user specify not just
>    a new value but a change (like a "diff") to the default value.
>    For lists representing sets, a way for the user to specify elements
>    to add and elements to remove would be great.  For lists where order
>    matters, the user should additionally have some control over where to
>    add elements.
> Point 3 would be *really* welcome.

How about changing `custom-set-variables' to accept

(SYMBOL EXP [NOW [REQUEST [COMMENT [SETTER]]]])

instead of

(SYMBOL EXP [NOW [REQUEST [COMMENT]]])

where SETTER would be a function acceptable as the :set argument to
defcustom.

(Actually, I would prefer to replace the positional optional arguments
with keywords, like in `defcustom', but that would be an incompatible
change)

Also, semi-independently, I propose a function

(defun custom-standard-value (symbol)
  "Return the standard value of the customizable option."
  (eval (car (get symbol 'standard-value))))

A cheap ad-hoc fix for `message-syntax-checks' (and other set variables)
would be to give it a setter which would accept lists like (add ...) or
(delete ...).

-- 
Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X 11.0.11103000
http://www.childpsy.net/ http://dhimmi.com http://honestreporting.com
http://jihadwatch.org http://www.PetitionOnline.com/tap12009/
When you talk to God, it's prayer; when He talks to you, it's schizophrenia.



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

* Re: custom: how do I augment an option?
  2012-09-06 18:20     ` Sam Steingold
@ 2012-10-26 18:21       ` Stefan Monnier
  0 siblings, 0 replies; 11+ messages in thread
From: Stefan Monnier @ 2012-10-26 18:21 UTC (permalink / raw)
  To: emacs-devel

> If I want to _modify_ a custom variable, I have to resort to something like
> --8<---------------cut here---------------start------------->8---
> (custom-set-variables
>  '(message-syntax-checks
>    (cl-adjoin '(long-lines . disabled)
>     (eval (car (get 'message-syntax-checks 'standard-value)))
>     :test 'equal)))
> --8<---------------cut here---------------end--------------->8---
> which uses a CL function _and_ also eval.

While `adjoin' is frowned upon, using `cl-adjoin' is accepted.

> How about changing `custom-set-variables' to accept
> (SYMBOL EXP [NOW [REQUEST [COMMENT [SETTER]]]])
> instead of
> (SYMBOL EXP [NOW [REQUEST [COMMENT]]])
> where SETTER would be a function acceptable as the :set argument to
> defcustom.

That doesn't sound good to me.  A `setter' is the function that takes
the value of EXP and "puts it at the right place" (possibly changing it
to another representation along the way).  That sounds quite different
from what you want.

> Also, semi-independently, I propose a function
> (defun custom-standard-value (symbol)
>   "Return the standard value of the customizable option."
>   (eval (car (get symbol 'standard-value))))

That sounds OK.  Tho, since Custom also manages faces, it would make
sense to give it a name that includes "variable".  Sadly,
custom-variable-standard-value is already taken for "the same thing but
without `eval' and `car'".
OTOH, there's only one use of custom-variable-standard-value currently,
and we can hope that it's not used outside, so it might be OK to
change that use and hijack the name for your above function (post 24.3,
obviously).


        Stefan



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

end of thread, other threads:[~2012-10-26 18:21 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-05 17:56 custom: how do I augment an option? Sam Steingold
2012-09-05 18:27 ` Jambunathan K
2012-09-05 19:18 ` Sam Steingold
2012-09-05 20:04   ` Drew Adams
2012-09-05 20:45     ` Sam Steingold
2012-09-05 21:15       ` Drew Adams
2012-09-05 21:27         ` Drew Adams
     [not found] ` <mailman.8164.1346872698.855.help-gnu-emacs@gnu.org>
2012-09-06 13:14   ` Stefan Monnier
2012-09-06 13:37     ` Drew Adams
2012-09-06 18:20     ` Sam Steingold
2012-10-26 18:21       ` Stefan Monnier

Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.