解决方案:
- 用
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来看全部的情况无法使用。
哦,是个法子,谢谢。我去看看能不能单独改vertico-posframe的透明度。感觉我这个微微透明度继承自default-frame-alist
设置的alpha
。
更新:
无论在在整体UI的frame-alist里设置,还是在vertico-posframe-parameters
里添加alpha
,无论是(alpha . 50)
,还是(alpaha . (100 . 50))
,都只能实现文字和背景一起变透明,这样文字就看不清了。alpah-background
字样是不生效的。
问题:
设置透明度是个解决路子,但现在的问题是:可不可以让前景是无透明(文字这类),背景透明?
请参考这个帖子,尤其是这一楼:
打上这个 patch 后,alpah-background
就生效了,就能实现仅背景透明,文字不受影响。
1 个赞
sona
6
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,那它就是下一步应该最先看到和处理的。我去试试,谢谢!
哦哦,原来如此,感谢搬运和解释哇!!那这个解决思路我再等等Emacs下一个更新吧
您的代码我使用没有成功,在(funcall orig-fun)
返回是空的
Error running timer: (void-variable orig-result)
请问您有github上传的emacs配置文件么?我看看参考下哇?谢谢!
(我刚用上vertico+consult+embark,还相当不熟悉它)
sona
12
应该是词法绑定的问题
在配置文件第一行写入
;; -*- lexical-binding: t; -*-
1 个赞
哦对对对,确实有可能,我去试下,谢谢!!
可以了!确实就是lexical binding的问题,我之前的配置都没启用它。
我的方法是用which-key
& which-key-posframe
显示embark buffer。embark的wiki里有介绍。直接显示buffer内容有点太长了。
2 个赞
哈,我vertico家族的配置抄的就是你的 :D,然后看到embark的which-key这块没明白干啥(几天前还没加which-key,今天刚加上它)就给这段删了
这也是个好办法,感谢感谢!
另外一个办法就是,让 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
上下把它们错开排列了。