在不活动时隐藏Emacs回显区域

27

回显区是 Emacs 模式行下方的一行:

                     ~                       ~
                     |                       |
                     +-----------------------+
                     |-U:--- mode-line       |
                     +-----------------------+
                     | M-x echo-area         |
                     +-----------------------+

现在,模式行非常定制化,而回显区域则更加死板(并且大部分时间都没有使用)。问题非常简单:在不活动时是否可以隐藏回显区域,并在需要时重新显示它:

现在模式行高度可定制化,而回显区域则显得更加僵硬(并且很多时候都没有使用)。问题很简单:是否可以在不活动时隐藏回显区域,并在需要注意时重新显示它:

  ~                       ~             ~                       ~
  |                       |             |                       |
  |                       |             +-----------------------+
  |                       |             |-U:--- mode-line       |
  +-----------------------+             +-----------------------+
  |-U:--- mode-line       |             | M-x echo-area         |
  +-----------------------+             +-----------------------+

          Inactive                                Active

这类似于 Google Chrome 当你悬停在链接上时显示 URL 的方式,以及 Firefox 插件 Pentadactyl,其中命令行默认隐藏。

5个回答

7

这并不是你所问的答案,它不会给你迷你缓冲区,但它将为你节省一些屏幕空间。

(defun toggle-mode-line () "toggles the modeline on and off"
  (interactive) 
  (setq mode-line-format
    (if (equal mode-line-format nil)
        (default-value 'mode-line-format)) )
  (redraw-display))

(global-set-key [M-f12] 'toggle-mode-line)

为了完整起见,“luddite-mode”的标志是什么。
(global-set-key [f12] '(lambda () (interactive) (menu-bar-mode nil) (scroll-bar-mode nil)))

当然,最好从这开始:
(cond ((> emacs-major-version 20)
       (tool-bar-mode -1) ; introduced in emacs 21
       (menu-bar-mode -1)
       (scroll-bar-mode -1)
       (menu-bar-showhide-fringe-menu-customize-disable)
       (blink-cursor-mode -1)
       (windmove-default-keybindings 'meta)))

我将热切期待这个问题的答案,并将其纳入中。

你为什么使用(menu-bar-showhide-fringe-menu-customize-disable)而不是(set-fringe-mode 0) - Rörd
谢谢回复,我问的原因是因为我有将模式行和回显区合并的模糊想法。我已经广泛地定制了模式行,我怀疑我不会很快将其设置为 nil(setq max-mini-window-height 0) 没有效果——可以使用专用的迷你缓冲区(http://www.emacswiki.org/emacs/Dedicated_Minibuffer_Frame),使用 make-frame-invisible 和一个迷你缓冲区钩子可能是我正在寻找的解决方案。 - Iceland_jack

5

您可以将minibuffer分割成自己的框架,然后根据需要隐藏和显示它。

(setq minibuffer-frame-alist (append '((auto-raise . t) (auto-lower . t)) minibuffer-frame-alist))
(setq initial-frame-alist (append '((minibuffer . nil)) initial-frame-alist))

您将失去回显区消息,但我想您已经不在意了。


编辑:上面的内容未经测试,且不完整。这似乎在这里可以工作:

(setq initial-frame-alist (append '((minibuffer . nil)) initial-frame-alist))
(setq default-frame-alist (append '((minibuffer . nil)) default-frame-alist))
(setq minibuffer-auto-raise t)
(setq minibuffer-exit-hook '(lambda () (lower-frame)))

4
您可以使用以下代码来获得一个无迷你缓冲区的框架。
(setq default-minibuffer-frame
      (make-frame
       '((name . "minibuffer")
         (width . 0)
         (height . 0)
         (minibuffer . only)
         (top . 0)
         (left . 0)
         )))
(setq new-frame
      (make-frame
       '((name . "editor")
         (width . 80)
         (height . 30)
         (minibuffer . nil)
         (top . 50)
         (left . 0)
         )))

我从这里获取并修改了相关技术内容。

尽管它可以创建无迷你缓冲区的框架,但似乎不可能摆脱迷你缓冲区,并使其仅在需要时出现,就像您所描述的Google Chrome状态栏示例一样。


1
我授予您赏金,因为截止日期即将到来,但是您的解决方案仅描述了一个专用的minibuffer框架,所以我需要自己解决这个问题。 - Iceland_jack
谢谢,我也同样感兴趣让迷你缓冲区的行为与您在问题描述中所述的方式相同。这将有助于节省我使用的净书中的一些空间。 - vpit3833
@Iceland_jack,你找到解决方案了吗? - guilhermemtr

3
从技术上讲,隐藏回声区域是不可能的。然而,我有一个想法,可以在假设您在全屏环境中使用Emacs的情况下,提供相同的外观效果。在这种情况下,工具可以调整emacs窗口(在emacs术语中称为“frame”),使其填充显示器或扩展到显示器底部,具体取决于是否应该显示回声区域。
不幸的是,我自己没有时间来实现这一点,所以我把它留给其他人来完成,并声明赏金。
第一个挑战是找到一个好的位置进行调整大小,其中一个位置可以是“post-command-hook”。其他位置可能是“minibuffer-setup-hook”和“minibuffer-setup-hook”。第二个挑战是决定是否应该显示回声区域,我认为您可以使用“current-message”来检查是否正在显示消息。

1
据我所知,无法隐藏回显区,而且我不同意你说它经常没有用。从缓冲区切换到M-x命令再到minibuffer输出,回显区承载了许多不同的功能。
我可以理解,在小屏幕上,例如在netbook等设备上,节省屏幕空间是可取的。但我认为,当您编辑文件时,回显区比Web浏览器的地址栏更常用。它是Emacs的一个组成部分。

我从未提到过浏览器的地址栏,尽管有人可能会认为Pentadactyl的命令行与Emacs的回显区域一样常用。尽管如此,我对将回显区域的非交互式功能集成到{模式、头}\行(或反之亦然)有一些想法。该死,我不会争论为什么——对我来说,Emacs的座右铭是为什么不 - Iceland_jack
1
在宽屏设置上,超过50-80个字符后,回显区基本上是屏幕空间的浪费。我在工作中可以容纳大约320个字符宽度,所以,在我的工作流程中它并没有被广泛使用。 - Paul Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接