如果您正在运行禁用
menu-bar-mode
的图形Emacs会话,则
C-<mouse-3>
应该会弹出一个对话框,显示整个菜单内容。但是,如果您在终端中运行Emacs,这肯定不起作用;您没有指定哪种情况,因此我将尽量不做假设。还可以创建自定义鼠标绑定(可选地,带有键盘修饰符)到
mouse-popup-menubar
和/或
mouse-popup-menubar-stuff
函数,但最终只能使您能够复制我上面描述的标准功能类似的行为。
由于
menu-bar-mode
有些不灵活和全局的特性(即它适用于所有Emacs框架,并且通过钩子等提供相对较少的自定义),我认为使用原始的Emacs非常难以精确地实现您所需的行为。可能可以编写自定义函数来临时启用
menu-bar-mode
,然后使用像
post-command-hook
这样的东西在选择后再次禁用它,但我不确定。如果时间允许,我会进一步调查。
此外,您可能希望查看第三方菜单栏包,(参见
EmacsWiki的菜单栏部分)。
编辑:我已经拼凑出一个相当笨拙的解决方案,您可能会发现有用...
(add-hook
'pre-command-hook
(lambda ()
(when (eq menu-bar-mode 42)
(menu-bar-mode -1))))
(defun my-menu-bar-open ()
(interactive)
(unless menu-bar-mode
(menu-bar-mode 1))
(menu-bar-open)
(setq menu-bar-mode 42))
我已经在图形会话中测试过了,它似乎模拟了你想要的行为,只要在执行my-menu-bar-open
和进行选择之间不执行任何Emacs注册为命令的操作(也就是除了导航菜单本身之外的任何操作)。选择42
是一个魔术数字(同时是Douglas Adams的致敬),旨在将钩子函数被激活的风险最小化 menu-bar-mode
变量的典型值。我不认为这样做有任何优雅之处,但这种明显丑陋的方式确实可以工作。如果你决定使用它,只需将my-menu-bar-open
绑定到f11
(或你喜欢的任何键)即可:
(global-set-key [f11] 'my-menu-bar-open)
或者,您可以通过类似的方式使用pre-command-hook
并改为通知menu-bar-open
执行临时切换menu-bar-mode
来实现非常相似的功能。