]> git.eshelyaron.com Git - emacs.git/commitdiff
Change the display of menu bindings in *Help*
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 25 Apr 2022 19:14:24 +0000 (21:14 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 25 Apr 2022 19:14:33 +0000 (21:14 +0200)
* lisp/help-fns.el (help-fns--insert-menu-bindings): New function
to describe menu entries more fully (bug#52870).
(help-fns--key-bindings): Use it.

etc/NEWS
lisp/help-fns.el

index 2048e5aa984f466f224ada3a5b5ccecf567c059b..89a8c34df9175dd4b36c5ffda1b7b0b1b8fe6509 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -416,6 +416,18 @@ command also works for non-Emoji characters.)
 
 ** Help
 
+---
+*** Commands like 'C-h f' have changed how they describe menu bindings.
+For instance, previously a command might be described as having the
+following bindings:
+
+  It is bound to <open>, C-x C-f, <menu-bar> <file> <new-file>.
+
+This has been changed to:
+
+  It is bound to <open> and C-x C-f.
+  It can also be invoked from the menu: File → Visit New File....
+
 +++
 *** The 'C-h .' command now accepts a prefix argument.
 'C-u C-h .' would previously inhibit displaying a warning message if
index 23cfb04798fb70d927814ff36e933ed7efe4dc67..459998016674e6b3e0c98edf23e5ac536d87d24e 100644 (file)
@@ -568,9 +568,7 @@ the C sources, too."
                 (insert (concat "It can "
                                 (and keys "also ")
                                 "be invoked from the menu: "))
-                ;; FIXME: Should insert menu names instead of key
-                ;; binding names.
-                (help-fns--insert-bindings menus)
+                (help-fns--insert-menu-bindings menus)
                 (insert ".")
                 (fill-region-as-paragraph start (point))))
             (ensure-empty-lines)))))))
@@ -584,6 +582,33 @@ the C sources, too."
                     (insert (help--key-description-fontified key)))
                   keys))
 
+(defun help-fns--insert-menu-bindings (menus)
+  (seq-do-indexed
+   (lambda (menu i)
+     (insert
+      (cond ((zerop i) "")
+            ((= i (1- (length menus))) " and ")
+            (t ", ")))
+     (let ((map (lookup-key global-map (seq-take menu 1)))
+           (start (point)))
+       (seq-do-indexed
+        (lambda (entry level)
+          (when (> level 0)
+            (insert
+             (if (char-displayable-p ?→)
+                 " → "
+               " => ")))
+          (let ((elem (assq entry (cdr map))))
+            (if (eq (nth 1 elem) 'menu-item)
+                (progn
+                  (insert (nth 2 elem))
+                  (setq map (cadddr elem)))
+              (insert (nth 1 elem))
+              (setq map (cddr elem)))))
+        (cdr (seq-into menu 'list)))
+       (put-text-property start (point) 'face 'help-key-binding)))
+   menus))
+
 (defun help-fns--compiler-macro (function)
   (let ((handler (function-get function 'compiler-macro)))
     (when handler