]> git.eshelyaron.com Git - emacs.git/commitdiff
bind-key-form: allow :exit keyword inside repeat map
authorHugo Heagren <hugo@heagren.com>
Mon, 17 Jan 2022 15:41:35 +0000 (15:41 +0000)
committerHugo Heagren <hugo@heagren.com>
Fri, 28 Jan 2022 22:37:37 +0000 (22:37 +0000)
Keys bound inside the scope of :exit are bound inside the repeat map,
but do not have their repeat-map property set (so they run a function,
but 'exit' the map).

lisp/use-package/bind-key.el
lisp/use-package/use-package-bind-key.el

index bb09a6935a82b9a385fbd16b2e32d9c7906e6d8e..a899aca0ffcd1e8a445a016272ab12d13ec3151c 100644 (file)
@@ -263,6 +263,9 @@ Accepts keyword arguments:
                          'repeat-map property of each command bound
                          (within the scope of the :repeat-map keyword)
                          is set to this map.
+:exit BINDINGS         - Within the scope of :repeat-map will bind the
+                         key in the repeat map, but will not set the
+                         'repeat-map property of the bound command.
 :filter FORM           - optional form to determine when bindings apply
 
 The rest of the arguments are conses of keybinding string and a
@@ -273,12 +276,14 @@ function symbol (unquoted)."
         prefix
         repeat-map
         repeat-doc
+        repeat-type ;; Only used internally
         filter
         menu-name
         pkg)
 
     ;; Process any initial keyword arguments
-    (let ((cont t))
+    (let ((cont t)
+          (arg-change-func 'cddr))
       (while (and cont args)
         (if (cond ((and (eq :map (car args))
                         (not prefix-map))
@@ -296,6 +301,9 @@ function symbol (unquoted)."
                                          override-global-map))))
                    (setq repeat-map (cadr args))
                    (setq map repeat-map))
+                  ((eq :exit (car args))
+                   (setq repeat-type :exit
+                         arg-change-func 'cdr))
                   ((eq :prefix (car args))
                    (setq prefix (cadr args)))
                   ((eq :filter (car args))
@@ -304,7 +312,7 @@ function symbol (unquoted)."
                    (setq menu-name (cadr args)))
                   ((eq :package (car args))
                    (setq pkg (cadr args))))
-            (setq args (cddr args))
+            (setq args (funcall arg-change-func args))
           (setq cont nil))))
 
     (when (or (and prefix-map (not prefix))
@@ -362,7 +370,8 @@ function symbol (unquoted)."
                           ;; Only needed in this branch, since when
                           ;; repeat-map is non-nil, map is always
                           ;; non-nil
-                          `(,@(when repeat-map `((put ,fun 'repeat-map ',repeat-map)))
+                          `(,@(when (and repeat-map (not (eq repeat-type :exit)))
+                                `((put ,fun 'repeat-map ',repeat-map)))
                             (bind-key ,(car form) ,fun ,map ,filter))
                         `((bind-key ,(car form) ,fun nil ,filter))))))
                 first))
@@ -389,6 +398,9 @@ Accepts keyword arguments:
                          'repeat-map property of each command bound
                          (within the scope of the :repeat-map keyword)
                          is set to this map.
+:exit BINDINGS         - Within the scope of :repeat-map will bind the
+                         key in the repeat map, but will not set the
+                         'repeat-map property of the bound command.
 :filter FORM           - optional form to determine when bindings apply
 
 The rest of the arguments are conses of keybinding string and a
index d056d4266cc1661fe95e879473bf3d63d6a6fff8..73ea8ca83e0d753dacd3b6daf16abe01e3e8ee6c 100644 (file)
@@ -91,11 +91,13 @@ deferred until the prefix key sequence is pressed."
          ;;   :filter SEXP
          ;;   :menu-name STRING
          ;;   :package SYMBOL
+        ;;   :exit used within :repeat-map
          ((or (and (eq x :map) (symbolp (cadr arg)))
               (and (eq x :prefix) (stringp (cadr arg)))
               (and (eq x :prefix-map) (symbolp (cadr arg)))
               (and (eq x :prefix-docstring) (stringp (cadr arg)))
              (and (eq x :repeat-map) (symbolp (cadr arg)))
+             (eq x :exit)
               (and (eq x :repeat-docstring) (stringp (cadr arg)))
               (eq x :filter)
               (and (eq x :menu-name) (stringp (cadr arg)))