From 950068809b81a911b121d41e8df0e561fb0675ac Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Tue, 9 Jun 2020 05:26:09 +0100 Subject: [PATCH 1/3] Support keymap symbol in bind-key GitHub-reference: fix https://github.com/jwiegley/use-package/issues/845 --- lisp/use-package/bind-key.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lisp/use-package/bind-key.el b/lisp/use-package/bind-key.el index 01e1d4d73d9..fef23740c67 100644 --- a/lisp/use-package/bind-key.el +++ b/lisp/use-package/bind-key.el @@ -154,11 +154,13 @@ spelled-out keystrokes, e.g., \"C-c C-z\". See documentation of COMMAND must be an interactive function or lambda form. -KEYMAP, if present, should be a keymap and not a quoted symbol. +KEYMAP, if present, should be a keymap variable or symbol. For example: (bind-key \"M-h\" #'some-interactive-function my-mode-map) + (bind-key \"M-h\" #'some-interactive-function 'my-mode-map) + If PREDICATE is non-nil, it is a form evaluated to determine when a key should be bound. It must return non-nil in such cases. Emacs can evaluate this form at any time that it does redisplay @@ -171,10 +173,11 @@ can safely be called at any time." `(let* ((,namevar ,key-name) (,keyvar (if (vectorp ,namevar) ,namevar (read-kbd-macro ,namevar))) + (kmap (if (and ,keymap (symbolp ,keymap)) (symbol-value ,keymap) ,keymap)) (,kdescvar (cons (if (stringp ,namevar) ,namevar (key-description ,namevar)) - (quote ,keymap))) - (,bindingvar (lookup-key (or ,keymap global-map) ,keyvar))) + (if (symbolp ,keymap) ,keymap (quote ,keymap)))) + (,bindingvar (lookup-key (or kmap global-map) ,keyvar))) (let ((entry (assoc ,kdescvar personal-keybindings)) (details (list ,command (unless (numberp ,bindingvar) @@ -183,11 +186,11 @@ can safely be called at any time." (setcdr entry details) (add-to-list 'personal-keybindings (cons ,kdescvar details)))) ,(if predicate - `(define-key (or ,keymap global-map) ,keyvar + `(define-key (or kmap global-map) ,keyvar '(menu-item "" nil :filter (lambda (&optional _) (when ,predicate ,command)))) - `(define-key (or ,keymap global-map) ,keyvar ,command))))) + `(define-key (or kmap global-map) ,keyvar ,command))))) ;;;###autoload (defmacro unbind-key (key-name &optional keymap) From de49954965ae4ab61b440d63eb4c0bf302a09b7d Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Fri, 26 Jun 2020 02:22:46 +0100 Subject: [PATCH 2/3] add test for GitHub-reference: https://github.com/jwiegley/use-package/issues/845 --- test/lisp/use-package/use-package-tests.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/lisp/use-package/use-package-tests.el b/test/lisp/use-package/use-package-tests.el index 61438185373..5d346d94df3 100644 --- a/test/lisp/use-package/use-package-tests.el +++ b/test/lisp/use-package/use-package-tests.el @@ -1936,6 +1936,12 @@ (define-prefix-command 'my/map) (bind-key "" 'my/map nil nil)))) +(defvar test-map (make-keymap)) + +(ert-deftest bind-key/845 () + (bind-key "C-c f" 'ignore 'test-map) + (describe-personal-keybindings)) + ;; Local Variables: ;; indent-tabs-mode: nil ;; no-byte-compile: t From 2ca2212f7312061c5462c8826774857e2455c1a8 Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Tue, 7 Jul 2020 14:17:00 +0100 Subject: [PATCH 3/3] better tests --- test/lisp/use-package/use-package-tests.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/lisp/use-package/use-package-tests.el b/test/lisp/use-package/use-package-tests.el index 5d346d94df3..f0784315f75 100644 --- a/test/lisp/use-package/use-package-tests.el +++ b/test/lisp/use-package/use-package-tests.el @@ -1936,11 +1936,17 @@ (define-prefix-command 'my/map) (bind-key "" 'my/map nil nil)))) -(defvar test-map (make-keymap)) (ert-deftest bind-key/845 () - (bind-key "C-c f" 'ignore 'test-map) - (describe-personal-keybindings)) + (defvar test-map (make-keymap)) + (bind-key "" 'ignore 'test-map) + (should (eq (lookup-key test-map (kbd "")) 'ignore)) + (let ((binding (cl-find "" personal-keybindings :test 'string= :key 'caar))) + (message "test-map %s" test-map) + (message "binding %s" binding) + (should (eq (cdar binding) 'test-map)) + (should (eq (nth 1 binding) 'ignore)) + (should (eq (nth 2 binding) nil)))) ;; Local Variables: ;; indent-tabs-mode: nil