unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Documentation not clear for the Lisp function set-variable
@ 2005-06-19 11:14 Yoni Rabkin
  2005-06-20  3:50 ` Richard Stallman
  0 siblings, 1 reply; 47+ messages in thread
From: Yoni Rabkin @ 2005-06-19 11:14 UTC (permalink / raw)


Hello, I'm on CVS GNU Emacs 22.0.50.1

As far as I understand, the function set-variable, called
interactively will only tab-complete the names of variables defined as
"interactive".

This fact is not stated in the documentation string for set-variable.
This is only mentioned (or could be understood) from the documentation
itself. The documentation string reads as follows:

"Set VARIABLE to VALUE.  VALUE is a Lisp object.
When using this interactively, enter a Lisp object for VALUE.
If you want VALUE to be a string, you must surround it with doublequotes.
VALUE is used literally, not evaluated.

If VARIABLE has a `variable-interactive' property, that is used as if
it were the arg to `interactive' (which see) to interactively read VALUE.

If VARIABLE has been defined with `defcustom', then the type information
in the definition is used to check that VALUE is valid.

With a prefix argument, set VARIABLE to VALUE buffer-locally."

This caused the following confusion: A user logged onto the #emacs irc
channel and asked why the variable frame-title-format was not listed
in the tab-completion for M-x set-variable.

This means that we have at least one case of someone being confused be
this. Since the name of the function is "set-variable", the limited
scope is not immediately clear.
-- 
"Cut your own wood and it will warm you twice"
	Regards, Yoni Rabkin Katzenell

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-19 11:14 Documentation not clear for the Lisp function set-variable Yoni Rabkin
@ 2005-06-20  3:50 ` Richard Stallman
  2005-06-20  8:21   ` Yoni Rabkin
                     ` (2 more replies)
  0 siblings, 3 replies; 47+ messages in thread
From: Richard Stallman @ 2005-06-20  3:50 UTC (permalink / raw)
  Cc: emacs-devel

How about this doc string?

(defun set-variable (var val &optional make-local)
  "Set VARIABLE to VALUE.  VALUE is a Lisp object.
VARIABLE should be a user option variable name, a Lisp variable
meant to be customized by users.  You should enter VALUE in Lisp syntax,
so if you want VALUE to be a string, you must surround it with doublequotes.
VALUE is used literally, not evaluated.

If VARIABLE has a `variable-interactive' property, that is used as if
it were the arg to `interactive' (which see) to interactively read VALUE.

If VARIABLE has been defined with `defcustom', then the type information
in the definition is used to check that VALUE is valid.

With a prefix argument, set VARIABLE to VALUE buffer-locally."

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-20  3:50 ` Richard Stallman
@ 2005-06-20  8:21   ` Yoni Rabkin
  2005-06-20  9:07   ` Juanma Barranquero
  2005-06-26 23:23   ` Juri Linkov
  2 siblings, 0 replies; 47+ messages in thread
From: Yoni Rabkin @ 2005-06-20  8:21 UTC (permalink / raw)


On 6/20/05, Richard Stallman <rms@gnu.org> wrote:
> How about this doc string?
> 
> (defun set-variable (var val &optional make-local)
>   "Set VARIABLE to VALUE.  VALUE is a Lisp object.
> VARIABLE should be a user option variable name, a Lisp variable
> meant to be customized by users.  You should enter VALUE in Lisp syntax,
> so if you want VALUE to be a string, you must surround it with doublequotes.
> VALUE is used literally, not evaluated.

[Snip]

I think that the above is a good doc string. The doc string states
clearly what VARIABLE is supposed to be.

-- 
"Cut your own wood and it will warm you twice"
	Regards, Yoni Rabkin Katzenell

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-20  3:50 ` Richard Stallman
  2005-06-20  8:21   ` Yoni Rabkin
@ 2005-06-20  9:07   ` Juanma Barranquero
  2005-06-21  2:00     ` Richard Stallman
  2005-06-26 23:23   ` Juri Linkov
  2 siblings, 1 reply; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-20  9:07 UTC (permalink / raw)
  Cc: emacs-devel

On 6/20/05, Richard Stallman <rms@gnu.org> wrote:
> How about this doc string?
> 
> (defun set-variable (var val &optional make-local)
>   "Set VARIABLE to VALUE.  VALUE is a Lisp object.

[...]

If you change the docstring, it'd be great to also change the argument
names to match the ones in the docstring, or at least to add \(fn
VARIABLE VALUE &optional MAKE-LOCAL).

-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-20  9:07   ` Juanma Barranquero
@ 2005-06-21  2:00     ` Richard Stallman
  0 siblings, 0 replies; 47+ messages in thread
From: Richard Stallman @ 2005-06-21  2:00 UTC (permalink / raw)
  Cc: emacs-devel

    If you change the docstring, it'd be great to also change the argument
    names to match the ones in the docstring, or at least to add \(fn
    VARIABLE VALUE &optional MAKE-LOCAL).

Ok, I will.  Thanks.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-20  3:50 ` Richard Stallman
  2005-06-20  8:21   ` Yoni Rabkin
  2005-06-20  9:07   ` Juanma Barranquero
@ 2005-06-26 23:23   ` Juri Linkov
  2005-06-27 13:04     ` Juanma Barranquero
  2005-06-27 16:46     ` Richard M. Stallman
  2 siblings, 2 replies; 47+ messages in thread
From: Juri Linkov @ 2005-06-26 23:23 UTC (permalink / raw)
  Cc: yonirabkin, emacs-devel

> How about this doc string?
>
> (defun set-variable (var val &optional make-local)
>   "Set VARIABLE to VALUE.  VALUE is a Lisp object.
> VARIABLE should be a user option variable name, a Lisp variable
> meant to be customized by users.  You should enter VALUE in Lisp syntax,
> so if you want VALUE to be a string, you must surround it with doublequotes.
> VALUE is used literally, not evaluated.
>
> If VARIABLE has a `variable-interactive' property, that is used as if
> it were the arg to `interactive' (which see) to interactively read VALUE.
>
> If VARIABLE has been defined with `defcustom', then the type information
> in the definition is used to check that VALUE is valid.
>
> With a prefix argument, set VARIABLE to VALUE buffer-locally."

There is one problem with `set-variable'.  When called interactively
it doesn't accept aliased user options.  For example,

    M-x set-variable RET messages-buffer-max-lines RET

reports that there are no matches, whereas `messages-buffer-max-lines'
is a valid alias for `message-log-max'.  IMO, `set-variable' should
accept an alias when it is not marked as obsolete.

-- 
Juri Linkov
http://www.jurta.org/emacs/

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-26 23:23   ` Juri Linkov
@ 2005-06-27 13:04     ` Juanma Barranquero
  2005-06-27 15:44       ` Juanma Barranquero
                         ` (2 more replies)
  2005-06-27 16:46     ` Richard M. Stallman
  1 sibling, 3 replies; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-27 13:04 UTC (permalink / raw)
  Cc: rms, emacs-devel

On 6/27/05, Juri Linkov <juri@jurta.org> wrote:

> IMO, `set-variable' should
> accept an alias when it is not marked as obsolete.

Try this patch, please. It doesn't modify `set-variable' but
`user-variable-p', so it returns t for non-obsolete aliases of user
variables.

(Anyway, is that a new feature or a bug fix?)


-- 
                    /L/e/k/t/u

Index: src/eval.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/eval.c,v
retrieving revision 1.245
diff -u -2 -r1.245 eval.c
--- src/eval.c	27 Jun 2005 05:59:23 -0000	1.245
+++ src/eval.c	27 Jun 2005 13:03:26 -0000
@@ -94,4 +94,5 @@
 Lisp_Object Qdebug_on_error;
  Lisp_Object Qdeclare;
+Lisp_Object Qbyte_obsolete_variable;
 
 /* This holds either the symbol `run-hooks' or nil.
@@ -894,10 +895,12 @@
 \(The alternative is a variable used internally in a Lisp program.)
 Determined by whether the first character of the documentation
-for the variable is `*' or if the variable is customizable (has a non-nil
-value of `standard-value' or of `custom-autoload' on its property list).  */)
+for the variable is `*', the variable is customizable (has a non-nil
+value of `standard-value' or of `custom-autoload' on its property list),
+or it is a non-obsolete alias for another user variable.  */)
      (variable)
      Lisp_Object variable;
 {
   Lisp_Object documentation;
+  struct Lisp_Symbol *sym;
 
   if (!SYMBOLP (variable))
@@ -920,4 +923,10 @@
       || (!NILP (Fget (variable, intern ("custom-autoload")))))
     return Qt;
