From ec84ed0dfbeebb8683330449aa4e476debd2f72c Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Sat, 9 Dec 2017 16:28:49 -0800 Subject: [PATCH] Fix a scoping issues with multiple occurrences of :bind Fixes https://github.com/jwiegley/use-package/issues/585 --- lisp/use-package/use-package-bind-key.el | 7 +++++-- lisp/use-package/use-package-core.el | 10 +++++++++- test/lisp/use-package/use-package-tests.el | 15 +++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lisp/use-package/use-package-bind-key.el b/lisp/use-package/use-package-bind-key.el index b26c812bf58..d8fe56dfaa5 100644 --- a/lisp/use-package/use-package-bind-key.el +++ b/lisp/use-package/use-package-bind-key.el @@ -128,8 +128,11 @@ deferred until the prefix key sequence is pressed." (name keyword args rest state &optional bind-macro) (use-package-concat (use-package-process-keywords name rest state) - `((,(if bind-macro bind-macro 'bind-keys) - :package ,name ,@(use-package-normalize-commands args))))) + `(,@(mapcar + #'(lambda (xs) + `(,(if bind-macro bind-macro 'bind-keys) + :package ,name ,@(use-package-normalize-commands xs))) + (use-package-split-list-at-keys :break args))))) (defun use-package-handler/:bind* (name keyword arg rest state) (use-package-handler/:bind name keyword arg rest state 'bind-keys*)) diff --git a/lisp/use-package/use-package-core.el b/lisp/use-package/use-package-core.el index e700c1c110b..df65e04b9a0 100644 --- a/lisp/use-package/use-package-core.el +++ b/lisp/use-package/use-package-core.el @@ -180,7 +180,8 @@ t according to whether defaulting should be attempted." (defcustom use-package-merge-key-alist '((:if . (lambda (new old) `(and ,new ,old))) (:after . (lambda (new old) `(:all ,new ,old))) - (:defer . (lambda (new old) old))) + (:defer . (lambda (new old) old)) + (:bind . (lambda (new old) (append new (list :break) old)))) "Alist of keys and the functions used to merge multiple values. For example, if the following form is provided: @@ -472,6 +473,13 @@ This is in contrast to merely setting it to 0." (nconc ys (list x))))) (cons (cdr ys) (cdr zs)))) +(defun use-package-split-list-at-keys (key lst) + (when lst + (let* ((xs (use-package-split-list (apply-partially #'eq key) lst)) + (args (car xs)) + (tail (cdr xs))) + (cons args (use-package-split-list-at-keys key (cdr tail)))))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Keywords diff --git a/test/lisp/use-package/use-package-tests.el b/test/lisp/use-package/use-package-tests.el index 5ba6db8a4b5..5aab6bb1170 100644 --- a/test/lisp/use-package/use-package-tests.el +++ b/test/lisp/use-package/use-package-tests.el @@ -1769,6 +1769,21 @@ t)) (bind-keys :package helm ("C-c d" . helm-mini))))) +(ert-deftest use-package-test/585 () + (match-expansion + (use-package bug + :bind (:map bug-map ("C-a" . alpha)) + :bind (("C-b" . beta))) + `(progn + (unless (fboundp 'alpha) + (autoload #'alpha "bug" nil t)) + (unless (fboundp 'beta) + (autoload #'beta "bug" nil t)) + (bind-keys :package bug :map bug-map + ("C-a" . alpha)) + (bind-keys :package bug + ("C-b" . beta))))) + (ert-deftest bind-key/:prefix-map () (match-expansion (bind-keys :prefix "" -- 2.39.2