From ea9eeb65d6514c11ae9d0ac5c4fad36213e303f9 Mon Sep 17 00:00:00 2001 From: Gregory Heytings Date: Sun, 12 Sep 2021 08:19:25 +0000 Subject: [PATCH] Warn when custom variable is wrongly set. * src/eval.c (Fsetq): Display warning when a custom variable with a :set property is set with setq. Warnings are displayed only for custom variables whose files have been loaded and that have a :set property. No warnings are displayed for custom variables whose files have merely been preloaded, for custom variables that do not have a :set property, and for non-custom variables. See bug#21695. * etc/NEWS: Document the warning. * doc/emacs/custom.texi: Mention the warning. --- doc/emacs/custom.texi | 3 ++- etc/NEWS | 6 ++++++ src/eval.c | 9 ++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi index 9220a2078f..1b7e7d9361 100644 --- a/doc/emacs/custom.texi +++ b/doc/emacs/custom.texi @@ -2378,7 +2378,8 @@ do that; to enable the mode in your init file, call the minor mode command. Finally, a few customizable user options are initialized in complex ways, and these have to be set either via the customize interface (@pxref{Customization}) or by using -@code{customize-set-variable} (@pxref{Examining}). +@code{customize-set-variable} (@pxref{Examining}). If such options +are inadvertently set with @code{setq}, a warning is displayed. The second argument to @code{setq} is an expression for the new value of the variable. This can be a constant, a variable, or a diff --git a/etc/NEWS b/etc/NEWS index ca269aabaa..dfdd925ec5 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -3401,6 +3401,12 @@ truncating precision field, such as "%.2a". Such mixes are always signs that the outer lexical binding was an error and should have used dynamic binding instead. +-- +** 'setq' displays a warning when 'customize-set-variable' should have been used. +Some custom variables need to be set with 'customize-set-variable', because +they were designed to be set through the Customization interface and have a +:set lambda form which does other things after they have been set. + --- ** New variable 'inhibit-mouse-event-check'. If bound to non-nil, a command with '(interactive "e")' doesn't signal diff --git a/src/eval.c b/src/eval.c index 48104bd0f4..168a7749a0 100644 --- a/src/eval.c +++ b/src/eval.c @@ -525,8 +525,15 @@ usage: (setq [SYM VAL]...) */) : Qnil); if (!NILP (lex_binding)) XSETCDR (lex_binding, val); /* SYM is lexically bound. */ - else + else { + if (!NILP (Fget (sym, intern ("custom-set")))) + call2 (intern ("display-warning"), intern ("setq"), + CALLN (Fformat, + build_string + ("`%s' should be set with `customize-set-variable'"), + sym)); Fset (sym, val); /* SYM is dynamically bound. */ + } } return val; -- 2.33.0