比如M-x find-file打开文件, 此时在mini buffer提示输入文件名, 此时如果有一个buffer在外部被修改, 被revert, 则会打印一条revert信息, 然后输入文件的提示就没了, 这个太不方便了.
revert的信息好像可以设置让它隐藏, 但是同类的其他提示信息如何处理? 最好是有个定时器或者什么机制, 可以等普通信息输出完之后, 回到最开始的输入文件提示.
比如M-x find-file打开文件, 此时在mini buffer提示输入文件名, 此时如果有一个buffer在外部被修改, 被revert, 则会打印一条revert信息, 然后输入文件的提示就没了, 这个太不方便了.
revert的信息好像可以设置让它隐藏, 但是同类的其他提示信息如何处理? 最好是有个定时器或者什么机制, 可以等普通信息输出完之后, 回到最开始的输入文件提示.
有个想法,让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:
有点复杂, 这种基本功能最好是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。
看了几个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 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,他们提到的这个变量看上去就是控制这个的,不过没有生效