+
+  sym = XSYMBOL (variable);
+  if (sym->indirect_variable
+      && NILP (Fget (variable, Qbyte_obsolete_variable)))
+    return Fuser_variable_p (sym->value);
+
   return Qnil;
 }
@@ -3410,4 +3419,7 @@
   staticpro (&Qdeclare);
 
+  Qbyte_obsolete_variable = intern ("byte-obsolete-variable");
+  staticpro (&Qbyte_obsolete_variable);
+
   /* Note that the process handling also uses Qexit, but we don't want
      to staticpro it twice, so we just do it here.  */

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 13:04     ` Juanma Barranquero
@ 2005-06-27 15:44       ` Juanma Barranquero
  2005-06-27 16:09         ` Luc Teirlinck
  2005-06-27 18:39       ` Eli Zaretskii
  2005-06-28  4:17       ` Richard M. Stallman
  2 siblings, 1 reply; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-27 15:44 UTC (permalink / raw)
  Cc: rms, emacs-devel

On 6/27/05, Juanma Barranquero <lekktu@gmail.com> wrote:
> Try this patch, please. It doesn't modify `set-variable' but
> `user-variable-p', so it returns t for non-obsolete aliases of user
> variables.

Well, it is also necessary to detect alias loops.  The problem is:
what should `user-variable-p' do when passed a variable which is in an
alias loop?  Throw an error or return nil?  I prefer the latter, as
`user-variable-p' is almost always used as predicate to completion
functions, apropos* or `mapatoms', where throwing an error would be
inappropriate.

-- 
                    /L/e/k/t/u


Index: src/eval.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/eval.c,v
retrieving revision 1.245
diff -u -2 -r1.245 eval.c
--- src/eval.c	27 Jun 2005 05:59:23 -0000	1.245
+++ src/eval.c	27 Jun 2005 15:37:53 -0000
@@ -94,4 +94,5 @@
 Lisp_Object Qdebug_on_error;
  Lisp_Object Qdeclare;
+Lisp_Object Qbyte_obsolete_variable;
 
 /* This holds either the symbol `run-hooks' or nil.
@@ -890,18 +891,35 @@
 }
 
+/* Error handler used in Fuser_variable_p.  */
+static Lisp_Object
+user_variable_p_eh (ignore)
+     Lisp_Object ignore;
+{
+  return Qnil;
+}
+
  DEFUN ("user-variable-p", Fuser_variable_p, Suser_variable_p, 1, 1, 0,
        doc: /* Returns t if VARIABLE is intended to be set and
modified by users.
 \(The alternative is a variable used internally in a Lisp program.)
 Determined by whether the first character of the documentation
-for the variable is `*' or if the variable is customizable (has a non-nil
-value of `standard-value' or of `custom-autoload' on its property list).  */)
+for the variable is `*', the variable is customizable (has a non-nil
+value of `standard-value' or of `custom-autoload' on its property list),
+or it is a non-obsolete alias for another user variable.  */)
      (variable)
      Lisp_Object variable;
 {
   Lisp_Object documentation;
+  struct Lisp_Symbol *sym;
 
   if (!SYMBOLP (variable))
       return Qnil;
 
+  sym = XSYMBOL (variable);
+  /* If indirect and there's an alias loop, don't check anything else.  */
+  if (sym->indirect_variable
+      && NILP (internal_condition_case_1 (indirect_variable, variable,
+                                          Qt, user_variable_p_eh)))
+    return Qnil;
+
   documentation = Fget (variable, Qvariable_documentation);
   if (INTEGERP (documentation) && XINT (documentation) < 0)
@@ -916,8 +934,15 @@
       && XINT (XCDR (documentation)) < 0)
     return Qt;
-  /* Customizable?  See `custom-variable-p'. */
+  /* Customizable?  See `custom-variable-p'.  */
   if ((!NILP (Fget (variable, intern ("standard-value"))))
       || (!NILP (Fget (variable, intern ("custom-autoload")))))
     return Qt;
+
+  /* An indirect variable?  Let's follow the chain.  */
+  sym = XSYMBOL (variable);
+  if (sym->indirect_variable
+      && NILP (Fget (variable, Qbyte_obsolete_variable)))
+    return Fuser_variable_p (sym->value);
+
   return Qnil;
 }
@@ -3410,4 +3435,7 @@
   staticpro (&Qdeclare);
 
+  Qbyte_obsolete_variable = intern ("byte-obsolete-variable");
+  staticpro (&Qbyte_obsolete_variable);
+
   /* Note that the process handling also uses Qexit, but we don't want
      to staticpro it twice, so we just do it here.  */

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 15:44       ` Juanma Barranquero
@ 2005-06-27 16:09         ` Luc Teirlinck
  2005-06-27 18:17           ` Juanma Barranquero
  0 siblings, 1 reply; 47+ messages in thread
From: Luc Teirlinck @ 2005-06-27 16:09 UTC (permalink / raw)
  Cc: juri, rms, emacs-devel

You might want to try out `customize-face(-other-window)' and see how
it handles face aliases.  (This behavior has been changed relatively
recently.)  I believe that I will adapt `customize-variable' and
`customize-variable-other-window' to follow the new
`customize-face(-other-window)' behavior.  (This is not done yet.)

I do not know whether or not it is important for `set-variable' to be
consistent with that.  Maybe not.  I just wanted to be sure that you
are aware of the `customize' situation.

Sincerely,

Luc.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-26 23:23   ` Juri Linkov
  2005-06-27 13:04     ` Juanma Barranquero
@ 2005-06-27 16:46     ` Richard M. Stallman
  1 sibling, 0 replies; 47+ messages in thread
From: Richard M. Stallman @ 2005-06-27 16:46 UTC (permalink / raw)
  Cc: yonirabkin, emacs-devel

    There is one problem with `set-variable'.  When called interactively
    it doesn't accept aliased user options.

It should accept aliases, even if they are obsolete.  Could you fix that?
(It would be useful to notify the user that the name he used is an alias.)

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 16:09         ` Luc Teirlinck
@ 2005-06-27 18:17           ` Juanma Barranquero
  2005-06-27 18:45             ` Luc Teirlinck
  2005-06-28  0:07             ` Juri Linkov
  0 siblings, 2 replies; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-27 18:17 UTC (permalink / raw)
  Cc: emacs-devel

> I do not know whether or not it is important for `set-variable' to be
> consistent with that.  Maybe not.  I just wanted to be sure that you
> are aware of the `customize' situation.

AFAICS, customize-face does nothing special, other than filtering out
aliases (but accepts them if the user types them). The set-variable
situation is very different: it does not accept a variable name unless
it thinks it is a user-variable, so the easiest answer is just making
it believe that aliases of user-variables are also user-variables.
This will generate more answers in the completion list; I'm not sure
whether that is a problem or not (I tend to think that it is not, as
the list is pruned quite quickly as the user types in characters).


-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 13:04     ` Juanma Barranquero
  2005-06-27 15:44       ` Juanma Barranquero
@ 2005-06-27 18:39       ` Eli Zaretskii
  2005-06-27 18:49         ` Luc Teirlinck
  2005-06-27 21:38         ` Juanma Barranquero
  2005-06-28  4:17       ` Richard M. Stallman
  2 siblings, 2 replies; 47+ messages in thread
From: Eli Zaretskii @ 2005-06-27 18:39 UTC (permalink / raw)
  Cc: emacs-devel

> Date: Mon, 27 Jun 2005 15:04:58 +0200
> From: Juanma Barranquero <lekktu@gmail.com>
> Cc: rms@gnu.org, emacs-devel@gnu.org
> 
> Try this patch, please. It doesn't modify `set-variable' but
> `user-variable-p', so it returns t for non-obsolete aliases of user
> variables.

This patch produces the following text:

   Determined by whether the first character of the documentation
  for the variable is `*', the variable is customizable (has a non-nil
  value of `standard-value' or of `custom-autoload' on its property list),
  or it is a non-obsolete alias for another user variable.

Does anyone else think that this sentence is so confusing in its
structure as to be almost unparsable?  (The old sentence was even less
clear.)

