暂时没思路怎么处理,先搁置吧
我突然发现,你应该设置face: vertico-posframe-border 来改变border的颜色
看到readme的vertico-posframe-parameters
就一直在尝试添加一些参数,都忘了M-x customize-face
找一找face。
ivy-posframe和vertico-posframe都通过这个方法设置好了,谢谢大佬!
新发现了一个问题,就是在左侧window激活posframe并输入内容时posframe会立即跑回右侧window那里——白天测试时没输入内容,所以没发现这个问题:
而ivy-posframe则表现就好,同情况下输入内容时posframe是左移使其右缘与emacs右缘重合:
题外话:同样是输入input,ivy搜出不少结果而vertico和selectrum却一个都没,这是什么情况呢?
我这边 vertico-posframe 没有发现这个问题, 不过我试着修复了一下,也许有用。
已经没有这个问题了,谢谢大佬!
@tumashu 大佬,打扰了!我想实现 “当posframe从下往上展开时,即当高亮行下方空间不够时posframe会上移至高亮行上方,M-x prompt 和 vertico candidates结果反过来排列”。
第一步是“posframe从下往上展开”,请问 “当posframe从下往上展开时” 这个判断语句该怎么写呢?posframe里有没有独立的一个函数是表示“从下往上展开”的?(注:posframe是posframe-poshandler-point-window-center
)
第二步是“结果反过来排列”,解决办法是vertico-reverse-mode
或:
自己仿照已经有的 poshandler 写一个 poshandler 函数吧,这也是 poshandler 机制实现的初衷。
你把获取的座标的 y 值,减去 posframe 的高度,不就实现了吗?
这个很好判断, poshandler返回的座标是 posframe 的左上角的座标,你用它的 y 值,和 (posn-x-y (posn-at-point)) 获得的 y 比较大小,不就知道菜单是上弹还是下弹了吗? 不过你如果 elisp 不太熟悉,就不建议折腾了。
直接试了vertico-reverse-mode
,发现跟vertico-posframe同用时并不起效,只是把C-n和C-p调过来,candidates展示不变。不折腾了,谢谢大佬提示!
在 gccemacs 29 没有,但是 Emacsmacport(emacs 27) 有这个问题。按照你们的讨论,我这里的问题也差不多解决了。
不是,只是定义成face, 方便theme添加支持
翻了一下 posframe.el 发现了这个利器,可玩性飙升 膜拜大佬!
现在用户可以根据上述例子的规则自定义 poshandler 了吗?但是发现后面 defalias 了很多 poshandler,这是所有弹窗方式都包含了?
自己写了一下p0p0-to-p0p0,发现有定义好的posframe-poshandler-point-top-left-corner
,立马用上。现在离 “实现弹窗样式与compang-mode保持一致” 这一目标又近了一步,啊哈哈哈。
顺便再请教一下:posframe的 width 可以根据 candidate 长短而自动变化吗?像company-mode那样自动变宽度。(不好意思,近日问了很多问题,真是麻烦了 )
这种命名方式是这两天刚刚加的,所以alias到老名字用于兼容。
本来就是自动变化的,只不过vertico-posframe设置了最小宽度,所以表现不一样
可以看看 company-posframe 里面的 poshandler 自定义函数,也许对你有启发
我的问题是可以固定宽度不变化吗?因为我在使用的过程中经常感觉到posframe在抖动,就是往下翻一个就宽度骤降(非连续变化),再多翻几个就又陡增回来。
min-width 和 min-height 应该可以解决这个问题
对哦,怎么没想到看看company-posframe呢……
刚刚试了试,:company-margin
应该可以用left-fringe
代替,但不知道找什么参数代替:company-prefix-length
(直接拿company-posframe-show-at-prefix
当poshandler用会提示number-or-marker-p nil
),先注释掉下面的两句,假装成功了,看看实际效果:
(defun company-posframe-show-at-prefix (info)
"Poshandler showing `company-posframe' at `company-prefix'."
(let* ((parent-window (plist-get info :parent-window))
(point (with-current-buffer (window-buffer parent-window)
(max (line-beginning-position)
(- (plist-get info :position)))))
;; (plist-get info :company-prefix-length)
;; (plist-get info :company-margin)))))
(info (plist-put info :position-info (posn-at-point point parent-window))))
(posframe-poshandler-point-bottom-left-corner info)))
对比一下,效果还不错哈哈哈。如果posframe输入行分离出来并贴在光标后面,M-x
这些minibuffer-prompt隐藏掉,那么效果就跟company-mode是一模一样的了。“posframe输入行分离出来并贴在光标后面”这个应该可以做到,“M-x
这些minibuffer-prompt隐藏掉”这个好像就不能隐藏了,看到官方文档说minibuffer-prompt不能change……
如果posframe完全像company-mode弹窗那样,感觉逼格很高 其实就相当于把company前端或company-posframe当作minibuffer