From f230a55e2118b034b2cfce7a39c74e5770c9f324 Mon Sep 17 00:00:00 2001 From: Jakob Leifhelm Date: Thu, 29 Apr 2021 11:29:17 +0200 Subject: [PATCH 1/2] Implement which-key keymap based replacements --- general.el | 85 ++++-------------------------------------------------- 1 file changed, 6 insertions(+), 79 deletions(-) diff --git a/general.el b/general.el index b617e65..4207cc6 100644 --- a/general.el +++ b/general.el @@ -648,89 +648,16 @@ the other hand, doesn't make sense at all globally.") ;; ** Normal Extended Definition Functions ;; *** Which Key Integration -(defvar which-key-replacement-alist) -(defun general--add-which-key-replacement (mode replacement) - (let* ((mode-match (assq mode which-key-replacement-alist)) - (mode-alist (cdr mode-match))) - (cond (mode - (push replacement mode-alist) - (if mode-match - (setcdr mode-match mode-alist) - (push (cons mode mode-alist) - which-key-replacement-alist))) - (t - (push replacement which-key-replacement-alist))))) - -(defvar which-key--prefix-title-alist) -(defun general--add-which-key-title-prefix (mode keys title-prefix) - (let* ((mode-match (assq mode which-key--prefix-title-alist)) - (title-mode-alist (cdr mode-match)) - (title-cons (cons keys title-prefix))) - (cond (mode - (push title-cons title-mode-alist) - (if mode-match - (setcdr mode-match - title-mode-alist) - (push (cons mode title-mode-alist) - which-key--prefix-title-alist))) - (t - (push title-cons which-key--prefix-title-alist))))) - -(defun general--remove-map (keymap) - "Remove \"-map\" from the symbol KEYMAP." ; - (intern (replace-regexp-in-string "-map$" "" (symbol-name keymap)))) ;; TODO better documentation -(defun general-extended-def-:which-key (_state keymap key edef kargs) +(defun general-extended-def-:which-key (state keymap key edef _kargs) "Add a which-key description for KEY. -If :major-modes is specified in EDEF, add the description for the corresponding -major mode. KEY should not be in the kbd format (kbd should have already been -run on it)." +KEY should not be in the kbd format (kbd should have already been run on it)." (general-with-eval-after-load 'which-key - (let* ((wk (general--getf2 edef :which-key :wk)) - (major-modes (general--getf edef kargs :major-modes)) - (keymaps (plist-get kargs :keymaps)) - ;; index of keymap in :keymaps - (keymap-index (cl-dotimes (ind (length keymaps)) - (when (eq (nth ind keymaps) keymap) - (cl-return ind)))) - (mode (let ((mode (if (and major-modes (listp major-modes)) - (nth keymap-index major-modes) - major-modes))) - (if (eq mode t) - (general--remove-map keymap) - mode))) - (key (key-description key)) - (key-regexp (concat (when (general--getf edef kargs :wk-full-keys) - "\\`") - (regexp-quote key) - "\\'")) - (prefix (plist-get kargs :prefix)) - (binding (or (when (and (plist-get edef :def) - (not (plist-get edef :keymp))) - (plist-get edef :def)) - (when (and prefix - (string= key prefix)) - (plist-get kargs :prefix-command)))) - (replacement (cond ((stringp wk) - (cons nil wk)) - (t - wk))) - (match/replacement - (cons - (cons (when (general--getf edef kargs :wk-match-keys) - key-regexp) - (when (and (general--getf edef kargs :wk-match-binding) - binding - (symbolp binding)) - (regexp-quote (symbol-name binding)))) - replacement))) - (general--add-which-key-replacement mode match/replacement) - (when (and (consp replacement) - ;; lambda - (not (functionp replacement))) - (general--add-which-key-title-prefix - mode key (cdr replacement)))))) + (let ((wk (general--getf2 edef :which-key :wk)) + (key (key-description key)) + (keymap (general--get-keymap state keymap))) + (which-key-add-keymap-based-replacements keymap key wk)))) (defalias 'general-extended-def-:wk #'general-extended-def-:which-key) From cc5eb26f4f894fe70d184bdf73c32d8f69046454 Mon Sep 17 00:00:00 2001 From: Jakob Leifhelm Date: Thu, 29 Jul 2021 10:51:37 +0200 Subject: [PATCH 2/2] which-key replacements: Handle :definer 'minor-mode --- general.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/general.el b/general.el index 4207cc6..fe083b0 100644 --- a/general.el +++ b/general.el @@ -650,13 +650,15 @@ the other hand, doesn't make sense at all globally.") ;; *** Which Key Integration ;; TODO better documentation -(defun general-extended-def-:which-key (state keymap key edef _kargs) +(defun general-extended-def-:which-key (state keymap key edef kargs) "Add a which-key description for KEY. KEY should not be in the kbd format (kbd should have already been run on it)." (general-with-eval-after-load 'which-key - (let ((wk (general--getf2 edef :which-key :wk)) - (key (key-description key)) - (keymap (general--get-keymap state keymap))) + (let* ((wk (general--getf2 edef :which-key :wk)) + (key (key-description key)) + (minor-mode (eq 'minor-mode + (general--getf edef kargs :definer))) + (keymap (general--get-keymap state keymap minor-mode))) (which-key-add-keymap-based-replacements keymap key wk)))) (defalias 'general-extended-def-:wk #'general-extended-def-:which-key)