From 5ef327ce9fc1397cdbbde8936eca37ae6383d787 Mon Sep 17 00:00:00 2001 From: Hugo Heagren Date: Mon, 17 Jan 2022 15:41:35 +0000 Subject: [PATCH] bind-key-form: allow :exit keyword inside repeat map 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 | 18 +++++++++++++++--- lisp/use-package/use-package-bind-key.el | 2 ++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lisp/use-package/bind-key.el b/lisp/use-package/bind-key.el index bb09a6935a8..a899aca0ffc 100644 --- a/lisp/use-package/bind-key.el +++ b/lisp/use-package/bind-key.el @@ -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 diff --git a/lisp/use-package/use-package-bind-key.el b/lisp/use-package/use-package-bind-key.el index d056d4266cc..73ea8ca83e0 100644 --- a/lisp/use-package/use-package-bind-key.el +++ b/lisp/use-package/use-package-bind-key.el @@ -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))) -- 2.39.2