vertico-posframe, 喜欢的同学拿去

我不知道 Emacs 28 可不可以,我用的是 Emacs 29

你要确定poshandler运行的时候,激活光标到底在哪,估计在minibuffer吧?

还真是 :sweat_smile: 请问该怎么办呢?

我刚用brew install emacs-plus@29安装了29,还是不行。请问你是怎样配置的啊?能否参考一下vertico-posframe的配置?

我试着修复了一下,但不知道有没有其它副作用

帅气帅气,就是这效果 :+1: :+1: :+1:谢谢大佬! :pray:

我用vertico-posframe试了试(setq vertico-posframe-poshandler 'posframe-poshandler-point-window-center),很帅:

但是在C-x 3多一个窗口之后出现了3个问题:

问题1、posframe长宽固定不可变且超出emacs边缘(下图1),如果是fullscreen下,则看不到超出的部分窗体。当输入内容时,超出的部分才会跳回到emacs里(下图2)。只有一个窗口时posframe长宽可变,表现很好(下图3、4)。

诉求:如果在多窗口情况下也能自动改变posframe长宽适应window大小就完美了。或者多提供一个posframe-poshandler-point-frame-center函数(位置是在point的下一行居整个emacs的中间;大小自动适配整个emacs的长宽,而不是window的长宽),适配更多的使用场景,毕竟不同电脑屏幕大小不同,多开的window数也不同。(得寸进尺了 :rofl:

问题2:第一次激活posframe时,位置正确,但是移动emacs后,位置还是原来的位置,如图:(与上图比较)(注:移动emacs后随意输入点东西以移动一下光标,可以解决该问题)

问题3:C-x 3 C-x o光标移动到新开的window后,vertivo-posframe没跟上,还停留在左边原window那里,如图:

我想要ivy-posframe测试一下有没有类似的情况,但是ivy-posframe没有ivy-posframe-display-at-point-window-center,只能用ivy-posframe-display-at-window-center代替。发现ivy-posframe会出现问题1(是不是根据window来计算posframe大小都会出现这个问题?)和问题2(注:移动emacs后随意输入点东西以移动一下光标,不可以解决该问题),没有出现问题3,如图:

最后再用selectrum配合miniframe(setup显示内容的窗口)和posframe(提供位置信息)来试试

配置:

(setq mini-frame-show-parameters
	  (lambda ()
        (let* ((info (posframe-poshandler-argbuilder mini-frame-frame))
		       (posn (posframe-poshandler-point-window-center info)))
          `((left . ,(car posn))
		    (top . , (cdr posn))
		   ))))

单个window时表现不错(如下图2),但是会出现问题2((注:移动emacs后随意输入点东西以移动一下光标,可以解决该问题)。问题1没测试,因为selectrum是用mini-frame来显示内容的,与posframe无关。

C-x 3之后会报错:let*: Wrong type argument: stringp, nil意思是某个参数没传过去?toggle-debug-on-error后的错误提示如下图1:

这个暂时处理不了,因为我不知道在 vertico 下如何获取minibuffer激活之前激活的window,

大佬,这个 New function. 是解决什么问题的?是新的计算位置的函数吗?更新后还是会遇到上述问题呢。

这个问题挺想解决的。没有这个问题就:selectrum + mini-frame + posframe = selectrum-posframe了。

哈哈,我没做什么特别的配置。

我使用的是用 Nix 上 emacs-overlay 安装的 gccemacs,当然也是 macOS。

我的配置地址:https://github.com/ixnij/dotfiles

啊,竟然激活mode就能顺利使用了 :+1:请问有遇到过我上述的问题123吗? 尝试一下这样配置看看: (setq vertico-posframe-poshandler 'posframe-poshandler-point-window-center) 意思是,在高亮行的下一行居window中间弹出。

解决这个问题的,用这个 poshandler 之后,弹出的 posframe 会放到 frame 中间,而不是 window 中间。

从报错信息看不出什么原因,你如果能定位到哪行代码报错,估计就好解决了。

这个问题应该暂时解决了

试试最新版的 posframe 吧,也许解决了

感谢大佬! :pray:测试完了,我的环境:macos big sur 11.5.1 emacs-plus 29.0.5

在fullscreen和maximized下,表现很好。一个字,帅。就是我心念念的“在高亮行的下一行居window中间弹出” :grin:

还发现个小问题,在非fullscreen和非maximized下,posframe找不准最左侧第一个window的位置(下图一,与上图比较),在其他新开(C-x 2... C-x 3...)的window时位置就很准确(下图二)。

posframe-poshandler-p0.5p0-to-f0.5p1 试试这个 poshandler, 这个 poshandler 就是居中到 frame 的

这个 poshandler运行很好,没出现上述这个小问题,位置找得很准。很帅 :+1:为了和posframe-poshandler-point-window-center命名一致,建议将posframe-poshandler-p0.5p0-to-f0.5p1 更名为posframe-poshandler-point-frame-center

我其实觉得 posframe-poshandler-point-window-center 不是一个好名字,只是由于兼容性问题,我无法更改了, 心得命名规则虽然看起来有点乱,但是很有规律。

至此,selectrum-posframe = selectrum + mini-frame + posframe 的方案就基本定型了。

只是有个小瑕疵,当弹窗方式为 posframe-poshandler-point-window-centerposframe-poshandler-p0.5p0-to-f0.5p1时,启动emacs后首次激活posframe,在水平方向上找不到位置,会在emacs的中点垂线上弹出,第二次之后激活posframe就能找准方向了。