4

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

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

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

我在 GUI 中使用 Emacs 24.1。

4

4 回答 4

10

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

(global-set-key [f9] 'toggle-menu-bar-mode-from-frame)
  • 不确定超过 24 的 Emacs 版本。
  • 请确保 f9 在您的安装中确实可用。
于 2014-02-28T16:23:19.520 回答
4

如果您在menu-bar-mode禁用的情况下运行图形 Emacs 会话,C-<mouse-3>则应将菜单的全部内容作为弹出对话框显示。但是,如果您在终端中运行 Emacs,这绝对行不通;你没有具体说明是哪种情况,所以我尽量不做假设。也可以为mouse-popup-menubarand/ormouse-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))

我已经在图形会话中对此进行了测试,它似乎可以模拟您想要的行为,只要您在执行my-menu-bar-open和做出选择之间不执行 Emacs 注册为命令的任何操作(这基本上是导航以外的任何操作菜单本身)。的选择42是一个神奇的数字(和道格拉斯亚当斯的敬意),旨在最大限度地减少挂钩函数因menu-bar-mode变量的更典型值而被激活的风险。我并没有声称这在任何方面都很优雅,但是,以它明显丑陋的方式,它确实有效。如果您决定使用它,只需绑定my-menu-bar-openf11(或您喜欢的任何内容),即:

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

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

于 2012-06-25T04:17:03.153 回答
2

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)
于 2012-12-28T21:05:44.047 回答
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

请注意,这更像是一种 hack,而不是适当的解决方案。

于 2021-01-11T19:22:37.233 回答