I think this sentence sorely needs rephrasing.  For starters, it
should not use passive tense.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 18:17           ` Juanma Barranquero
@ 2005-06-27 18:45             ` Luc Teirlinck
  2005-06-27 19:30               ` Juanma Barranquero
  2005-06-28 18:47               ` Richard M. Stallman
  2005-06-28  0:07             ` Juri Linkov
  1 sibling, 2 replies; 47+ messages in thread
From: Luc Teirlinck @ 2005-06-27 18:45 UTC (permalink / raw)
  Cc: emacs-devel

Juanma Barranquero wrote:
   
   AFAICS, customize-face does nothing special, other than filtering out
   aliases (but accepts them if the user types them).

`M-x customize-face RET diary-face' brings uo a customization buffer
for the face `diary' instead of for the typed alias `diary-face'.
_Assuming_, of course, that diary is loaded.  If not, customize-face
will not recognize diary, nor diary-face.  I proposed doing something
similar for customize-variable.

Sincerely,

Luc.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 18:39       ` Eli Zaretskii
@ 2005-06-27 18:49         ` Luc Teirlinck
  2005-06-27 21:38         ` Juanma Barranquero
  1 sibling, 0 replies; 47+ messages in thread
From: Luc Teirlinck @ 2005-06-27 18:49 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

Eli Zaretskii wrote:

   This patch produces the following text:

      Determined by whether the first character of the documentation
     for the variable is `*', the variable is customizable (has a non-nil
     value of `standard-value' or of `custom-autoload' on its property list),
     or it is a non-obsolete alias for another user variable.

   Does anyone else think that this sentence is so confusing in its
   structure as to be almost unparsable?  (The old sentence was even less
   clear.)

I believe that it is also incorrect.  I believe that we decided that a
variable was customizable if either its docstring starts with `*' or
it is defined with defcustom.

Unless I misunderstood or misremember, we decided that `*' was no
lomger necessary for variables defined with defcustom.

Sincerely,

Luc.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 18:45             ` Luc Teirlinck
@ 2005-06-27 19:30               ` Juanma Barranquero
  2005-06-28 18:47               ` Richard M. Stallman
  1 sibling, 0 replies; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-27 19:30 UTC (permalink / raw)
  Cc: emacs-devel

> `M-x customize-face RET diary-face' brings uo a customization buffer
> for the face `diary' instead of for the typed alias `diary-face'.
> _Assuming_, of course, that diary is loaded.  If not, customize-face
> will not recognize diary, nor diary-face.

As set-variable is not bringing any buffer, selecting X or ALIAS-OF-X
to set should be similar.

-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 18:39       ` Eli Zaretskii
  2005-06-27 18:49         ` Luc Teirlinck
@ 2005-06-27 21:38         ` Juanma Barranquero
  2005-06-28  4:37           ` Eli Zaretskii
  1 sibling, 1 reply; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-27 21:38 UTC (permalink / raw)
  Cc: emacs-devel

> This patch produces the following text:
> 
>    Determined by whether the first character of the documentation
>   for the variable is `*', the variable is customizable (has a non-nil
>   value of `standard-value' or of `custom-autoload' on its property list),
>   or it is a non-obsolete alias for another user variable.
> 
> Does anyone else think that this sentence is so confusing in its
> structure as to be almost unparsable?  (The old sentence was even less
> clear.)

Unparsable I wouldn't say, but certainly not very good. But anyway,
Richard just said that obsolete aliases should be set-variable too.

> I think this sentence sorely needs rephrasing.  For starters, it
> should not use passive tense.

What about this patch? Do you like it a bit more?

-- 
                    /L/e/k/t/u


Index: src/eval.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/eval.c,v
retrieving revision 1.245
diff -u -2 -r1.245 eval.c
--- src/eval.c	27 Jun 2005 05:59:23 -0000	1.245
+++ src/eval.c	27 Jun 2005 21:32:36 -0000
@@ -890,10 +890,22 @@
 }
 
+/* Error handler used in Fuser_variable_p.  */
+static Lisp_Object
+user_variable_p_eh (ignore)
+     Lisp_Object ignore;
+{
+  return Qnil;
+}
+
  DEFUN ("user-variable-p", Fuser_variable_p, Suser_variable_p, 1, 1, 0,
-       doc: /* Returns t if VARIABLE is intended to be set and
modified by users.
+       doc: /* Return t if VARIABLE is intended to be set and
modified by users.
 \(The alternative is a variable used internally in a Lisp program.)
-Determined by whether the first character of the documentation
-for the variable is `*' or if the variable is customizable (has a non-nil
-value of `standard-value' or of `custom-autoload' on its property list).  */)
+VARIABLE is considered to be a `user variable' if
+\(1) the first character of its documentation is `*', or
+\(2) it is customizable (its property list contains a non-nil value
+    of `standard-value' or `custom-autoload'), or
+\(3) it is an alias for another user variable.
+Return nil if VARIABLE is an alias and there is a loop in the
+chain of symbols.  */)
      (variable)
      Lisp_Object variable;
@@ -904,21 +916,35 @@
       return Qnil;
 
-  documentation = Fget (variable, Qvariable_documentation);
-  if (INTEGERP (documentation) && XINT (documentation) < 0)
-    return Qt;
-  if (STRINGP (documentation)
-      && ((unsigned char) SREF (documentation, 0) == '*'))
-    return Qt;
-  /* If it is (STRING . INTEGER), a negative integer means a user variable.  */
-  if (CONSP (documentation)
-      && STRINGP (XCAR (documentation))
-      && INTEGERP (XCDR (documentation))
-      && XINT (XCDR (documentation)) < 0)
-    return Qt;
-  /* Customizable?  See `custom-variable-p'. */
-  if ((!NILP (Fget (variable, intern ("standard-value"))))
-      || (!NILP (Fget (variable, intern ("custom-autoload")))))
-    return Qt;
-  return Qnil;
+  /* If indirect and there's an alias loop, don't check anything else.  */
+  if (XSYMBOL (variable)->indirect_variable
+      && NILP (internal_condition_case_1 (indirect_variable, variable,
+                                          Qt, user_variable_p_eh)))
+    return Qnil;
+
+  while (1)
+    {
+      documentation = Fget (variable, Qvariable_documentation);
+      if (INTEGERP (documentation) && XINT (documentation) < 0)
+        return Qt;
+      if (STRINGP (documentation)
+          && ((unsigned char) SREF (documentation, 0) == '*'))
+        return Qt;
+      /* If it is (STRING . INTEGER), a negative integer means a user
variable.  */
+      if (CONSP (documentation)
+          && STRINGP (XCAR (documentation))
+          && INTEGERP (XCDR (documentation))
+          && XINT (XCDR (documentation)) < 0)
+        return Qt;
+      /* Customizable?  See `custom-variable-p'.  */
+      if ((!NILP (Fget (variable, intern ("standard-value"))))
+          || (!NILP (Fget (variable, intern ("custom-autoload")))))
+        return Qt;
+
+      if (!XSYMBOL (variable)->indirect_variable)
+        return Qnil;
+
+      /* An indirect variable?  Let's follow the chain.  */
+      variable = XSYMBOL (variable)->value;
+    }
 }
 \f

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 18:17           ` Juanma Barranquero
  2005-06-27 18:45             ` Luc Teirlinck
@ 2005-06-28  0:07             ` Juri Linkov
  2005-06-28  8:32               ` Juanma Barranquero
  2005-06-28 18:47               ` Richard M. Stallman
  1 sibling, 2 replies; 47+ messages in thread
From: Juri Linkov @ 2005-06-28  0:07 UTC (permalink / raw)
  Cc: teirllm, emacs-devel

>> I do not know whether or not it is important for `set-variable' to be
>> consistent with that.  Maybe not.  I just wanted to be sure that you
>> are aware of the `customize' situation.
>
> AFAICS, customize-face does nothing special, other than filtering out
> aliases (but accepts them if the user types them). The set-variable
> situation is very different: it does not accept a variable name unless
> it thinks it is a user-variable, so the easiest answer is just making
> it believe that aliases of user-variables are also user-variables.
> This will generate more answers in the completion list; I'm not sure
> whether that is a problem or not (I tend to think that it is not, as
> the list is pruned quite quickly as the user types in characters).

Maybe set-variable should first try to complete non-obsolete aliases,
and filter out obsolete aliases (but still accept them).  The distinction
between obsolete variables and aliases is essential.  Users should not
see obsolete variables by default, but should be able to use them
(with possible notification about their obsoleteness).  Aliases are
valid names just like the variable names they refer to.

Also it makes sense to introduce a new property byte-obsolete-face
to mark obsolete faces, so completion would work similarly for 
customize-face.

-- 
Juri Linkov
http://www.jurta.org/emacs/

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 13:04     ` Juanma Barranquero
  2005-06-27 15:44       ` Juanma Barranquero
  2005-06-27 18:39       ` Eli Zaretskii
