]> git.eshelyaron.com Git - emacs.git/commitdiff
Add command 'register-toggle-volatility'
authorEshel Yaron <me@eshelyaron.com>
Thu, 28 Mar 2024 20:29:14 +0000 (21:29 +0100)
committerEshel Yaron <me@eshelyaron.com>
Thu, 28 Mar 2024 20:29:14 +0000 (21:29 +0100)
lisp/bindings.el
lisp/register.el

index 816ca49319b25dbe3b30811fcd6508aa08262fbd..d45c561bb65a1d5a3f09694f1e5c2a44626cc69c 100644 (file)
@@ -1518,6 +1518,7 @@ if `inhibit-field-text-motion' is non-nil."
   "g"     #'insert-register
   "r"     #'copy-rectangle-to-register
   "n"     #'number-to-register
+  "v"     #'register-toggle-volatility
   "+"     #'increment-register
   "w"     #'window-configuration-to-register
   "f"     #'frameset-to-register)
index bde3998338fe1f7690a68133cd6631bf54bd571f..df028d8b8cadcc2b85b1277c8ca4b9e1cd3115a7 100644 (file)
@@ -138,13 +138,17 @@ See the documentation of the variable `register-alist' for possible VALUEs."
         (substring d (match-end 0))
       d)))
 
+(defface register-name
+  '((t :inherit help-key-binding))
+  "Face for register names.")
+
 (defun register-preview-default (r)
   "Return a string describing the register R.
 
 This function is the default value of
 `register-preview-function', which see."
   (format "%s: %s\n"
-         (single-key-description (car r))
+         (propertize (single-key-description (car r)) 'face 'register-name)
          (register-describe-oneline (car r))))
 
 (defvar register-preview-function #'register-preview-default
@@ -188,6 +192,13 @@ format of each entry in the preview."
                     (insert desc))))
               register-alist)))))
 
+(defvar register-volatile-registers nil
+  "List of volatile registers.")
+
+(defun register-volatile-p (register)
+  "Return non-nil if REGISTER is a volatile register."
+  (member register register-volatile-registers))
+
 (defun register-read-with-preview (prompt &optional confirm pred)
   "Read and return a register name, possibly showing existing registers.
 
@@ -225,7 +236,9 @@ appear in the preview, see `register-preview'."
                   (eq key 'escape)
                   (eq key ?\C-\[))
               (keyboard-quit))
-             ((and confirm (get-register key)
+             ((and confirm
+                   (not (register-volatile-p key))
+                   (get-register key)
                    (progn
                      (register-preview buffer nil key pred)
                      (not (y-or-n-p (substitute-quotes
@@ -714,5 +727,22 @@ and use mark and point as START and END."
       (setq deactivate-mark t)
       (indicate-copied-region (length (car rectangle))))))
 
+(defun register-toggle-volatility (register)
+  "Toggle volatility of register REGISTER.
+
+Emacs lets you overwrite volatile registers without confirmation, even
+when option `register-confirm-overwrite' is non-nil.
+
+By default, all registers are non-volatile."
+  (interactive
+   (list (register-read-with-preview "Toggle volatility of register: ")))
+  (if (register-volatile-p register)
+      (setq register-volatile-registers
+            (delete register register-volatile-registers))
+    (push register register-volatile-registers))
+  (message "Register %s is now %svolatile"
+           (propertize (single-key-description register) 'face 'register-name)
+           (if (register-volatile-p register) "" "non-")))
+
 (provide 'register)
 ;;; register.el ends here