(求助) face text properties 的 :box 属性如何支持只显示一个边?

默认只支持单独设置box水平或垂直方向的边框,我需要设置为只显示一个边的边框,比如下边框(不使用 :underline 属性的原因是,它是字体的下划线,和一行的下边框位置上还是有差异的)。

text-properties 的显示是底层机制决定的,我估计得修改C源码。不知道使用 emacs 动态模块能否解决这个问题,比如重写这部分的C代码或打补丁,而不需要重新编译,不知道是否有这方面经验的大佬可以指点一下。

还有另外一个方案来模拟下边框:使用下一行的 :overline face属性,这样也是可以的。但也只是模拟,在复杂的情况下,需要处理一些特殊的情况,不漂亮。如果能实现原始的一行的下边框就更好了。

下图是使用下一行的 :overline 实现的下边框,效果还不错。如果能有原生的实现就更好了。

大佬,你这个效果相当不错呀。

block-render 是怎么实现的?麻烦分享一下。

目前的实现还比较丑,中英文混排在一些像素宽度下会出现单词间宽度过大或过小的情况,我在用 knuth-plass 算法重写这个实现,等完美了再分享出来。

1 个赞

我是今天才发现 :joy: :joy: (为什么论坛没有捂脸的表情) 原来从 emacs 29 开始 :underline 属性支持了一个 position 的选项,可以用来调整下划线相对基线的位置。之前是思维定式了想着从 :box 上找突破口,就没想到在 box 文档的上面几行就藏着答案啊。

目前 block 的下边框用最后多余的一行的 overline 来模拟的,然后在处理上下两个block仅靠着的情况就要merge相邻的行,很是复杂,最后发现一些特殊情况下仍然无法处理。想要漂亮的实现只能换解决方案,原本已经不报期望了,就问一下AI,告诉了我这个 position 的选项。我印象中半年前我也问过AI一样的问题,它没有给我这个答案啊,只能说AI一直在进步,自己看文档也要更细心,哈哈哈,大家引以为戒。

这个问题真是花费了许多时间,翻了C源码,尝试过从底层代码能不能hack,太复杂了,行不通;最后只能用多一行的overline来模拟,这样要多写了许多的代码来处理很多的特殊情况。现在有了原生的支持,感觉一下子就舒服了许多了,可以删掉许多的代码了,哈哈哈。

4 个赞