@ 2005-06-28  4:17       ` Richard M. Stallman
  2005-06-28  9:17         ` Juanma Barranquero
  2 siblings, 1 reply; 47+ messages in thread
From: Richard M. Stallman @ 2005-06-28  4:17 UTC (permalink / raw)
  Cc: juri, emacs-devel

    Try this patch, please. It doesn't modify `set-variable' but
    `user-variable-p', so it returns t for non-obsolete aliases of user
    variables.

Please install your patch.

    (Anyway, is that a new feature or a bug fix?)

It is a bug fix.

Would you like to change set-variable to give a warning
when the argument given is an alias?

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 21:38         ` Juanma Barranquero
@ 2005-06-28  4:37           ` Eli Zaretskii
  2005-06-28  8:33             ` Juanma Barranquero
  0 siblings, 1 reply; 47+ messages in thread
From: Eli Zaretskii @ 2005-06-28  4:37 UTC (permalink / raw)
  Cc: emacs-devel

> Date: Mon, 27 Jun 2005 23:38:52 +0200
> From: Juanma Barranquero <lekktu@gmail.com>
> Cc: emacs-devel@gnu.org
> 
> What about this patch? Do you like it a bit more?
> 
> +VARIABLE is considered to be a `user variable' if
> +\(1) the first character of its documentation is `*', or
> +\(2) it is customizable (its property list contains a non-nil value
> +    of `standard-value' or `custom-autoload'), or
> +\(3) it is an alias for another user variable.
> +Return nil if VARIABLE is an alias and there is a loop in the
> +chain of symbols.  */)

It is better, but I think if you start the sentence with

  A variable is a user variable if

it would be better yet.

Thanks.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28  0:07             ` Juri Linkov
@ 2005-06-28  8:32               ` Juanma Barranquero
  2005-06-28 23:45                 ` Juri Linkov
  2005-06-28 18:47               ` Richard M. Stallman
  1 sibling, 1 reply; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-28  8:32 UTC (permalink / raw)
  Cc: emacs-devel

On 6/28/05, Juri Linkov <juri@jurta.org> wrote:

> Maybe set-variable should first try to complete non-obsolete aliases,
> and filter out obsolete aliases (but still accept them).

Completing to all non-obsolete variables and/or aliases should be
easy, but... [see below]

> The distinction
> between obsolete variables and aliases is essential.  Users should not
> see obsolete variables by default, but should be able to use them

...I don't buy this argument. Users do not go randomly typing chars
into `set-variable' just to see what variables they can set (at least,
I don't think that's the most common use pattern). IMO, the user does
M-x set-variable because he already knows the variable he wants to set
(and it's even likely he read the doc and knows whether it is obsolete
or not, though I'm willing to accept there are users who simply set a
variable because they read about it in an old doc somewhere) and
completion is just a help to do less typing. So in my view,
`set-variable' should not filter out any user variable, whether it is
an obsolete variable or an obsolete alias. I certainly would be very
pissed if I wanted to set `messages-buffer-max-lines' and had to type
it fully because `set-variable' had decided that `message-log-max' was
the way to go.

> (with possible notification about their obsoleteness).

That's another matter entirely.  I think is a good idea to warn about
the variable being obsolete.  But with the current `completing-read'
mechanism, that can no be easily and elegantly done while the user is
selecting the variable, only afterwards (unless I'm missing
something).

> Also it makes sense to introduce a new property byte-obsolete-face
> to mark obsolete faces, so completion would work similarly for
> customize-face.

I support the idea about byte-obsolete-face, but not for face
completion's sake, but because perhaps the byte-compiler could be
coaxed into giving warnings about old faces' uses.

Anyway, I'm not planning to delve into face completion (or customize),
so that's a matter for whomever wants to implement it to ponder.

-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28  4:37           ` Eli Zaretskii
@ 2005-06-28  8:33             ` Juanma Barranquero
  0 siblings, 0 replies; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-28  8:33 UTC (permalink / raw)
  Cc: emacs-devel

On 6/28/05, Eli Zaretskii <eliz@gnu.org> wrote:

>   A variable is a user variable if
> 
> it would be better yet.

OK, I've fixed my patch. Thanks.

-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28  4:17       ` Richard M. Stallman
@ 2005-06-28  9:17         ` Juanma Barranquero
  2005-06-28  9:26           ` Juanma Barranquero
                             ` (2 more replies)
  0 siblings, 3 replies; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-28  9:17 UTC (permalink / raw)
  Cc: juri, emacs-devel

On 6/28/05, Richard M. Stallman <rms@gnu.org> wrote:

> Please install your patch.

After all this discussion, I'm not sure what's to be installed, so let
me recapitulate.  The patch below modifies `user-variable-p' so it
also considers as user variables these aliases that point, directly or
indirectly, to other user variables; that includes also obsolete
aliases, I'm not filtering them out. It also returns nil for alias
loops, irrespective of whether any of the aliases in the loop would
qualify as a user variable or not.

This patch fixes the problem originally reported by Juri, i.e., that
`set-variable' didn't allow setting aliases to user options.

Questions remaining:

  - Is there a consensus whether obsolete aliases should be shown or
not? In a recent message Juri proposed that obsolete aliases were not
shown by default, but could be set anyway. Currently `set-variable'
does not accept unknown variable names (to prevent the user setting
misspelled variables, I suppose). Doing what Juri proposes would mean
either changing that, or modifying `read-variable' to check after the
fact whether a given symbol is an obsolete alias or not; all that for
no clear added benefit, and with the added inconvenience that the user
will end typing more if he really wants to set an obsolete alias and
not the current variable the alias points to.

  - It is OK for `user-variable-p' to return nil for alias loops
instead of signaling an error? I think yes because `user-variable-p'
is not a user command, ant its main use is with `mapatoms' and
completion, where the idea is filtering out uninteresting variables.

 - Should `set-variable' give warnings for all aliases, for obsolete
aliases only? Should o it for obsolete variables even if they aren't
aliases?

 - What's the right moment to give the warning? Before setting the
value or after it?

Sorry for being so prolix, but I prefer to ask everything and try to
avoid multi-headed hydras... er, threads where no clear conclusion is
reached :)

-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28  9:17         ` Juanma Barranquero
@ 2005-06-28  9:26           ` Juanma Barranquero
  2005-06-28 16:09           ` Stefan Monnier
  2005-06-29  3:59           ` Richard M. Stallman
  2 siblings, 0 replies; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-28  9:26 UTC (permalink / raw)
  Cc: juri, emacs-devel

> The patch below modifies `user-variable-p' [etc, etc.]

That would be more convincing if I really attached the patch...

(BTW, the patch uses diff -b because most of user-visible-p is now
inside a while loop, but otherwise unchanged.)

-- 
                    /L/e/k/t/u


Index: src/eval.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/eval.c,v
retrieving revision 1.246
diff -b -c -2 -r1.246 eval.c
*** src/eval.c	28 Jun 2005 02:27:38 -0000	1.246
--- src/eval.c	28 Jun 2005 08:34:08 -0000
***************
*** 890,899 ****
  }
  
  DEFUN ("user-variable-p", Fuser_variable_p, Suser_variable_p, 1, 1, 0,
!        doc: /* Returns t if VARIABLE is intended to be set and
modified by users.
  \(The alternative is a variable used internally in a Lisp program.)
! Determined by whether the first character of the documentation
! for the variable is `*' or if the variable is customizable (has a non-nil
! value of `standard-value' or of `custom-autoload' on its property list).  */)
       (variable)
       Lisp_Object variable;
--- 890,911 ----
  }
  
