前一段时间模仿 ivy-posframe, 做的一个小工具,应该不会再添加新功能了,有需要的可以拿去
太棒了!(紫薯布丁)
是不是可以期待一波selectrum-posframe
我这边应该不会了,vertico目前够我用了
@tumashu 大佬,可以请教一下写ivy-posframe或vertico-posframe需要用到相应的补全框架的哪些值吗?好像这两者需要改动的地方并不多,我看看能不能山寨一个selectrum-posframe 之前根据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中显示,如果可以,那可能就比较简单
vertico跟ivy比起来怎么样
很小,功能很少,但代码也少,看不同人的使用习惯吧
我看了一下selectrum的代码,感觉需要重写selectrum–update, 不了解selectrum的代码的话,估计搞不了
已经用上了!
我发现,我在 emacs 29 用没有这个问题,但是在 emacs 27 有这个问题。
我的用的是28 ……
我不知道 Emacs 28 可不可以,我用的是 Emacs 29
你要确定poshandler运行的时候,激活光标到底在哪,估计在minibuffer吧?
还真是 请问该怎么办呢?
我刚用brew install emacs-plus@29
安装了29,还是不行。请问你是怎样配置的啊?能否参考一下vertico-posframe的配置?
我试着修复了一下,但不知道有没有其它副作用
帅气帅气,就是这效果 谢谢大佬!
我用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数也不同。(得寸进尺了 )
问题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: