vertico-posframe, 喜欢的同学拿去

前一段时间模仿 ivy-posframe, 做的一个小工具,应该不会再添加新功能了,有需要的可以拿去 :rofl:

14 个赞

太棒了!(紫薯布丁)

1 个赞

是不是可以期待一波selectrum-posframe :grinning:

我这边应该不会了,vertico目前够我用了

@tumashu 大佬,可以请教一下写ivy-posframe或vertico-posframe需要用到相应的补全框架的哪些值吗?好像这两者需要改动的地方并不多,我看看能不能山寨一个selectrum-posframe :rofl: 之前根据selectrum wiki用mini-frame和posframe一起实现类似ivy-posframe的弹出效果在emacs打开(C-x 3)两个以上的windows时失效了,窗口不能显示。

需要改动的主要是一下这一段吗?

(defun selectrum-posframe--setup ()
  "Setup minibuffer overlay, which pushes the minibuffer content down."
  (add-hook 'window-selection-change-functions 'selectrum-posframe--select nil 'local)
  (add-hook 'minibuffer-exit-hook 'selectrum-posframe--hide nil 'local)
  (setq-local cursor-type '(bar . 0))
  (setq selectrum-posframe--overlay (make-overlay (point-max) (point-max) nil t t))
  (overlay-put selectrum-posframe--overlay 'window (selected-window))
  (overlay-put selectrum-posframe--overlay 'priority 1000)
  (overlay-put selectrum-posframe--overlay 'before-string "\n"))

你要找找看slectrum能不能在buffer中显示,如果可以,那可能就比较简单

1 个赞

vertico跟ivy比起来怎么样

很小,功能很少,但代码也少,看不同人的使用习惯吧

我看了一下selectrum的代码,感觉需要重写selectrum–update, 不了解selectrum的代码的话,估计搞不了

已经用上了!

非程序员,搞不了搞不了 :rofl:谢谢 @tumashu 大佬!

大佬,这个vertico-posframe不能像ivy-posframe那样自定义poshandler吗?

我setq为随光标弹出,但是窗口会在左下角弹出:

我发现,我在 emacs 29 用没有这个问题,但是在 emacs 27 有这个问题。

我的用的是28 ……

我不知道 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: