justbur / emacs-which-key

Emacs package that displays available keybindings in popup
GNU General Public License v3.0
1.73k stars 87 forks source link

Paging hint suggests C-h even when it's bound under given prefix and won't work #368

Open crzcrz opened 4 months ago

crzcrz commented 4 months ago

I believe the current implementation of which-key--next-page-hint could be improved. There are two issues with it.

  1. If help-char (C-h) is bound under the current prefix, then pressing C-h will invoke the binding and not which-key-C-h-dispatch, while the hint still reads [C-h paging/help],
  2. no hint is displayed for C-h- prefix at all, even if we have manually bound some key to which-key-C-h-dispatch there.

I've made a crude prototype that attempts to display a hint with keys that would actually work under the given prefix.

(defun which-key--next-page-hint (prefix-keys)
  "Return string for next page hint."
  (when which-key-use-C-h-commands
    (let* ((user-paging-key (concat prefix-keys " " which-key-paging-key))
           (paging-key (concat prefix-keys " " (help-key)))
           (help-prefix (equal (vector help-char)
                               (vconcat (kbd prefix-keys))))
           (keys '()))
      (when (eq 'which-key-C-h-dispatch
                (key-binding (kbd user-paging-key)))
        (push which-key-paging-key keys))
      (unless help-prefix
        (push "?" keys)
        (push "<f1>" keys)
        (unless (key-binding (kbd paging-key))
          (push (help-key) keys)))
      (when keys
        (which-key--propertize (format "[%s%spaging/help]"
                                       (string-join keys " or ")
                                       which-key-separator)
                               'face 'which-key-note-face)))))

Now we get nice hints:

One remaining issue with my prototype is that a hint will be still displayed for evil prefixes while it shouldn't, as it is not possible to make any binding to which-key-C-h-dispatch there.

justbur commented 4 months ago

Hi, I'm happy to consider a PR for this. I think it makes sense.