在Emacs中动态显示/隐藏菜单栏

Mir*_*lov 3 emacs elisp menu menubar

我已经menu-bar-open绑定在f11和菜单栏被关闭,正因为如此,f11调用tmm-menubar,这是不方便的,并没有因为某些原因(如组织和TBL在组织模式)的模式特定的菜单项.我希望它以这种方式运行:使菜单栏可见,使用户可以选择菜单项,之后再次使菜单栏不可见.

什么是最惯用和优雅的方式?

我考虑过编写建议,但Emacs开发人员通常建议不要这样做,因为它会导致调试问题,标准的Emacs代码不包含建议.

我在GUI中使用Emacs 24.1.

Ric*_*mes 7

在Emacs-24中,您可以这样做:

(global-set-key [f9] 'toggle-menu-bar-mode-from-frame)
Run Code Online (Sandbox Code Playgroud)
  • 不确定24岁以上的Emacs版本.
  • 请确保您的安装中确实可以使用f9.


Gre*_* E. 4

如果您在禁用的情况下运行图形 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-openf11(或您喜欢的任何内容),即:

(global-set-key [f11] 'my-menu-bar-open)
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过pre-command-hook以类似的方式使用并建议menu-bar-open执行临时切换来实现非常相似的功能menu-bar-mode