对于Vertico-posframe遮挡embark的弹出buffer大家有什么解决或规避办法不?

解决方案

  • posframe显示embark-act的弹窗,见5楼
  • which-key + posframe 显示embark-act的弹窗,可以更简洁显示内容,见13楼

感谢大家的热心帮助!完美解决收工~~


更新2

目前解决思路两个

  • 利用修改posframe的透明度达成 @Chingyat ;bug:目前macos得再等等Emacs支持只透明背景,见 @Deeson 的解释。
  • embark的弹窗也用posframe浮动显示,见 @sona 给出的代码。

感谢大家的热心帮助哇!新年快乐~


更新1

@Chingyat 指点,设置透明度是个解决路子,但现在的问题是:可不可以让前景是无透明(文字这类),背景透明?

说明

无论在在整体UI的frame-alist里设置,还是在vertico-posframe-parameters里添加alpha,无论是(alpha . 50),还是(alpaha . (100 . 50)),都只能实现文字和背景一起变透明,这样文字就看不清了。alpah-background字样是不生效的。


问题

如题,在启用vertico/consult的vertico-posframe下,在vertico补全中(如find-file),呼出embark-act所弹出的buffer会被posframe遮挡。请教下大家有什么奇技淫巧可以处理不?谢谢哇

顺祝新年快乐!!

小屏下让embark临时buffer弹到上半区?(可能是个办法,请教怎么处理方便哇)

大屏下默认也不大行,embark这个菜单(相比于ivy)确实选项蛮多。 目前大屏下的规避手段:似乎可以限制这个涨太宽但没额外信息的posframe?不了解该从哪个参数下刀,可能得读源码,不过这样有可能会让本来很宽、想放大window来看全部的情况无法使用。

把posframe改成透明的

2 个赞

哦,是个法子,谢谢。我去看看能不能单独改vertico-posframe的透明度。感觉我这个微微透明度继承自default-frame-alist设置的alpha


更新

无论在在整体UI的frame-alist里设置,还是在vertico-posframe-parameters里添加alpha,无论是(alpha . 50),还是(alpaha . (100 . 50)),都只能实现文字和背景一起变透明,这样文字就看不清了。alpah-background字样是不生效的。

问题

设置透明度是个解决路子,但现在的问题是:可不可以让前景是无透明(文字这类),背景透明?

请参考这个帖子,尤其是这一楼:

打上这个 patch 后,alpah-background 就生效了,就能实现仅背景透明,文字不受影响。

1 个赞

Embark 用浮动窗口显示

(progn ;; Embark 是菜单,理应浮动
    (defun posframe-display-buffer (buffer)
      (let ((default-fgc (face-attribute 'default :foreground))
	    (default-bgc (face-attribute 'default :background))
	    (hl (face-attribute 'highlight :background)))
	(when buffer (posframe-show
		      buffer
		      :position (point)
		      :poshandler 'posframe-poshandler-frame-center
		      :font-height 1.0
		      :font-width 1.0
		      :width 120
		      :height 20
		      :border-width 5
		      :left-fringe 20
		      :right-fringe 20
		      :border-color hl
		      :background-color default-bgc))))
    (defun embark-get-buffer-pos-display (orig-fun)
      (interactive)
      (let* ((orig-result (funcall orig-fun)))
	(lambda (&optional keymap targets prefix)
	  (let ((result (funcall orig-result keymap targets prefix)))
	    (when (and result (windowp result))
	      (posframe-display-buffer (window-buffer result))
	      (delete-window result))))))
    (advice-add #'embark-verbose-indicator :around #'embark-get-buffer-pos-display)
    )
1 个赞

天才,把前面的frame改透明,可以通过重叠窗口进行任意的透明度混成!

哈,感谢,老哥就是让embark也用psoframe浮动了,这样就盖在原有的posframe上方了?逻辑上确实应该这样,既然呼出embark-act,那它就是下一步应该最先看到和处理的。我去试试,谢谢! 32

哦哦,原来如此,感谢搬运和解释哇!!那这个解决思路我再等等Emacs下一个更新吧

您的代码我使用没有成功,在(funcall orig-fun)返回是空的

Error running timer: (void-variable orig-result)

请问您有github上传的emacs配置文件么?我看看参考下哇?谢谢!

(我刚用上vertico+consult+embark,还相当不熟悉它)

应该是词法绑定的问题 在配置文件第一行写入

;; -*- lexical-binding: t; -*-
1 个赞

哦对对对,确实有可能,我去试下,谢谢!!

可以了!确实就是lexical binding的问题,我之前的配置都没启用它。

我的方法是用which-key & which-key-posframe 显示embark buffer。embark的wiki里有介绍。直接显示buffer内容有点太长了。

2 个赞

哈,我vertico家族的配置抄的就是你的 :D,然后看到embark的which-key这块没明白干啥(几天前还没加which-key,今天刚加上它)就给这段删了 15

这也是个好办法,感谢感谢!

另外一个办法就是,让 vertio-posframe 弹出的窗口移动位置,自定义一个下面的函数。

(defcustom vertico-posframe-poshandler #'posframe-poshandler-frame-center
  "The posframe poshandler used by vertico-posframe."
  :type 'function)

可以参考:

1.  `posframe-poshandler-frame-center'
2.  `posframe-poshandler-frame-top-center'
3.  `posframe-poshandler-frame-top-left-corner'
4.  `posframe-poshandler-frame-top-right-corner'
5.  `posframe-poshandler-frame-top-left-or-right-other-corner'
6.  `posframe-poshandler-frame-bottom-center'
7.  `posframe-poshandler-frame-bottom-left-corner'
8.  `posframe-poshandler-frame-bottom-right-corner'
9.  `posframe-poshandler-window-center'
10.  `posframe-poshandler-window-top-center'
11. `posframe-poshandler-window-top-left-corner'
12. `posframe-poshandler-window-top-right-corner'
13. `posframe-poshandler-window-bottom-center'
14. `posframe-poshandler-window-bottom-left-corner'
15. `posframe-poshandler-window-bottom-right-corner'
16. `posframe-poshandler-point-top-left-corner'
17. `posframe-poshandler-point-bottom-left-corner'
18. `posframe-poshandler-point-bottom-left-corner-upward'
19. `posframe-poshandler-point-window-center'
20. `posframe-poshandler-point-frame-center'

1 个赞

谢谢哇!我当时也考虑移一下位置,不过那个embark显示的东西实在是太多了,基本从顶到底都占了。不过有了which-key那个间洁现实方式后,这个变有用了,我也是用这个poshandler上下把它们错开排列了。