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

时间:2012-06-24 08:47:48

标签: emacs menu elisp menubar

我已将<{1}}绑定在 f11 并关闭菜单栏,因此, f11 调用menu-bar-open,这很不方便并且由于某种原因没有特定于模式的菜单项(例如org-mode中的org和tbl)。我希望它以这种方式运行:使菜单栏可见,使用户可以选择菜单项,之后再次使菜单栏不可见。

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

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

我在GUI中使用Emacs 24.1。

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

如果您正在运行禁用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之类的东西在选择后再次禁用它,但我不确定。如果时间允许,我会尝试进一步调查。

此外,您可能希望查看第三方菜单栏包(q.v.,Menu Bar section of 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))

我在图形会话中对此进行了测试,它似乎模拟了您想要的行为,只要您不执行Emacs在执行my-menu-bar-open和进行选择之间作为命令注册的任何操作(基本上除了导航菜单本身之外)。选择42是一个神奇的数字(以及道格拉斯亚当斯的敬意),旨在最大限度地降低为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的临时切换。

答案 2 :(得分:1)

Greg的答案略有改进,保持pre-command-hook清洁:

(menu-bar-mode -1)

(defun my-menu-bar-open-after ()
  (remove-hook 'pre-command-hook 'my-menu-bar-open-after)
  (when (eq menu-bar-mode 42)
    (menu-bar-mode -1)))

(defun my-menu-bar-open (&rest args)
  (interactive)
  (let ((open menu-bar-mode))
    (unless open
      (menu-bar-mode 1))
    (funcall 'menu-bar-open args)
    (unless open
      (setq menu-bar-mode 42)
      (add-hook 'pre-command-hook 'my-menu-bar-open-after))))

(global-set-key [f10] 'my-menu-bar-open)

答案 3 :(得分:0)

我已经在 GNU Emacs 25.2 和 26.3 中对此进行了测试:

(menu-bar-mode -1)

(advice-add 'menu-bar-open
            :around
            (lambda (orig-fun &rest args)
              (menu-bar-mode 1)
              (apply orig-fun args)
              (menu-bar-mode -1)))

结果行为(假设 menu-bar-open 绑定到 F10,这是默认值):

  • 默认情况下不显示菜单栏。
  • 如果您按 F10,将显示菜单栏。
  • 离开菜单栏后,菜单栏将消失,直到您下次按 F10

请注意,这更像是一种黑客攻击,而不是正确的解决方案。