+ /* Error handler used in Fuser_variable_p.  */
+ static Lisp_Object
+ user_variable_p_eh (ignore)
+      Lisp_Object ignore;
+ {
+   return Qnil;
+ }
+ 
  DEFUN ("user-variable-p", Fuser_variable_p, Suser_variable_p, 1, 1, 0,
!        doc: /* Return t if VARIABLE is intended to be set and
modified by users.
  \(The alternative is a variable used internally in a Lisp program.)
! A variable is a user variable if
! \(1) the first character of its documentation is `*', or
! \(2) it is customizable (its property list contains a non-nil value
!     of `standard-value' or `custom-autoload'), or
! \(3) it is an alias for another user variable.
! Return nil if VARIABLE is an alias and there is a loop in the
! chain of symbols.  */)
       (variable)
       Lisp_Object variable;
***************
*** 904,907 ****
--- 916,927 ----
        return Qnil;
  
+   /* If indirect and there's an alias loop, don't check anything else.  */
+   if (XSYMBOL (variable)->indirect_variable
+       && NILP (internal_condition_case_1 (indirect_variable, variable,
+                                           Qt, user_variable_p_eh)))
+     return Qnil;
+ 
+   while (1)
+     {
        documentation = Fget (variable, Qvariable_documentation);
        if (INTEGERP (documentation) && XINT (documentation) < 0)
***************
*** 920,924 ****
--- 940,950 ----
            || (!NILP (Fget (variable, intern ("custom-autoload")))))
          return Qt;
+ 
+       if (!XSYMBOL (variable)->indirect_variable)
          return Qnil;
+ 
+       /* An indirect variable?  Let's follow the chain.  */
+       variable = XSYMBOL (variable)->value;
+     }
  }
  \f

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28  9:17         ` Juanma Barranquero
  2005-06-28  9:26           ` Juanma Barranquero
@ 2005-06-28 16:09           ` Stefan Monnier
  2005-06-28 16:19             ` Juanma Barranquero
  2005-06-29  3:59           ` Richard M. Stallman
  2 siblings, 1 reply; 47+ messages in thread
From: Stefan Monnier @ 2005-06-28 16:09 UTC (permalink / raw)
  Cc: juri, rms, emacs-devel

>   - Is there a consensus whether obsolete aliases should be shown or
> not? In a recent message Juri proposed that obsolete aliases were not
> shown by default, but could be set anyway. Currently `set-variable'
> does not accept unknown variable names (to prevent the user setting
> misspelled variables, I suppose). Doing what Juri proposes would mean
> either changing that, or modifying `read-variable' to check after the
> fact whether a given symbol is an obsolete alias or not; all that for
> no clear added benefit, and with the added inconvenience that the user
> will end typing more if he really wants to set an obsolete alias and
> not the current variable the alias points to.

I think we should use the complete-in-turn thingy so that completion first
tries to complete without obsolete vars and only if that fails then it tries
to complete with obsolete vars.

>   - It is OK for `user-variable-p' to return nil for alias loops
> instead of signaling an error?

Looks fine to me.  If it's an alias loop, it's not a user-variable.

>  - Should `set-variable' give warnings for all aliases, for obsolete
> aliases only? Should o it for obsolete variables even if they aren't
> aliases?

I recommend not to classify cases as "alias" and "obsolete alias"
but as "alias" and "obsolete" where this latter case can be an alias
or not.  Setting an obsolete var should be discouraged, whether it's aliased
to some other var or not.

>  - What's the right moment to give the warning? Before setting the
> value or after it?

If you want a warning for aliases, it should come after, in the same way as
the display of shortcuts after M-x foobar RET.

As for warnings of obsoleteness, I would argue to put them before (with
a (sit-for 1)), since we want to send a clear message that they should not
use this variable any more.


        Stefan

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28 16:09           ` Stefan Monnier
@ 2005-06-28 16:19             ` Juanma Barranquero
  2005-06-29  3:43               ` Stefan Monnier
  0 siblings, 1 reply; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-28 16:19 UTC (permalink / raw)
  Cc: juri, rms, emacs-devel

> I think we should use the complete-in-turn thingy

Hmm. Some more info, please? :-)

> so that completion first
> tries to complete without obsolete vars and only if that fails then it tries
> to complete with obsolete vars.

OK, once I understand what are you referring to with the
"complete-in-turn thingy"...

> I recommend not to classify cases as "alias" and "obsolete alias"
> but as "alias" and "obsolete" where this latter case can be an alias
> or not.  Setting an obsolete var should be discouraged, whether it's aliased
> to some other var or not.

