在不活动期间隐藏 Emacs 回声区域

Posted

技术标签:

【中文标题】在不活动期间隐藏 Emacs 回声区域【英文标题】:Hide Emacs echo area during inactivity 【发布时间】:2011-07-02 01:21:24 【问题描述】:

回声区是 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。

【问题讨论】:

【参考方案1】:

这不是你所问的答案,它不会给你迷你缓冲区,但它会回收一些屏幕空间

(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

【讨论】:

你为什么用(menu-bar-showhide-fringe-menu-customize-disable)而不是(set-fringe-mode 0) 感谢您的回复,我之所以问是因为我对将模式线和回声区域合并在一起的想法很模糊。我已经广泛定制了模式线,我怀疑我是否会很快将其设置为nil(setq max-mini-window-height 0) 没有效果——可以有一个专用的 minibuffer (emacswiki.org/emacs/Dedicated_Minibuffer_Frame),将它与make-frame-invisible 一起使用,minibuffer hook 可能是我正在寻找的解决方案.. 【参考方案2】:

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

(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)))

【讨论】:

【参考方案3】:

您可以使用此代码获得一个无迷你缓冲区的帧

(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 上从 here 获取和修改。

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

【讨论】:

由于截止日期快到了,我给了你赏金,但你的解决方案只描述了一个专用的 minibuffer 帧,所以我需要自己解决这个问题。 谢谢,我同样有兴趣让 minibuffer 按照您在问题中描述的方式运行。在我使用的上网本中回收一些空间会很好。 @Iceland_jack,你找到解决方案了吗?【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

据我所知,隐藏echo area 是不可能的,而且我不同意你的观点,即它已被大量使用。从 M-x 命令的缓冲区切换到 minibuffer 输出,回显区域中发生了许多不同的事情。

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

【讨论】:

我从未提及浏览器的地址栏,尽管有人可能会争辩说 Pentadactyl 的命令行与 Emacs 的回显区域一样多。尽管如此,我对将回声区域的非交互式功能集成到 mode,header\ 行(反之亦然)有一些想法。见鬼,我不会争论 why — 对我来说,Emacs 的座右铭是 why not 好吧,在宽屏设置中,在前 50-80 个字符之后,回显区域几乎是对屏幕状态的浪费。我可以在工作中容纳大约 320 个字符宽,所以,嗯,是的,它在我的工作流程中用得不多。

以上是关于在不活动期间隐藏 Emacs 回声区域的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用级联查询的回声

如何用ps给图片打上细密均匀的线条

WebRTC回声消除

回声消除技术

在回声中回声 <?php ?> [重复]

WebRTC回声消除