创建一个不带 Minibuffer 的 f1
,然后创建一个只有 Minibuffer 的 Child Frame f2
,最后让 f1
使用 f2
的 Minibuffer:
(let* ((f1 (make-frame '((minibuffer . nil))))
(f2 (make-frame `((parent-frame . ,f1)
(minibuffer . only)))))
(setf (frame-parameter f1 'minibuffer) (frame-selected-window f2)))
然而没什么实用价值,因为这个 Child Frame f2
会一直显示着,即便用 minibuffer-exit
能临时自动隐藏,更本质的冲突是 Emacs 的 Echo Area 会使用 Minibuffer,比如 Eldoc,Child Frame 也不能设置透明度。
2 个赞
minibuffer echo area在最下面显示各种零碎信息还是很必要的。需要childframe的ivy这种魔改。ivy在某种意义上是滥用了minibuffer(虽然很好用
cireu
3
也不算滥用吧, minibuffer除了充当echo area还有接受用户输入的功能, ivy也只是增强了minibuffer本身的功能而已.
目前 Emacs 的 Echo Area 是用 Minibuffer 来显示的,比较讨厌,假如都能分别定制就好了,比如 Echo Area 显示在最下面,Minibuffer 显示别处。
具体需要显示什么呢?一般的单行信息echo area已经足够了。其他需求可以自己新建buffer和childframe显示。
cireu
9
ivy-posframe没法支持async命令是为什么呢? 能解决吗?
cireu
11
对对,要是能让输入的时候用posframe的minibuffer,eldoc的时候还是在底部,就完美了
child-frame 也是 frame, 如果遇到获取输入焦点的问题, child-frame 和 普通的frame 处理起来一样复杂, 为了避开这种糟心的事情, 我在搞 posframe 的时候,就将 posframe 限制为: 只处理显示,不允许处理输入。 ivy-posframe 看起来好像是在 posframe 中输入,其实并不是这样子, 焦点还在minibuffer, posframe只负责将minibuffer里面的内容镜像显示
1 个赞
这样做的优势是: 可靠性增强不少, 劣势是: 鼠标不能用了