1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Add :continue-only directive to bind-keys and use-package

* lisp/bind-key.el (bind-keys-form): Add :continue-only binding.
Fix indentation.

* lisp/use-package/use-package-bind-key.el
(use-package-normalize-binder): Add check for :continue-only.

* test/lisp/repeat-tests.el (repeat-tests-bind-keys):
Enable (and correct) test for :continue-only (bug#74140).
This commit is contained in:
Paul Nelson 2025-02-22 23:12:41 +01:00 committed by Juri Linkov
parent 3de9994b9e
commit 85a9b916db
4 changed files with 36 additions and 27 deletions

View file

@ -290,6 +290,9 @@ Accepts keyword arguments:
same behavior as if no special keyword had
been used (that is, the command is bound, and
it's `repeat-map' property set)
:continue-only BINDINGS - Within the scope of `:repeat-map', will make
the command continue but not enter the repeat
map, via the `repeat-continue' property
:filter FORM - optional form to determine when bindings apply
The rest of the arguments are conses of keybinding string and a
@ -325,11 +328,8 @@ function symbol (unquoted)."
override-global-map))))
(setq repeat-map (cadr args))
(setq map repeat-map))
((eq :continue (car args))
(setq repeat-type :continue
arg-change-func 'cdr))
((eq :exit (car args))
(setq repeat-type :exit
((memq (car args) '(:continue :continue-only :exit))
(setq repeat-type (car args)
arg-change-func 'cdr))
((eq :prefix (car args))
(setq prefix (cadr args)))
@ -348,7 +348,7 @@ function symbol (unquoted)."
(when repeat-type
(unless repeat-map
(error ":continue and :exit require specifying :repeat-map")))
(error ":continue(-only) and :exit require specifying :repeat-map")))
(when (and menu-name (not prefix))
(error "If :menu-name is supplied, :prefix must be too"))
@ -369,14 +369,14 @@ function symbol (unquoted)."
(cl-flet
((wrap (map bindings)
(if (and map pkg (not (memq map '(global-map
override-global-map))))
`((if (boundp ',map)
,(macroexp-progn bindings)
(eval-after-load
,(if (symbolp pkg) `',pkg pkg)
',(macroexp-progn bindings))))
bindings)))
(if (and map pkg (not (memq map '(global-map
override-global-map))))
`((if (boundp ',map)
,(macroexp-progn bindings)
(eval-after-load
,(if (symbolp pkg) `',pkg pkg)
',(macroexp-progn bindings))))
bindings)))
(append
(when prefix-map
@ -401,9 +401,18 @@ function symbol (unquoted)."
;; Only needed in this branch, since when
;; repeat-map is non-nil, map is always
;; non-nil
`(,@(when (and repeat-map (not (eq repeat-type :exit)))
`((put ,fun 'repeat-map ',repeat-map)))
(bind-key ,(car form) ,fun ,map ,filter))
(if (eq repeat-type :continue-only)
`((unless (memq ',repeat-map
(or (get ,fun 'repeat-continue)
'()))
(put ,fun 'repeat-continue
(append (or (get ,fun 'repeat-continue)
'())
(list ',repeat-map))))
(bind-key ,(car form) ,fun ,map ,filter))
`(,@(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))
(when next