diff options
| author | Lars Ingebrigtsen | 2022-07-05 19:32:37 +0200 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2022-07-05 19:33:24 +0200 |
| commit | 6d8638e5e494fb0ceafffe19bbf349fff643e12d (patch) | |
| tree | 5516261421fca0015b97667f9caaa4573fb68b33 | |
| parent | 99872bedf07315f642d143feaed9075a7ea20cba (diff) | |
| download | emacs-6d8638e5e494fb0ceafffe19bbf349fff643e12d.tar.gz emacs-6d8638e5e494fb0ceafffe19bbf349fff643e12d.zip | |
Give a warning if setopt has been used with an invalid value
* lisp/cus-edit.el (setopt--set): Mark the variable for checking.
* lisp/custom.el (custom-initialize-reset): Give a warning if the
type is wrong (bug#56400).
* lisp/wid-edit.el (widget-convert): Autoload.
| -rw-r--r-- | lisp/cus-edit.el | 1 | ||||
| -rw-r--r-- | lisp/custom.el | 10 | ||||
| -rw-r--r-- | lisp/wid-edit.el | 1 |
3 files changed, 12 insertions, 0 deletions
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el index 1f496af7d57..50dce5ee285 100644 --- a/lisp/cus-edit.el +++ b/lisp/cus-edit.el | |||
| @@ -1075,6 +1075,7 @@ plain variables. This means that `setopt' will execute any | |||
| 1075 | (when-let ((type (get variable 'custom-type))) | 1075 | (when-let ((type (get variable 'custom-type))) |
| 1076 | (unless (widget-apply (widget-convert type) :match value) | 1076 | (unless (widget-apply (widget-convert type) :match value) |
| 1077 | (user-error "Value `%S' does not match type %s" value type))) | 1077 | (user-error "Value `%S' does not match type %s" value type))) |
| 1078 | (put variable 'custom-check-value (list value)) | ||
| 1078 | (funcall (or (get variable 'custom-set) #'set-default) variable value)) | 1079 | (funcall (or (get variable 'custom-set) #'set-default) variable value)) |
| 1079 | 1080 | ||
| 1080 | ;;;###autoload | 1081 | ;;;###autoload |
diff --git a/lisp/custom.el b/lisp/custom.el index 2b7621229d9..a6e2ab351d4 100644 --- a/lisp/custom.el +++ b/lisp/custom.el | |||
| @@ -90,6 +90,16 @@ The value is either the symbol's current value | |||
| 90 | (as obtained using the `:get' function), if any, | 90 | (as obtained using the `:get' function), if any, |
| 91 | or the value in the symbol's `saved-value' property if any, | 91 | or the value in the symbol's `saved-value' property if any, |
| 92 | or (last of all) the value of EXP." | 92 | or (last of all) the value of EXP." |
| 93 | ;; If this value has been set with `setopt' (for instance in | ||
| 94 | ;; ~/.emacs), we didn't necessarily know the type of the user option | ||
| 95 | ;; then. So check now, and issue a warning if it's wrong. | ||
| 96 | (when-let ((value (get symbol 'custom-check-value)) | ||
| 97 | (type (get symbol 'custom-type))) | ||
| 98 | (when (and (boundp symbol) | ||
| 99 | (eq (car value) (symbol-value symbol)) | ||
| 100 | ;; Check that the type is correct. | ||
| 101 | (not (widget-apply (widget-convert type) :match (car value)))) | ||
| 102 | (warn "Value `%S' for `%s' does not match type %s" value symbol type))) | ||
| 93 | (funcall (or (get symbol 'custom-set) #'set-default-toplevel-value) | 103 | (funcall (or (get symbol 'custom-set) #'set-default-toplevel-value) |
| 94 | symbol | 104 | symbol |
| 95 | (condition-case nil | 105 | (condition-case nil |
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el index 29b6e13bc60..53626182470 100644 --- a/lisp/wid-edit.el +++ b/lisp/wid-edit.el | |||
| @@ -880,6 +880,7 @@ The child is converted, using the keyword arguments ARGS." | |||
| 880 | "Make a deep copy of WIDGET." | 880 | "Make a deep copy of WIDGET." |
| 881 | (widget-apply (copy-sequence widget) :copy)) | 881 | (widget-apply (copy-sequence widget) :copy)) |
| 882 | 882 | ||
| 883 | ;;;###autoload | ||
| 883 | (defun widget-convert (type &rest args) | 884 | (defun widget-convert (type &rest args) |
| 884 | "Convert TYPE to a widget without inserting it in the buffer. | 885 | "Convert TYPE to a widget without inserting it in the buffer. |
| 885 | The optional ARGS are additional keyword arguments." | 886 | The optional ARGS are additional keyword arguments." |