]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow :keys in menus to be computed dynamically
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 11 Oct 2021 11:15:41 +0000 (13:15 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 11 Oct 2021 11:15:41 +0000 (13:15 +0200)
* doc/lispref/keymaps.texi (Extended Menu Items): Document it
(bug#28930).

* src/keyboard.c (parse_menu_item): Allow :keys to be a function.

doc/lispref/keymaps.texi
etc/NEWS
src/keyboard.c

index 407bdca5ed410863598eacd20d2485ff98ff55c9..066d8b3693ae5e2ae926a0123e8c0b7272f458c9 100644 (file)
@@ -2319,6 +2319,12 @@ This property specifies that @var{string} is the string to display
 as the keyboard equivalent for this menu item.  You can use
 the @samp{\\[...]} documentation construct in @var{string}.
 
+This property can also be a function (which will be called with no
+arguments).  This function should return a string.  This function will
+be called every time the menu is computed, so using a function that
+takes a lot of time to compute is not a good idea, and it should
+expect to be called from any context.
+
 @item :filter @var{filter-fn}
 This property provides a way to compute the menu item dynamically.
 The property value @var{filter-fn} should be a function of one argument;
index b91a5cbb72111eb10d3e3042ae07bc7c7fda02d0..010a6e51e3b41cb479b0ccaa8cf9287a3de0bfb0 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -134,6 +134,11 @@ with recent versions of Firefox.
 \f
 * Lisp Changes in Emacs 29.1
 
++++
+** :keys in 'menu-item' can now be a function.
+If so, it is called whenever the menu is computed, and can be used to
+calculate the keys dynamically.
+
 +++
 ** New major mode 'clean-mode'.
 This is a new major mode meant for debugging.  It kills absolutely all
index 9a50a5e5eb74c2d1ec63b3eebe0362ec1fa343e6..7184b1509b14f33fcd1a5768e8b73d0b1ef004c5 100644 (file)
@@ -7841,7 +7841,9 @@ parse_menu_item (Lisp_Object item, int inmenubar)
              else if (EQ (tem, QCkeys))
                {
                  tem = XCAR (item);
-                 if (CONSP (tem) || STRINGP (tem))
+                 if (FUNCTIONP (tem))
+                   ASET (item_properties, ITEM_PROPERTY_KEYEQ, call0 (tem));
+                 else if (CONSP (tem) || STRINGP (tem))
                    ASET (item_properties, ITEM_PROPERTY_KEYEQ, tem);
                }
              else if (EQ (tem, QCbutton) && CONSP (XCAR (item)))