branch: master commit f77d4210f6215fedd25cebaddaca16c12cc9d0d1 Author: Justin Burkett <jus...@burkett.cc> Commit: Justin Burkett <jus...@burkett.cc>
Consolidate key binding collection into which-key--get-bindings --- which-key.el | 83 +++++++++++++++++++++++++++++------------------------------- 1 file changed, 40 insertions(+), 43 deletions(-) diff --git a/which-key.el b/which-key.el index 96e7190..2158dd9 100644 --- a/which-key.el +++ b/which-key.el @@ -1761,16 +1761,25 @@ Requires `which-key-compute-remaps' to be non-nil" (forward-line)) (nreverse bindings))))) -(defun which-key--get-formatted-key-bindings (&optional bindings filter preserve-full-key) - "Uses `describe-buffer-bindings' to collect the key bindings in -BUFFER that follow the key sequence KEY-SEQ." - (let* ((unformatted (if bindings bindings (which-key--get-current-bindings)))) +(defun which-key--get-bindings (&optional keymap filter recursive) + "Collect key bindings. +If KEYMAP is nil, collect from current buffer using the current +key sequence as a prefix. Otherwise, collect from KEYMAP. FILTER +is a function to use to filter the bindings. If RECURSIVE is +non-nil, then bindings are collected recursively for all prefixes." + (let* ((unformatted + (cond ((keymapp keymap) + (which-key--get-keymap-bindings keymap recursive)) + (keymap + (error "%s is not a keymap" keymap)) + (t + (which-key--get-current-bindings))))) (when filter (setq unformatted (cl-remove-if-not filter unformatted))) (when which-key-sort-order (setq unformatted (sort unformatted which-key-sort-order))) - (which-key--format-and-replace unformatted preserve-full-key))) + (which-key--format-and-replace unformatted recursive))) ;;; Functions for laying out which-key buffer pages @@ -2342,37 +2351,29 @@ is selected interactively by mode in `minor-mode-map-alist'." (cdr (assq mode-sym minor-mode-map-alist))))) (defun which-key--show-keymap (keymap-name keymap &optional prior-args all) - (let (unformatted-keys formatted-keys) - (setq which-key--current-prefix nil - which-key--current-show-keymap-name keymap-name - which-key--using-show-keymap t) - (when prior-args (push prior-args which-key--prior-show-keymap-args)) - (if (and (keymapp keymap) - (setq unformatted-keys (which-key--get-keymap-bindings keymap all)) - ;; need this in two steps otherwise - ;; `which-key--get-formatted-key-bindings' will look for global - ;; keys if second argument is nil - (setq formatted-keys (which-key--get-formatted-key-bindings - unformatted-keys nil all)) - (> (length formatted-keys) 0)) - (progn - (cond ((listp which-key-side-window-location) - (setq which-key--last-try-2-loc - (apply #'which-key--try-2-side-windows - formatted-keys 0 which-key-side-window-location))) - (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys)) - (which-key--show-page 0))) - (let* ((key (key-description (list (read-key)))) - (next-def (lookup-key keymap (kbd key)))) - (cond ((and which-key-use-C-h-commands (string= "C-h" key)) - (which-key-C-h-dispatch)) - ((keymapp next-def) - (which-key--hide-popup-ignore-command) - (which-key--show-keymap (concat keymap-name " " key) next-def - (cons keymap-name keymap))) - (t (which-key--hide-popup))))) - (message "which-key: No bindings found in %s" keymap-name)))) + (setq which-key--current-prefix nil + which-key--current-show-keymap-name keymap-name + which-key--using-show-keymap t) + (when prior-args (push prior-args which-key--prior-show-keymap-args)) + (let ((bindings (which-key--get-bindings keymap nil all))) + (if (= (length bindings) 0) + (message "which-key: No bindings found in %s" keymap-name) + (cond ((listp which-key-side-window-location) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + bindings 0 which-key-side-window-location))) + (t (setq which-key--pages-plist + (which-key--create-pages bindings)) + (which-key--show-page 0))) + (let* ((key (key-description (list (read-key)))) + (next-def (lookup-key keymap (kbd key)))) + (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (which-key-C-h-dispatch)) + ((keymapp next-def) + (which-key--hide-popup-ignore-command) + (which-key--show-keymap (concat keymap-name " " key) next-def + (cons keymap-name keymap))) + (t (which-key--hide-popup))))))) (defun which-key--evil-operator-filter (binding) (let ((def (intern (cdr binding)))) @@ -2390,9 +2391,8 @@ is selected interactively by mode in `minor-mode-map-alist'." which-key--current-show-keymap-name "evil operator/motion keys" which-key--using-show-operator-keymap t) (when (keymapp keymap) - (let ((formatted-keys (which-key--get-formatted-key-bindings - (which-key--get-keymap-bindings keymap) - #'which-key--evil-operator-filter))) + (let ((formatted-keys + (which-key--get-bindings keymap #'which-key--evil-operator-filter))) (cond ((= (length formatted-keys) 0) (message "which-key: Keymap empty")) ((listp which-key-side-window-location) @@ -2421,10 +2421,7 @@ Finally, show the buffer." (setq which-key--current-prefix prefix-keys which-key--last-try-2-loc nil) (let ((start-time (when which-key--debug (current-time))) - (formatted-keys (which-key--get-formatted-key-bindings - (when from-keymap - (which-key--get-keymap-bindings from-keymap)) - filter)) + (formatted-keys (which-key--get-bindings from-keymap filter)) (prefix-keys (key-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys))