On 6/27/05, Juanma Barranquero <[EMAIL PROTECTED]> 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. */ _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel