Fix handling of defcustom :local tag
For discussion, see the following emacs-devel thread: https://lists.gnu.org/r/emacs-devel/2020-11/msg00734.html * lisp/custom.el (custom-declare-variable): Delay call to make-variable-buffer-local until after user option has been initialized with a value. Otherwise the user option may be initialized to nil. * test/lisp/custom-tests.el (custom--test-local-option) (custom--test-permanent-option): New :local user options. (custom-test-local-option): New test for defcustom :local keyword.
This commit is contained in:
parent
b2ee665024
commit
dea3d6aa18
2 changed files with 45 additions and 3 deletions
|
@ -157,7 +157,9 @@ set to nil, as the value is no longer rogue."
|
||||||
(if (keywordp doc)
|
(if (keywordp doc)
|
||||||
(error "Doc string is missing"))
|
(error "Doc string is missing"))
|
||||||
(let ((initialize #'custom-initialize-reset)
|
(let ((initialize #'custom-initialize-reset)
|
||||||
(requests nil))
|
(requests nil)
|
||||||
|
;; Whether automatically buffer-local.
|
||||||
|
buffer-local)
|
||||||
(unless (memq :group args)
|
(unless (memq :group args)
|
||||||
(custom-add-to-group (custom-current-group) symbol 'custom-variable))
|
(custom-add-to-group (custom-current-group) symbol 'custom-variable))
|
||||||
(while args
|
(while args
|
||||||
|
@ -183,7 +185,7 @@ set to nil, as the value is no longer rogue."
|
||||||
(put symbol 'safe-local-variable value))
|
(put symbol 'safe-local-variable value))
|
||||||
((eq keyword :local)
|
((eq keyword :local)
|
||||||
(when (memq value '(t permanent))
|
(when (memq value '(t permanent))
|
||||||
(make-variable-buffer-local symbol))
|
(setq buffer-local t))
|
||||||
(when (eq value 'permanent)
|
(when (eq value 'permanent)
|
||||||
(put symbol 'permanent-local t)))
|
(put symbol 'permanent-local t)))
|
||||||
((eq keyword :type)
|
((eq keyword :type)
|
||||||
|
@ -205,7 +207,9 @@ set to nil, as the value is no longer rogue."
|
||||||
(put symbol 'custom-requests requests)
|
(put symbol 'custom-requests requests)
|
||||||
;; Do the actual initialization.
|
;; Do the actual initialization.
|
||||||
(unless custom-dont-initialize
|
(unless custom-dont-initialize
|
||||||
(funcall initialize symbol default)))
|
(funcall initialize symbol default))
|
||||||
|
(when buffer-local
|
||||||
|
(make-variable-buffer-local symbol)))
|
||||||
(run-hooks 'custom-define-hook)
|
(run-hooks 'custom-define-hook)
|
||||||
symbol)
|
symbol)
|
||||||
|
|
||||||
|
|
|
@ -151,4 +151,42 @@
|
||||||
(widget-apply field :value-to-internal origvalue)
|
(widget-apply field :value-to-internal origvalue)
|
||||||
"bar"))))))
|
"bar"))))))
|
||||||
|
|
||||||
|
(defcustom custom--test-local-option 'initial
|
||||||
|
"Buffer-local user option for testing."
|
||||||
|
:group 'emacs
|
||||||
|
:type '(choice (const initial) (const changed))
|
||||||
|
:local t)
|
||||||
|
|
||||||
|
(defcustom custom--test-permanent-option 'initial
|
||||||
|
"Permanently local user option for testing."
|
||||||
|
:group 'emacs
|
||||||
|
:type '(choice (const initial) (const changed))
|
||||||
|
:local 'permanent)
|
||||||
|
|
||||||
|
(ert-deftest custom-test-local-option ()
|
||||||
|
"Test :local user options."
|
||||||
|
;; Initial default values.
|
||||||
|
(should (eq custom--test-local-option 'initial))
|
||||||
|
(should (eq custom--test-permanent-option 'initial))
|
||||||
|
(should (eq (default-value 'custom--test-local-option) 'initial))
|
||||||
|
(should (eq (default-value 'custom--test-permanent-option) 'initial))
|
||||||
|
(let ((obuf (current-buffer)))
|
||||||
|
(with-temp-buffer
|
||||||
|
;; Changed buffer-local values.
|
||||||
|
(setq custom--test-local-option 'changed)
|
||||||
|
(setq custom--test-permanent-option 'changed)
|
||||||
|
(should (eq custom--test-local-option 'changed))
|
||||||
|
(should (eq custom--test-permanent-option 'changed))
|
||||||
|
(should (eq (default-value 'custom--test-local-option) 'initial))
|
||||||
|
(should (eq (default-value 'custom--test-permanent-option) 'initial))
|
||||||
|
(with-current-buffer obuf
|
||||||
|
(should (eq custom--test-local-option 'initial))
|
||||||
|
(should (eq custom--test-permanent-option 'initial)))
|
||||||
|
;; Permanent variable remains unchanged.
|
||||||
|
(kill-all-local-variables)
|
||||||
|
(should (eq custom--test-local-option 'initial))
|
||||||
|
(should (eq custom--test-permanent-option 'changed))
|
||||||
|
(should (eq (default-value 'custom--test-local-option) 'initial))
|
||||||
|
(should (eq (default-value 'custom--test-permanent-option) 'initial)))))
|
||||||
|
|
||||||
;;; custom-tests.el ends here
|
;;; custom-tests.el ends here
|
||||||
|
|
Loading…
Add table
Reference in a new issue