在Emacs-24中,您可以这样做:
(global-set-key [f9] 'toggle-menu-bar-mode-from-frame)
Run Code Online (Sandbox Code Playgroud)
如果您在禁用的情况下运行图形 Emacs 会话menu-bar-mode,则应C-<mouse-3>将菜单的全部内容显示为弹出对话框。然而,如果您在终端中运行 Emacs,这肯定行不通;你没有具体说明是哪种情况,所以我会尽量不做假设。还可以为mouse-popup-menubar和/或mouse-popup-menubar-stuff函数创建自定义鼠标绑定(可选地,使用键盘修饰符),但最终这只会让您能够复制与我上面描述的标准功能类似的行为。
由于有点不灵活和全局性menu-bar-mode(即,它适用于所有 Emacs 框架并通过钩子等提供相对较少的定制),我认为用 vanilla 精确实现您想要的行为将非常困难Emacs。可能可以编写一个自定义函数来暂时启用menu-bar-mode,然后post-command-hook在做出选择后使用类似的方法再次禁用它,但我不确定。如果时间允许,我会尝试进一步调查。
另外,您可能希望研究第三方菜单栏包(qv,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))
Run Code Online (Sandbox Code Playgroud)
我已经在图形会话中对此进行了测试,它似乎可以模拟您想要的行为,只要您不执行 Emacs 在执行my-menu-bar-open和做出选择之间注册为命令的任何操作(基本上除了导航之外的任何操作)菜单本身)。选择42一个幻数(也是对道格拉斯·亚当斯的致敬),旨在最大限度地减少针对更典型的变量值激活钩子函数的风险menu-bar-mode。我并不认为这在任何方面都是优雅的,但是,以它明显丑陋的方式,它确实有效。如果您决定使用它,只需绑定my-menu-bar-open到f11(或您喜欢的任何内容),即:
(global-set-key [f11] 'my-menu-bar-open)
Run Code Online (Sandbox Code Playgroud)
或者,您可以通过pre-command-hook以类似的方式使用并建议menu-bar-open执行临时切换来实现非常相似的功能menu-bar-mode。