vertico-posframe, 喜欢的同学拿去

这个我用 linux 感觉也没有这个问题,是不是 mac 上才有的?

mac和windows都有这个问题,Linux是不是速度快无感知?理论上第一次计算位置和显示的时候确实是在左上角,对吧?可以问问其他小伙伴是否观察到同样的情况。

方便的话录个视频看看

可以设定 width 和 height 了,谢谢二呆大佬 :+1:

但还是搞不定长宽随candidates变化的问题 :sob:我参考vertico-posframe的posframe-size,设置了posframe给selectrum,但是总不能随candidates变化长宽,都是以min-width和min-height为准。mini-frame是可以随candidates变化长宽的,应该selectrum的candidates没问题。company-posframe也参考了,因为company-mode设置了很多min-tooltip˙之类的变量,感觉设置起来比较简单一些。

大佬有空可以帮我看看吗? :pray:

selectrum代码:selectrum/selectrum.el at master · radian-software/selectrum · GitHub

selectrum调用posframe代码:Additional Configuration · radian-software/selectrum Wiki · GitHub

我自己瞎写的(高亮行以上代码):如果 selectrum-posframe-height 为 10, selectrum-posframe-min-height 为5,selectrum candidates 为2,那实际posframe的高就是5,不能根据candidates来变。不知道怎样写min max。

你把 :height :width :min-height :min-width 都删除,宽度就根据内容决定了。

不设置 :width 和 :height 之后, posframe 的尺寸基本上是通过 fit-frame-to-buffer 来决定的,你可以看看它的docstring,大概就知道怎么处理了

对了,你好升级到最新的 posframe, 旧版本的 width 和 height,处理不太符合直觉

嗯嗯,selectrum mini-frame posframe都删掉,重新下载最新版的。设置 :width 和 :height 也都能起效了。

把 :height :width :min-height :min-width 都删除后,每次激活posframe,长宽都不一样,不能根据candidate而定:

看了官方文档和seletrum代码,seletrum写了(fit-frame-to-buffer 'vertically),我把'vertically改为 t ,没啥作用。

seletrum说明给selectrum-display-action设置弹窗之后,内容应该都交给新的窗口来显示。 selectrum-display-action的代码块里生成了一个selectrum–display-action-buffer,不知道是不是因为posframe找不到这个buffer才会导致上图问题。fit-frame-to-buffer的时候fit不到selectrum–display-action-buffer? :rofl:

有可能是 posframe 弹出之后, 菜单的内容才更新了,所以 posframe 无法调整尺寸,你可以试试 refresh 参数,比如 :refresh 0.1 ,也许有用

类似

(defvar buf " *test*")
(posframe-show buf :refresh 0.25)

(with-current-buffer buf
  (erase-buffer)
  (insert "fffffggg"))

记得下载最新的 posframe, 我刚刚fix一个bug。

管用!应该就是因为“posframe 弹出之后, 菜单的内容才更新”。终于搞定了,谢谢二呆大佬! :pray: :pray: :pray:

我刚用ffmpeg录了一个,不知道为什么录制的视频里看不出 “使用了posframe-delete后,每次激活posframe,posframe先在左上角生成,再对齐到point处” 的一闪而过。看看 @seagle0128 大佬方不方便录一个 :grin:

(when (posframe-workable-p)
  (posframe-show " *my-posframe-buffer*"
                 :string "This is a test"
                 :position (point)))

(posframe-hide " *my-posframe-buffer*")

(posframe-delete " *my-posframe-buffer*")

感觉child-frame应该就是先在某个位置生成再对齐到新位置,而不是在新位置直接生成,至少在macos下如此。mini-frame也会看到这个对齐过程:我给mini-frame用了光标poshandler,mini-frame先在上次光标的位置生成,再闪到现光标处。

录屏看不到闪烁效果的,用手机试试?

:sweat_smile:忘了有手机录视频这种事……可以看得到了。 @tumashu 大佬请移步:

链接:百度网盘-链接不存在 提取码:2Q6s

对的,不过正常情况下,新建的frame是隐藏的,等对齐以后,才让它显示,mac 的child-frame实现可能存在问题.

图片

我试着用比较 hack 的方式,降低闪烁面积的大小,你可以试试有没有效果

闪烁看不到了,谢谢大佬 :+1:

不过刚启动emacs会出现一个小框(下图一左上角),首次激活posframe就可以去掉。另外,遮挡器跑到首行去了(下图二),输入的时候 count和prompt依旧会频闪。

这个已经设置为自动隐藏了。

下面两个例子,哪个在 minibuffer ?

(posframe-show " test1"
               :position (cons 0 -1)
               :string "This is test1"
               :border-color "red"
               :border-width 2
               :timeout 1)

(posframe-show " test2"
               :position (cons 0 (- (frame-pixel-height)
                                    (default-font-height)))
               :string "This is test2"
               :border-color "green"
               :border-width 1
               :timeout 1)

test2 在minibuffer里。输入的时候 count和prompt的频闪也不见了。 :+1:

遮挡器还露出一点光标的上缘,能不能设置为和行高(frame-char-height?)一样高呢?可能有的人会设置minibuffer的字体高度。

删掉input的内容,出现 read-only的时候,会出现这样的情况: