怎样美化 posframe

用 posframe 作为 tooltip 显示查词结果效果不错,但是怎样才能进一步美化呢?

比如我想让所查的词“face”显示不一样的颜色,这个应该怎么做呢?我试了 propertize,但是没有效果。

(concat (propertize word 'font-lock-face '(:foreground "#dc752f"))
              (s-trim-right res))

@tumashu 想要一个快速的方法,所以没有深入看 posframe 的源码,抱歉

1 个赞

'font-lock-face -> 'face 'some-face 试试?

进一步美化可以设置一个固定宽度高度防止大小变来变去

加上internal-border作为visual padding

能不能给点例子,你说的我都不太了解。另外比较好奇的是,posframe 和另外的 pos-tip tooltip 等相比有什么优点呢?为什么又造一个轮子?

放几个目前的效果,期待大家给点建议。

改成 (concat (propertize word 'face 'bold) (s-trim-right res)) 试试? 按说posframe不会影响你的fontification

posframe用的是child-frame,是一个独立的frame,所以不会干扰原来frame里的内容 其他那些都是临时替换一下buffer里的内容来假扮出一个popup window的感觉 所以如果你原来buffer里有个图片或者是非等宽字体,其他那些popup的显示就会受到影响

关于internal-border 参照manual里关于frame parameter的说明吧

修改parameter可以用这个

2 个赞

bold 也没有用

image

你是不是在posframe调用的时候,设置了背景颜色和前景颜色了?

posframe速度比postip快多了,另外postip已经无人维护,并且进不了elpa

1 个赞

他用的是我写的 sdcv.el , sdcv.el 调用 posframe 的时候设置了前景和背景颜色。

正确的方法应该是不用设置前景色,然后 sdcv 输出的 string 内容在传递给 posframe 之前用 regexp 和 propertize 设置一下标题、内容以及音标的颜色。

美化的进一步建议:可以增加 padding 参数,这样可以让 posframe 里面的文字不用顶满四周的边框, 距离产生美

1 个赞

比 emacs 自带的 x-show-tooltip 快很多,而且不会有显示太快以后,手指一动就消失的bug. X11 默认的 tooltip 启动就会有延时。

1 个赞

你可以看看我上面的回复,在 sdcv.el 里面搜索一下 posframe-show 的代码,把字符串做正则表达式搜索以后,然后把正则中匹配 group 的地方做颜色处理,处理完以后再传递给 posframe ,应该就可以了。

欢迎贡献补丁。 :wink:

怎样设置 fringe 的颜色呢?设了 fringe 宽度以后,颜色没法改成背景色,和其它 frame 的颜色一样,搞得 tooltip 好像被推走了:

image

fringle的颜色有主题控制,posframe不管,想加pad, 可以在显示的string行收尾加空格,company就是这么搞

1 个赞

好的,多谢指教

对了,emacswiki上的包都挪到其他地方吧,比如 github gitlab, 不然melpa无法引入,时间长了,容易荒废

你可以参照yasdcv的方式,将输出的结果wash成org或者md,这样可能更好搞

好的,我看看,多谢提醒

还有一个问题,移动光标然后就删除 posframe 的标准做法是什么? 采用 sdcv.el 中的做法时,如果有选中区域,tooltip 会闪退。

一般是用post hook调用posframe-hide

post-command-hook?那出现闪退怎么办?