From e64f9c55e1a1e57de3783fbbac1bf239ac30babb Mon Sep 17 00:00:00 2001 From: Mauro Aranda Date: Wed, 9 Aug 2023 09:17:43 -0300 Subject: [PATCH] Respect the :value property in a list widget (Bug#63290) * lisp/wid-edit.el (widget-list-default-get): New function. * test/lisp/cus-edit-tests.el (cus-edit-test-bug-63290-option): New test option. (cus-edit-test-bug63290): New test. --- lisp/wid-edit.el | 11 +++++++++++ test/lisp/cus-edit-tests.el | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el index 47531113ba8..c604225f10a 100644 --- a/lisp/wid-edit.el +++ b/lisp/wid-edit.el @@ -3812,8 +3812,19 @@ widget-character-notify (define-widget 'list 'group "A Lisp list." :tag "List" + :default-get #'widget-list-default-get :format "%{%t%}:\n%v") +(defun widget-list-default-get (widget) + "Return the default external value for a list WIDGET. + +The default value is the one stored in the :value property, even if it is nil, +or a list with the default value of each component of the list WIDGET." + (widget-apply widget :value-to-external + (if (widget-member widget :value) + (widget-get widget :value) + (widget-group-default-get widget)))) + (define-widget 'vector 'group "A Lisp vector." :tag "Vector" diff --git a/test/lisp/cus-edit-tests.el b/test/lisp/cus-edit-tests.el index eca35d7c96a..75d5f32c421 100644 --- a/test/lisp/cus-edit-tests.el +++ b/test/lisp/cus-edit-tests.el @@ -92,5 +92,29 @@ test-setopt (buffer-substring-no-properties (point-min) (point-max))))) (should (string-search "Value `:foo' does not match type number" warn-txt)))) + +(defcustom cus-edit-test-bug63290-option nil + "Choice option for testing Bug#63290." + :type '(choice (alist + :key-type (string :tag "key") + :value-type (string :tag "value")) + (const :tag "auto" auto))) + +(ert-deftest cus-edit-test-bug63290 () + "Test that changing a choice value back to an alist respects its nil value." + (customize-variable 'cus-edit-test-bug63290-option) + (search-forward "Value") + ;; Simulate changing the value. + (let* ((choice (widget-at)) + (args (widget-get choice :args)) + (list-opt (car (widget-get choice :children))) + (const-opt (nth 1 args))) + (widget-put choice :explicit-choice const-opt) + (widget-value-set choice (widget-default-get const-opt)) + (widget-put choice :explicit-choice list-opt) + (widget-value-set choice (widget-default-get list-opt))) + ;; No empty key/value pairs should show up. + (should-not (search-forward "key" nil t))) + (provide 'cus-edit-tests) ;;; cus-edit-tests.el ends here -- 2.34.1