如何让mini buffer里提示输入的文字不被普通提示信息覆盖?

比如M-x find-file打开文件, 此时在mini buffer提示输入文件名, 此时如果有一个buffer在外部被修改, 被revert, 则会打印一条revert信息, 然后输入文件的提示就没了, 这个太不方便了.

revert的信息好像可以设置让它隐藏, 但是同类的其他提示信息如何处理? 最好是有个定时器或者什么机制, 可以等普通信息输出完之后, 回到最开始的输入文件提示.

提交了个bug: #34614 - 26.1.92; When reading input in mini-buffer, message to each area overide the input prompt - GNU bug report logs

有个想法,让minibuffer启用的时候从额外的区域弹出信息。比如利用package lv(包含于hydra中)

(require 'lv)
(add-hook 'minibuffer-setup-hook (lambda ()
                                   (advice-add #'message :override #'lv-message)))
(add-hook 'minibuffer-exit-hook (lambda ()
                                  (advice-remove #'message #'lv-message)))

效果如图。

Known Issues:

  1. lv这个包的设计不太好。所有lv都是共用在一个buffer里。(该部分代码写死)而且一次只能弹出一个。同时hydra,transient什么的也在用。导致了效果不稳定,使用时hydra这些可能会被message打断

有点复杂, 这种基本功能最好是emacs本身能处理

Emacs里minibuffer和echo area是一个东西。要改只能魔改源码。


另一方面,Emacs很多所谓「自带」功能,就是Elisp做的,区别就是官不官方而已

试试提交一个 Bug。

Minibuffer 期间用一个包含 message 的命令时,Emacs 会有个 Timeout 自动隐藏提示信息,比如

;; 下面命令假设 enable-recursive-minibuffers 为 t
M-x M-x emacs-version
;; 打印 Emacs 版本信息大概 2 秒,然后恢复第一个 M-x

只是如果不是单独的命令的 message 就不行了,比如:

(progn
  (run-at-time 1 nil #'message "Confliction between echo area and minibuffer")
  (call-interactively #'find-file))

我也时不时遇到这个问题,我的 Work-around 是随便按一个不碍事的键,比如 C-e

1 个赞

看了几个Stack Overflow上的相关帖子, 貌似没有好的办法.

官方的主要是兼容性好点, 第三方插件设计的时候会主动兼容它, 省得自己以后遇到兼容性问题去折腾.

我希望的体验是, 普通消息显示完, 然后1秒左右之后恢复原有的提示, 这样不影响看普通的提示消息,这些消息还是希望看到的, 而且看得时候会本能暂停输入, 等看完后1秒反应过来, 然后继续输入.

你说的Timeout效果正是我想要的. 我用的smex没这个效果.

C-e在大部分情况下很安全, 不过在smex里试了一下, 会进入[Edit]状态.

为了安全, 一般都是C-g, 然后重新运行, 有点麻烦.

不了解 Smex,我说的是 Emacs 行为,更 Smex 没关。一个重现的例子:

$ emacs -Q --eval '(setq enable-recursive-minibuffers t)'

然后 C-x C-f M-x emacs-version

这个方法用smex也可以了, 好像是emacs内部对于recursive minibuffer的处理机制, 里面一层结束了之后, 回到外层, 会及时清理现有内容, 恢复到外层的状态.

嗯,所有命令都如此,包括 Smex。

提交了个bug: #34614 - 26.1.92; When reading input in mini-buffer, message to each area overide the input prompt - GNU bug report logs

1 个赞

你的 Bug Report 看起来跟这个主题没有关系,而且你的 Bug Report 不太清楚,对于 Feature Request,介绍清楚你的需求(你要干嘛)就 OK 了,不是要开发者干嘛干嘛,如果你非常清楚怎么解决,为何不自己动手。

搞错bug了, 从旧的邮件里复制了一个.

现在更新了.

表达能力太差了, 用英文更是不行. 刚才那个, 改成"Can you provide a xxx-hook?" 是不是好点?

其实我也有个类似的问题,但和楼主不知道是不是同一个。

是在windows上,比方说:

你在一个文件里swiper一下,然后用鼠标点击文本里面拷贝一块文本(这种情况很正常,因为swiper的时候还没想好要搜索什么),然后在用鼠标点击swiper的那个区域(想把焦点再次回到swiper上),但是不行,swiper窗口会被关闭。。。只能先取消swiper,重新来一次。

我这边测试可以.

swiper运行之后, 鼠标在其他窗口(非swiper所在窗口)buffer里选择并拷贝文本, 然后再点击swiper的窗口粘贴, 正常, 可以粘贴, 继续搜索

这个bug不知道现在什么状态,看他们讨论了一阵,也没有结果。

minibuffer-message-timeout,他们提到的这个变量看上去就是控制这个的,不过没有生效