试试把 Child Frame 用作 Minibuffer

创建一个不带 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(虽然很好用

也不算滥用吧, minibuffer除了充当echo area还有接受用户输入的功能, ivy也只是增强了minibuffer本身的功能而已.

嗯,这么说也可以

目前 Emacs 的 Echo Area 是用 Minibuffer 来显示的,比较讨厌,假如都能分别定制就好了,比如 Echo Area 显示在最下面,Minibuffer 显示别处。

具体需要显示什么呢?一般的单行信息echo area已经足够了。其他需求可以自己新建buffer和childframe显示。

给大家一个小工具,也许有人喜欢

1 个赞

ivy-posframe没法支持async命令是为什么呢? 能解决吗?

async?

Like counsel-rg counsel-locate

doom-emacs also disable ivy-posframe in these command

https://github.com/hlissner/doom-emacs/blob/develop/modules/completion/ivy/config.el#L207

问题再描述的仔细一点

对对,要是能让输入的时候用posframe的minibuffer,eldoc的时候还是在底部,就完美了

child-frame 也是 frame, 如果遇到获取输入焦点的问题, child-frame 和 普通的frame 处理起来一样复杂, 为了避开这种糟心的事情, 我在搞 posframe 的时候,就将 posframe 限制为: 只处理显示,不允许处理输入。 ivy-posframe 看起来好像是在 posframe 中输入,其实并不是这样子, 焦点还在minibuffer, posframe只负责将minibuffer里面的内容镜像显示

1 个赞

这样做的优势是: 可靠性增强不少, 劣势是: 鼠标不能用了