vertico-posframe, 喜欢的同学拿去

暂时没思路怎么处理,先搁置吧

我突然发现,你应该设置face: vertico-posframe-border 来改变border的颜色

看到readme的vertico-posframe-parameters就一直在尝试添加一些参数,都忘了M-x customize-face找一找face。:joy:

ivy-posframe和vertico-posframe都通过这个方法设置好了,谢谢大佬!

新发现了一个问题,就是在左侧window激活posframe并输入内容时posframe会立即跑回右侧window那里——白天测试时没输入内容,所以没发现这个问题:

而ivy-posframe则表现就好,同情况下输入内容时posframe是左移使其右缘与emacs右缘重合:

题外话:同样是输入input,ivy搜出不少结果而vertico和selectrum却一个都没,这是什么情况呢?:thinking:

我这边 vertico-posframe 没有发现这个问题, 不过我试着修复了一下,也许有用。

已经没有这个问题了,谢谢大佬! :pray:

@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) 有这个问题。按照你们的讨论,我这里的问题也差不多解决了。

大佬,定义vertico-posframe-border face是因为这个原因吗?

不是,只是定义成face, 方便theme添加支持

翻了一下 posframe.el 发现了这个利器,可玩性飙升 :scream_cat:膜拜大佬!

现在用户可以根据上述例子的规则自定义 poshandler 了吗?但是发现后面 defalias 了很多 poshandler,这是所有弹窗方式都包含了?

自己写了一下p0p0-to-p0p0,发现有定义好的posframe-poshandler-point-top-left-corner,立马用上。现在离 “实现弹窗样式与compang-mode保持一致” 这一目标又近了一步,啊哈哈哈。

顺便再请教一下:posframe的 width 可以根据 candidate 长短而自动变化吗?像company-mode那样自动变宽度。(不好意思,近日问了很多问题,真是麻烦了 :pray:

这种命名方式是这两天刚刚加的,所以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弹窗那样,感觉逼格很高 :rofl: 其实就相当于把company前端或company-posframe当作minibuffer :thinking: