25

echo 区域是 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。

4

5 回答 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)))

我将热切地等待这个问题的答案并将其纳入luddite-mode

于 2011-02-22T20:27:48.490 回答
5

您可以做的一件事是将迷你缓冲区拆分为自己的框架,然后根据需要隐藏和显示它。

(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)))
于 2011-03-05T10:25:30.910 回答
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)
         )))

我在 SO 上从这里获取和修改。

尽管它可以创建无 minibuffer 的帧,但似乎不可能摆脱 minibuffer 并使其仅在需要时出现,正如您在 Google Chrome 的状态栏示例中所描述的那样。

于 2011-03-03T00:31:24.493 回答
3

从技术上讲,隐藏回声区域是不可能的。但是,假设您在全屏环境中使用 Emacs,我的想法可能会给出相同的外观。在这种情况下,一个工具可以调整 emacs 窗口(emacs-speak 中的“框架”)的大小,以便它可以填充显示屏或超出显示屏底部,具体取决于回声区域是否可见。

不幸的是,我自己没有时间来实现这一点,所以我把它留给其他人来做这件事并索取赏金。

第一个挑战是找到一个调整大小的好地方,一个这样的地方可能是post-command-hook. 其他地方可能是minibuffer-setup-hookminibuffer-setup-hook第二个挑战是确定回声区域是否应该可见,我认为您可以使用它current-message来检查是否正在显示消息。

于 2011-03-05T08:45:22.200 回答
1

据我所知,隐藏回声区域是不可能的,而且我不同意你的观点,即它很多时间都没有使用。从 Mx 命令的缓冲区切换到 minibuffer 输出,回显区域发生了许多不同的事情。

我可以理解,在小型显示器上,例如上网本等,希望节省屏幕空间。但我认为,当您编辑文件时,回显区域的使用比您查看网页时使用的 Web 浏览器的地址栏要多得多。它是 Emacs 不可或缺的一部分。

于 2011-02-22T20:25:44.060 回答