]> git.eshelyaron.com Git - emacs.git/commitdiff
New value 'permanent-only' for defcustom :local keyword
authorStefan Kangas <stefankangas@gmail.com>
Tue, 1 Oct 2024 23:03:08 +0000 (01:03 +0200)
committerEshel Yaron <me@eshelyaron.com>
Thu, 3 Oct 2024 06:41:50 +0000 (08:41 +0200)
* lisp/custom.el (custom-declare-variable): Make the :local keyword
accept the symbol 'permanent-local', meaning that the variable is
permanent but not marked as automatically buffer-local.
(defcustom):
* doc/lispref/customize.texi (Variable Definitions): Document the
above change.

* test/lisp/custom-tests.el
(custom-tests-defcustom-:local-keyword): New test.

(cherry picked from commit 9ad73f92617da1286724f9774b34bb7ce6a4299d)

doc/lispref/customize.texi
etc/NEWS
lisp/custom.el
test/lisp/custom-tests.el

index 33708d7faaa3bc78f4139a6ce2459603c7ca371f..b32f9dbb90362e14cbc0b0df02f0aee96a8f88ce 100644 (file)
@@ -448,7 +448,10 @@ the build-time context.  This also has the side-effect that the
 @kindex local@r{, @code{defcustom} keyword}
 If the @var{value} is @code{t}, mark @var{option} as automatically
 buffer-local; if the value is @code{permanent}, also set @var{option}s
-@code{permanent-local} property to @code{t}.  @xref{Creating Buffer-Local}.
+@code{permanent-local} property to @code{t}.  Finally, if the value is
+@code{permanent-only}, set @var{option}s @code{permanent-local} property
+to @code{t} without marking it as automatically buffer-local.
+@xref{Creating Buffer-Local}.
 
 @item :risky @var{value}
 @kindex risky@r{, @code{defcustom} keyword}
index 59861a59f588946eaf34d2a690d61172569ae4cf..39ca829be93dbcb2e4d73d23035d5aa2ed37fe04 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -451,6 +451,11 @@ sup-mouse.el, terminal.el, vi.el, vip.el, ws-mode.el, and yow.el.
 \f
 * Lisp Changes in Emacs 31.1
 
++++
+** The 'defcustom' :local keyword can now be 'permanent-only'.
+This means that the variable's 'permanent-local' property is set to t,
+without marking it as automatically buffer-local.
+
 ---
 ** The obsolete face attribute ':reverse-video' has been removed.
 Use ':inverse-video' instead.
index 5820a0ffb1ef69910aa1937518f12742fd977230..169bd3e1dfc46857f1ea52f5ac785cb5a800c5a8 100644 (file)
@@ -204,7 +204,7 @@ set to nil, as the value is no longer rogue."
                 ((eq keyword :local)
                  (when (memq value '(t permanent))
                    (setq buffer-local t))
-                 (when (eq value 'permanent)
+                 (when (memq value '(permanent permanent-only))
                    (put symbol 'permanent-local t)))
                ((eq keyword :type)
                 (put symbol 'custom-type (purecopy value)))
@@ -300,6 +300,8 @@ The following keywords are meaningful:
 :local  If VALUE is t, mark SYMBOL as automatically buffer-local.
         If VALUE is `permanent', also set SYMBOL's `permanent-local'
         property to t.
+        If VALUE is `permanent-only', set SYMBOL's `permanent-local'
+        property to t, but do not mark it as automatically buffer-local.
 
 The following common keywords are also meaningful.
 
index c009abfe0d1e244f1a017a6c664487ab39adc78d..e963314fcca23f88db2d55ad86b7c243e40b0f61 100644 (file)
       ;; But it was only for the current session, so this should not happen.
       (should-not (get 'custom--test-bug-21355-after 'saved-value)))))
 
+(defcustom custom-tests--:local-nil nil
+  "Not local or permanent."
+  :type 'number
+  :group 'emacs)
+(defcustom custom-tests--:local-t nil
+  "Automatically local but not permanent."
+  :type 'number
+  :local t
+  :group 'emacs)
+(defcustom custom-tests--:local-permanent nil
+  "Automatically local and permanent."
+  :type 'number
+  :local 'permanent
+  :group 'emacs)
+(defcustom custom-tests--:local-permanent-only nil
+  "Permanent but not automatically local."
+  :type 'number
+  :local 'permanent-only
+  :group 'emacs)
+(ert-deftest custom-tests-defcustom-:local-keyword ()
+  (should-not (local-variable-if-set-p 'custom-tests--:local-nil))
+  (should-not (get 'custom-tests--:local-nil 'permanent-local))
+  (should (local-variable-if-set-p 'custom-tests--:local-t))
+  (should-not (get 'custom-tests--:local-t 'permanent-local))
+  (should (local-variable-if-set-p 'custom-tests--:local-permanent))
+  (should (get 'custom-tests--:local-permanent 'permanent-local))
+  (should-not (local-variable-if-set-p 'custom-tests--:local-permanent-only))
+  (should (get 'custom-tests--:local-permanent-only 'permanent-local)))
+
 ;;; custom-tests.el ends here