OK, with respect to giving a warning (wrt completion I don't agree,
but I'll implement whatever is deemed best, of course).

> If you want a warning for aliases, it should come after, in the same way as
> the display of shortcuts after M-x foobar RET.

Where is that implemented?

> As for warnings of obsoleteness, I would argue to put them before (with
> a (sit-for 1)), since we want to send a clear message that they should not
> use this variable any more.

OK, makes sense.

If I understand correctly, you're OK'ing the `user-variable-p' patch
and we're now discussing patching `set-variable'.

-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-27 18:45             ` Luc Teirlinck
  2005-06-27 19:30               ` Juanma Barranquero
@ 2005-06-28 18:47               ` Richard M. Stallman
  2005-07-04  1:18                 ` Luc Teirlinck
  1 sibling, 1 reply; 47+ messages in thread
From: Richard M. Stallman @ 2005-06-28 18:47 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

    `M-x customize-face RET diary-face' brings uo a customization buffer
    for the face `diary' instead of for the typed alias `diary-face'.
    _Assuming_, of course, that diary is loaded.  If not, customize-face
    will not recognize diary, nor diary-face.  I proposed doing something
    similar for customize-variable.

I think it is right to use the "real" name rather than the alias in
the customization buffer, for variables as well as for faces.
So please do make that change in customize-variable.

    As set-variable is not bringing any buffer, selecting X or ALIAS-OF-X
    to set should be similar.

That is true; this issue doesn't arise for set-variable, only for
Custom buffers.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28  0:07             ` Juri Linkov
  2005-06-28  8:32               ` Juanma Barranquero
@ 2005-06-28 18:47               ` Richard M. Stallman
  2005-06-29  2:32                 ` Juanma Barranquero
  1 sibling, 1 reply; 47+ messages in thread
From: Richard M. Stallman @ 2005-06-28 18:47 UTC (permalink / raw)
  Cc: lekktu, teirllm, emacs-devel

    Maybe set-variable should first try to complete non-obsolete aliases,
    and filter out obsolete aliases (but still accept them).

I don't like that idea.  The command should accept *all* names,
whether obsolete or not.  But it would be nice to inform the user in
the echo area that the name is obsolete, and give the new name if any.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28  8:32               ` Juanma Barranquero
@ 2005-06-28 23:45                 ` Juri Linkov
  2005-06-29  9:14                   ` Juanma Barranquero
  0 siblings, 1 reply; 47+ messages in thread
From: Juri Linkov @ 2005-06-28 23:45 UTC (permalink / raw)
  Cc: emacs-devel

> IMO, the user does M-x set-variable because he already knows the
> variable he wants to set (and it's even likely he read the doc and
> knows whether it is obsolete or not, though I'm willing to accept
> there are users who simply set a variable because they read about it
> in an old doc somewhere) and completion is just a help to do less
> typing. So in my view, `set-variable' should not filter out any user
> variable, whether it is an obsolete variable or an obsolete
> alias. I certainly would be very pissed if I wanted to set
> `messages-buffer-max-lines' and had to type it fully because
> `set-variable' had decided that `message-log-max' was the way to go.

`messages-buffer-max-lines' is not an obsolete alias for
`message-log-max'.  Rather it's the other way round: `message-log-max'
is an obsolete variable (thought it is not marked as such yet), but
its alias `messages-buffer-max-lines' is not obsolete (it was added
recently as a better name instead of `message-log-max').  But anyway
I see your point.  I agree that filtering is not very necessary, and
think that it would be sufficient to display a warning for obsolete
variables and obsolete aliases after selecting the variable but before
setting its value.

-- 
Juri Linkov
http://www.jurta.org/emacs/

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28 18:47               ` Richard M. Stallman
@ 2005-06-29  2:32                 ` Juanma Barranquero
  2005-06-29 20:42                   ` Richard M. Stallman
  0 siblings, 1 reply; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-29  2:32 UTC (permalink / raw)
  Cc: emacs-devel

On 6/28/05, Richard M. Stallman <rms@gnu.org> wrote:

> I don't like that idea.  The command should accept *all* names,
> whether obsolete or not.  But it would be nice to inform the user in
> the echo area that the name is obsolete, and give the new name if any.

With the installed changes for `user-variable-p' and the attached
patch, `set-variable' now:

 - allows setting aliases of user options
 - does *not* filter out obsolete variables
 - shows a 3-seconds warning when the variable (alias or not) being
set is obsolete;
   the warning includes the CURRENT-NAME information from
`make-variable-obsolete'
 - does not show a warning for aliases (I don't think it's necessary
to single out aliases
   if they aren't obsolete, and when they are, they already produce a warning)

-- 
                    /L/e/k/t/u



Index: lisp/simple.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/simple.el,v
retrieving revision 1.734
diff -c -2 -b -r1.734 simple.el
*** lisp/simple.el	24 Jun 2005 21:11:58 -0000	1.734
--- lisp/simple.el	29 Jun 2005 00:50:03 -0000
***************
*** 4539,4550 ****
  	  (minibuffer-help-form '(describe-variable var))
  	  (prop (get var 'variable-interactive))
! 	  (prompt (format "Set %s%s to value: " var
  			  (cond ((local-variable-p var)
! 				 " (buffer-local)")
  				((or current-prefix-arg
  				     (local-variable-if-set-p var))
! 				 " buffer-locally")
! 				(t " globally"))))
! 	  (val (if prop
  		   ;; Use VAR's `variable-interactive' property
  		   ;; as an interactive spec for prompting.
--- 4539,4557 ----
  	  (minibuffer-help-form '(describe-variable var))
  	  (prop (get var 'variable-interactive))
!           (obsolete (car (get var 'byte-obsolete-variable)))
! 	  (prompt (format "Set %s %s to value: " var
  			  (cond ((local-variable-p var)
! 				 "(buffer-local)")
  				((or current-prefix-arg
  				     (local-variable-if-set-p var))
! 				 "buffer-locally")
! 				(t "globally"))))
! 	  (val (progn
!                  (when obsolete
!                    (message (concat "`%S' is obsolete; "
!                                     (if (symbolp obsolete) "use `%S'
instead" "%s"))
!                             var obsolete)
!                    (sit-for 3))
!                  (if prop
                       ;; Use VAR's `variable-interactive' property
                       ;; as an interactive spec for prompting.
***************
*** 4554,4558 ****
  		 (read
  		  (read-string prompt nil
! 			       'set-variable-value-history)))))
       (list var val current-prefix-arg)))
  
--- 4561,4565 ----
                     (read
                      (read-string prompt nil
!                                  'set-variable-value-history))))))
       (list var val current-prefix-arg)))

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28 16:19             ` Juanma Barranquero
@ 2005-06-29  3:43               ` Stefan Monnier
  2005-06-29  9:18                 ` Juanma Barranquero
  0 siblings, 1 reply; 47+ messages in thread
From: Stefan Monnier @ 2005-06-29  3:43 UTC (permalink / raw)
  Cc: juri, rms, emacs-devel

>> I think we should use the complete-in-turn thingy
> Hmm. Some more info, please? :-)

C-h f complete-in-turn RET

Try C-s complete-in-turn in the lisp/ChangeLog file as well to see where
it's used.

> If I understand correctly, you're OK'ing the `user-variable-p' patch
> and we're now discussing patching `set-variable'.

AFAIC, the patch falls in the "obviously a bug-fix" category.


        Stefan

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28  9:17         ` Juanma Barranquero
  2005-06-28  9:26           ` Juanma Barranquero
  2005-06-28 16:09           ` Stefan Monnier
@ 2005-06-29  3:59           ` Richard M. Stallman
  2 siblings, 0 replies; 47+ messages in thread
From: Richard M. Stallman @ 2005-06-29  3:59 UTC (permalink / raw)
  Cc: juri, emacs-devel

    After all this discussion, I'm not sure what's to be installed, so let
    me recapitulate.  The patch below modifies `user-variable-p' so it
    also considers as user variables these aliases that point, directly or
    indirectly, to other user variables; that includes also obsolete
    aliases, I'm not filtering them out. It also returns nil for alias
    loops, irrespective of whether any of the aliases in the loop would
    qualify as a user variable or not.

That all sounds right.

      - Is there a consensus whether obsolete aliases should be shown or
    not?

I am not sure what you mean by "shown".  Obsolete aliases should
be accepted by user-variable-p.

     - Should `set-variable' give warnings for all aliases, for obsolete
    aliases only? Should o it for obsolete variables even if they aren't
    aliases?

It should give warnings for all obsolete variables.

     - What's the right moment to give the warning? Before setting the
    value or after it?

It should be the last thing set-variable does.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28 23:45                 ` Juri Linkov
@ 2005-06-29  9:14                   ` Juanma Barranquero
  2005-06-29 23:57                     ` Juri Linkov
  0 siblings, 1 reply; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-29  9:14 UTC (permalink / raw)
  Cc: emacs-devel

On 6/29/05, Juri Linkov <juri@jurta.org> wrote:

> I agree that filtering is not very necessary, and
> think that it would be sufficient to display a warning for obsolete
> variables and obsolete aliases after selecting the variable but before
> setting its value.

Cool. That's what my latest patch does. Please take a look to see if
it matches your expectations.

-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-29  3:43               ` Stefan Monnier
@ 2005-06-29  9:18                 ` Juanma Barranquero
  0 siblings, 0 replies; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-29  9:18 UTC (permalink / raw)
  Cc: emacs-devel

> C-h f complete-in-turn RET

Oops, sorry. As you casually said "the complete-in-turn thingy" I
(erroneously) assumed you were describing something, not giving the
precise name of the function :-)

Anyway, I've implemented the change to `set-variable' without it.  You
seem to want the two-phase completion, and Richard seems not to (at
least that's how I interpreted his comments). So let's first decide
how we want `set-variable' to behave.

-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-29  2:32                 ` Juanma Barranquero
@ 2005-06-29 20:42                   ` Richard M. Stallman
  0 siblings, 0 replies; 47+ messages in thread
From: Richard M. Stallman @ 2005-06-29 20:42 UTC (permalink / raw)
  Cc: emacs-devel

     - allows setting aliases of user options
     - does *not* filter out obsolete variables
     - shows a 3-seconds warning when the variable (alias or not) being
    set is obsolete;
       the warning includes the CURRENT-NAME information from
    `make-variable-obsolete'
     - does not show a warning for aliases (I don't think it's necessary
    to single out aliases
       if they aren't obsolete, and when they are, they already produce a warning)

I think all of those are the right thing.  Thanks.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-29  9:14                   ` Juanma Barranquero
@ 2005-06-29 23:57                     ` Juri Linkov
  2005-06-30  8:16                       ` Juanma Barranquero
  0 siblings, 1 reply; 47+ messages in thread
From: Juri Linkov @ 2005-06-29 23:57 UTC (permalink / raw)
  Cc: emacs-devel

>> I agree that filtering is not very necessary, and
>> think that it would be sufficient to display a warning for obsolete
>> variables and obsolete aliases after selecting the variable but before
>> setting its value.
>
> Cool. That's what my latest patch does. Please take a look to see if
> it matches your expectations.

I like it.

BTW, there is another problem in `set-variable'.  When setting
a customizable variable with `set-variable' it doesn't use its
`:set' keyword to set the value.  For example,

    M-x set-variable RET frame-background-mode RET dark RET

doesn't update the background mode until `frame-set-background-mode'
is run explicitly.

`set-variable' already uses internal functions of the `custom' package
to test the custom type, so why wouldn't it also run a setter specified
by the `:set' custom keyword?

-- 
Juri Linkov
http://www.jurta.org/emacs/

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-29 23:57                     ` Juri Linkov
@ 2005-06-30  8:16                       ` Juanma Barranquero
  2005-06-30 16:55                         ` Luc Teirlinck
  0 siblings, 1 reply; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-30  8:16 UTC (permalink / raw)
  Cc: emacs-devel

On 6/30/05, Juri Linkov <juri@jurta.org> wrote:

> so why wouldn't it also run a setter specified
> by the `:set' custom keyword?

It probably should. I'll take a look at it. I'm not custom expert,
though; I hardly use the stuff.

-- 
                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-30  8:16                       ` Juanma Barranquero
@ 2005-06-30 16:55                         ` Luc Teirlinck
  2005-06-30 19:34                           ` Juanma Barranquero
  2005-07-01 23:57                           ` Juri Linkov
  0 siblings, 2 replies; 47+ messages in thread
From: Luc Teirlinck @ 2005-06-30 16:55 UTC (permalink / raw)
  Cc: juri, emacs-devel

Juanma Barranquero wrote:

   On 6/30/05, Juri Linkov <juri@jurta.org> wrote:

   > so why wouldn't it also run a setter specified
   > by the `:set' custom keyword?

   It probably should. I'll take a look at it. I'm not custom expert,
   though; I hardly use the stuff.

I have not been following this thread.  Are you discussing making
set-variable calling any :set function?  We decided quite a while ago
to do that.  But there are some subtleties involved, for instance with
buffer local variables.  We decided to put it off till after the
release.

Sincerely,

Luc.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-30 16:55                         ` Luc Teirlinck
@ 2005-06-30 19:34                           ` Juanma Barranquero
  2005-07-01 23:57                           ` Juri Linkov
  1 sibling, 0 replies; 47+ messages in thread
From: Juanma Barranquero @ 2005-06-30 19:34 UTC (permalink / raw)
  Cc: juri, emacs-devel

On 6/30/05, Luc Teirlinck <teirllm@dms.auburn.edu> wrote:

> Are you discussing making
> set-variable calling any :set function?

Juri proposed that, yes.

> We decided quite a while ago to do that.

Glad to hear (because I won't have to implement it...)

> We decided to put it off till after the release.

Commendable :D

Thanks for clarifying this,

                    /L/e/k/t/u

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-30 16:55                         ` Luc Teirlinck
  2005-06-30 19:34                           ` Juanma Barranquero
@ 2005-07-01 23:57                           ` Juri Linkov
  2005-07-02  4:11                             ` Luc Teirlinck
  1 sibling, 1 reply; 47+ messages in thread
From: Juri Linkov @ 2005-07-01 23:57 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

>    > so why wouldn't it also run a setter specified
>    > by the `:set' custom keyword?
>
>    It probably should. I'll take a look at it. I'm not custom expert,
>    though; I hardly use the stuff.
>
> I have not been following this thread.  Are you discussing making
> set-variable calling any :set function?  We decided quite a while ago
> to do that.  But there are some subtleties involved, for instance with
> buffer local variables.  We decided to put it off till after the
> release.

I don't remember what the decision was, but if it was to postpone this
until the next release, then perhaps this should be added to etc/TODO.

-- 
Juri Linkov
http://www.jurta.org/emacs/

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-07-01 23:57                           ` Juri Linkov
@ 2005-07-02  4:11                             ` Luc Teirlinck
  0 siblings, 0 replies; 47+ messages in thread
From: Luc Teirlinck @ 2005-07-02  4:11 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

Juri Linkov wrote:

   I don't remember what the decision was, but if it was to postpone this
   until the next release, then perhaps this should be added to etc/TODO.

We decided to put it off until after the release, because the exact
details of what we really wanted to do were not clear.  There are
issues with buffer local variables and so on.  So the item in TODO
could not even specify what needs to be done.  There are several
fundamental issues about Custom which need to be decided first.

Sincerely,

Luc.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-06-28 18:47               ` Richard M. Stallman
@ 2005-07-04  1:18                 ` Luc Teirlinck
  2005-07-04 16:48                   ` Richard M. Stallman
  0 siblings, 1 reply; 47+ messages in thread
From: Luc Teirlinck @ 2005-07-04  1:18 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

Richard Stallman wrote:

   I think it is right to use the "real" name rather than the alias in
   the customization buffer, for variables as well as for faces.
   So please do make that change in customize-variable.

Actually, I forgot that, unlike customize-face, customize-variable
does not allow to enter variables that are defvarred or defvaraliased,
rather than defcustomed.  So the problem does not arise for variable
aliases.  The person trying the alias will see that it does not
complete.  After investigating the problem using `C-h v', he will see
that it is an alias and gets a link to customize the actual option.

Sincerely,

Luc.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-07-04  1:18                 ` Luc Teirlinck
@ 2005-07-04 16:48                   ` Richard M. Stallman
  2005-07-04 17:02                     ` David Kastrup
  2005-07-05  1:42                     ` Luc Teirlinck
  0 siblings, 2 replies; 47+ messages in thread
From: Richard M. Stallman @ 2005-07-04 16:48 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

    Actually, I forgot that, unlike customize-face, customize-variable
    does not allow to enter variables that are defvarred or defvaraliased,
    rather than defcustomed.

I think that is partly a bug--it should allow an alias if its "real"
name has a defcustom.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-07-04 16:48                   ` Richard M. Stallman
@ 2005-07-04 17:02                     ` David Kastrup
  2005-07-05  1:42                     ` Luc Teirlinck
  1 sibling, 0 replies; 47+ messages in thread
From: David Kastrup @ 2005-07-04 17:02 UTC (permalink / raw)
  Cc: lekktu, Luc Teirlinck, emacs-devel

"Richard M. Stallman" <rms@gnu.org> writes:

>     Actually, I forgot that, unlike customize-face, customize-variable
>     does not allow to enter variables that are defvarred or defvaraliased,
>     rather than defcustomed.
>
> I think that is partly a bug--it should allow an alias if its "real"
> name has a defcustom.

But then it should go to the customize dialog for the "real"
variable.  Everything else would be too confusing in the long run,
particularly if you are saving options in your .emacs file.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-07-04 16:48                   ` Richard M. Stallman
  2005-07-04 17:02                     ` David Kastrup
@ 2005-07-05  1:42                     ` Luc Teirlinck
  2005-07-05 16:12                       ` Richard M. Stallman
  1 sibling, 1 reply; 47+ messages in thread
From: Luc Teirlinck @ 2005-07-05  1:42 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

Richard Stallman wrote:

       Actually, I forgot that, unlike customize-face, customize-variable
       does not allow to enter variables that are defvarred or defvaraliased,
       rather than defcustomed.

   I think that is partly a bug--it should allow an alias if its "real"
   name has a defcustom.

If it is a bug, then the following patches fix it.  I can install if
desired:

===File ~/custom-diff=======================================
diff -c /home/teirllm/emacscvsdir/emacs/lisp/custom.el.\~1.85.\~ /home/teirllm/emacscvsdir/emacs/lisp/custom.el
*** /home/teirllm/emacscvsdir/emacs/lisp/custom.el.~1.85.~	Sun Jul  3 13:38:33 2005
--- /home/teirllm/emacscvsdir/emacs/lisp/custom.el	Mon Jul  4 19:45:29 2005
***************
*** 518,524 ****
  
  ;; This test is also in the C code of `user-variable-p'.
  (defun custom-variable-p (variable)
!   "Return non-nil if VARIABLE is a custom variable."
    (or (get variable 'standard-value)
        (get variable 'custom-autoload)))
  
--- 518,526 ----
  
  ;; This test is also in the C code of `user-variable-p'.
  (defun custom-variable-p (variable)
!   "Return non-nil if VARIABLE is a custom variable.
! This recursively follows aliases."
!   (setq variable (indirect-variable variable))
    (or (get variable 'standard-value)
        (get variable 'custom-autoload)))
  

Diff finished.  Mon Jul  4 20:23:04 2005
============================================================

===File ~/cus-edit-diff=====================================
diff -c /home/teirllm/emacscvsdir/emacs/lisp/cus-edit.el.\~1.225.\~ /home/teirllm/emacscvsdir/emacs/lisp/cus-edit.el
*** /home/teirllm/emacscvsdir/emacs/lisp/cus-edit.el.~1.225.~	Sun Jul  3 19:57:02 2005
--- /home/teirllm/emacscvsdir/emacs/lisp/cus-edit.el	Mon Jul  4 19:45:23 2005
***************
*** 488,495 ****
  
  (defun custom-variable-prompt ()
    "Prompt for a custom variable, defaulting to the variable at point.
  Return a list suitable for use in `interactive'."
!    (let ((v (variable-at-point))
  	 (enable-recursive-minibuffers t)
  	 val)
       (setq val (completing-read
--- 488,497 ----
  
  (defun custom-variable-prompt ()
    "Prompt for a custom variable, defaulting to the variable at point.
+ If that variable is an alias, the default is the actual custom variable
+ at the end of the chain of aliases.
  Return a list suitable for use in `interactive'."
!    (let ((v (indirect-variable (variable-at-point)))
  	 (enable-recursive-minibuffers t)
  	 val)
       (setq val (completing-read
***************
*** 1021,1026 ****
--- 1023,1029 ----
  (defun customize-option (symbol)
    "Customize SYMBOL, which must be a user option variable."
    (interactive (custom-variable-prompt))
+   (setq symbol (indirect-variable symbol))
    (custom-buffer-create (list (list symbol 'custom-variable))
  			(format "*Customize Option: %s*"
  				(custom-unlispify-tag-name symbol))))
***************
*** 1033,1038 ****
--- 1036,1042 ----
    "Customize SYMBOL, which must be a user option variable.
  Show the buffer in another window, but don't select it."
    (interactive (custom-variable-prompt))
+   (setq symbol (indirect-variable symbol))
    (custom-buffer-create-other-window
     (list (list symbol 'custom-variable))
     (format "*Customize Option: %s*" (custom-unlispify-tag-name symbol))))

Diff finished.  Mon Jul  4 20:24:04 2005
============================================================

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-07-05  1:42                     ` Luc Teirlinck
@ 2005-07-05 16:12                       ` Richard M. Stallman
  2005-07-07  1:54                         ` Luc Teirlinck
  0 siblings, 1 reply; 47+ messages in thread
From: Richard M. Stallman @ 2005-07-05 16:12 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

      (defun custom-variable-prompt ()
	"Prompt for a custom variable, defaulting to the variable at point.
    + If that variable is an alias, the default is the actual custom variable
    + at the end of the chain of aliases.
      Return a list suitable for use in `interactive'."
    !    (let ((v (indirect-variable (variable-at-point)))
	     (enable-recursive-minibuffers t)
	     val)

The default that the user sees should be what's in the buffer.
Otherwise it will be mysterious.  The conversion of aliases
to their real names should happen only on the user's input.

If you just leave this function unchanged and install the rest,
it should work.  However, it would be good to make one additional
change: the same commands should display a message of the form
   `%s' is an alias for `%s'
in the echo area.

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-07-05 16:12                       ` Richard M. Stallman
@ 2005-07-07  1:54                         ` Luc Teirlinck
  2005-07-07 21:30                           ` Richard M. Stallman
  0 siblings, 1 reply; 47+ messages in thread
From: Luc Teirlinck @ 2005-07-07  1:54 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

Richard Stallman wrote:

   If you just leave this function unchanged and install the rest,
   it should work.  However, it would be good to make one additional
   change: the same commands should display a message of the form
      `%s' is an alias for `%s'
   in the echo area.

What about the following new patch?

===File ~/cus-edit-diff=====================================
*** cus-edit.el	06 Jul 2005 17:24:52 -0500	1.226
--- cus-edit.el	06 Jul 2005 20:06:50 -0500	
***************
*** 1021,1029 ****
  (defun customize-option (symbol)
    "Customize SYMBOL, which must be a user option variable."
    (interactive (custom-variable-prompt))
!   (custom-buffer-create (list (list symbol 'custom-variable))
! 			(format "*Customize Option: %s*"
! 				(custom-unlispify-tag-name symbol))))
  
  ;;;###autoload
  (defalias 'customize-variable-other-window 'customize-option-other-window)
--- 1021,1032 ----
  (defun customize-option (symbol)
    "Customize SYMBOL, which must be a user option variable."
    (interactive (custom-variable-prompt))
!   (let ((basevar (indirect-variable symbol)))
!     (custom-buffer-create (list (list basevar 'custom-variable))
! 			  (format "*Customize Option: %s*"
! 				  (custom-unlispify-tag-name basevar)))
!     (unless (eq symbol basevar)
!       (message "`%s' is an alias for `%s'" symbol basevar))))
  
  ;;;###autoload
  (defalias 'customize-variable-other-window 'customize-option-other-window)
***************
*** 1033,1041 ****
    "Customize SYMBOL, which must be a user option variable.
  Show the buffer in another window, but don't select it."
    (interactive (custom-variable-prompt))
!   (custom-buffer-create-other-window
!    (list (list symbol 'custom-variable))
!    (format "*Customize Option: %s*" (custom-unlispify-tag-name symbol))))
  
  (defvar customize-changed-options-previous-release "20.2"
    "Version for `customize-changed-options' to refer back to by default.")
--- 1036,1047 ----
    "Customize SYMBOL, which must be a user option variable.
  Show the buffer in another window, but don't select it."
    (interactive (custom-variable-prompt))
!   (let ((basevar (indirect-variable symbol)))
!     (custom-buffer-create-other-window
!      (list (list basevar 'custom-variable))
!      (format "*Customize Option: %s*" (custom-unlispify-tag-name basevar)))
!     (unless (eq symbol basevar)
!       (message "`%s' is an alias for `%s'" symbol basevar))))
  
  (defvar customize-changed-options-previous-release "20.2"
    "Version for `customize-changed-options' to refer back to by default.")
============================================================

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

* Re: Documentation not clear for the Lisp function set-variable
  2005-07-07  1:54                         ` Luc Teirlinck
@ 2005-07-07 21:30                           ` Richard M. Stallman
  0 siblings, 0 replies; 47+ messages in thread
From: Richard M. Stallman @ 2005-07-07 21:30 UTC (permalink / raw)
  Cc: lekktu, emacs-devel

       If you just leave this function unchanged and install the rest,
       it should work.  However, it would be good to make one additional
       change: the same commands should display a message of the form
	  `%s' is an alias for `%s'
       in the echo area.

    What about the following new patch?

It looks good.  Thanks.

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

end of thread, other threads:[~2005-07-07 21:30 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-06-19 11:14 Documentation not clear for the Lisp function set-variable Yoni Rabkin
2005-06-20  3:50 ` Richard Stallman
2005-06-20  8:21   ` Yoni Rabkin
2005-06-20  9:07   ` Juanma Barranquero
2005-06-21  2:00     ` Richard Stallman
2005-06-26 23:23   ` Juri Linkov
2005-06-27 13:04     ` Juanma Barranquero
2005-06-27 15:44       ` Juanma Barranquero
2005-06-27 16:09         ` Luc Teirlinck
2005-06-27 18:17           ` Juanma Barranquero
2005-06-27 18:45             ` Luc Teirlinck
2005-06-27 19:30               ` Juanma Barranquero
2005-06-28 18:47               ` Richard M. Stallman
2005-07-04  1:18                 ` Luc Teirlinck
2005-07-04 16:48                   ` Richard M. Stallman
2005-07-04 17:02                     ` David Kastrup
2005-07-05  1:42                     ` Luc Teirlinck
2005-07-05 16:12                       ` Richard M. Stallman
2005-07-07  1:54                         ` Luc Teirlinck
2005-07-07 21:30                           ` Richard M. Stallman
2005-06-28  0:07             ` Juri Linkov
2005-06-28  8:32               ` Juanma Barranquero
2005-06-28 23:45                 ` Juri Linkov
2005-06-29  9:14                   ` Juanma Barranquero
2005-06-29 23:57                     ` Juri Linkov
2005-06-30  8:16                       ` Juanma Barranquero
2005-06-30 16:55                         ` Luc Teirlinck
2005-06-30 19:34                           ` Juanma Barranquero
2005-07-01 23:57                           ` Juri Linkov
2005-07-02  4:11                             ` Luc Teirlinck
2005-06-28 18:47               ` Richard M. Stallman
2005-06-29  2:32                 ` Juanma Barranquero
2005-06-29 20:42                   ` Richard M. Stallman
2005-06-27 18:39       ` Eli Zaretskii
2005-06-27 18:49         ` Luc Teirlinck
2005-06-27 21:38         ` Juanma Barranquero
2005-06-28  4:37           ` Eli Zaretskii
2005-06-28  8:33             ` Juanma Barranquero
2005-06-28  4:17       ` Richard M. Stallman
2005-06-28  9:17         ` Juanma Barranquero
2005-06-28  9:26           ` Juanma Barranquero
2005-06-28 16:09           ` Stefan Monnier
2005-06-28 16:19             ` Juanma Barranquero
2005-06-29  3:43               ` Stefan Monnier
2005-06-29  9:18                 ` Juanma Barranquero
2005-06-29  3:59           ` Richard M. Stallman
2005-06-27 16:46     ` Richard M. Stallman

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).