Emacs——如何创建垂直穿透效果

Emacs——如何创建垂直穿透效果,emacs,elisp,Emacs,Elisp,我正在寻找一些建议,关于如何创建垂直划过的视觉效果(垂直条顶部的字符(“\u007C”)仍然可见)。如果可以分层,则竖条应位于下方,以便字母大部分可见 我搜索了一种叠加字符、分层叠加的方法,并查看了一些xpm图像,但是,我没有找到任何与我要查找的内容非常接近的内容。目标是获得与下图类似的真实十字线效果——灰色背景将替换为黄色垂直线,以便字母仍然可见 功能请求#17684(十字光标)[]和功能请求22873(多个假光标)[]正在进行中。尽管不知道这些特性是否会被纳入官方的Emacs中,但在上述两

我正在寻找一些建议,关于如何创建垂直
划过
的视觉效果(垂直条顶部的字符(“\u007C”)仍然可见)。如果可以分层,则竖条应位于下方,以便字母大部分可见

我搜索了一种叠加字符、分层叠加的方法,并查看了一些xpm图像,但是,我没有找到任何与我要查找的内容非常接近的内容。目标是获得与下图类似的真实十字线效果——灰色背景将替换为黄色垂直线,以便字母仍然可见

功能请求#17684(十字光标)[]和功能请求22873(多个假光标)[]正在进行中。尽管不知道这些特性是否会被纳入官方的Emacs中,但在上述两个特性请求中都发布了一个工作草案证明概念。在从主分支(X11、Windows或NS)构建Emacs的GUI版本之前,这些特性需要对C和Lisp内部进行修改


第1例(共3例)

下面的代码片段适用于某些操作系统上的某些字体——例如,它在Windows上是开箱即用的;但是,作者在OSX 10.6.8 Snow Leopard或Snow Leopard Server 10.6.8上无法使用它。[请参阅错误报告编号20537----尽管Emacs开发团队已经正式关闭了错误报告,但在“错误修复”之后,这位作者始终无法在Snow Leopard上使用该功能。(]用户可能希望试验字形参考点,并且
composite.el
中的变量
reference point alist
具有与之相关的详细文档字符串。用户还可能希望试验使用
后字符串
前字符串
显示属性。库
vline.el
at有一个名为
vline style
的变量,该变量可以设置为
'face
'compose
、或
'mixed
——后两种设置导致
vline
使用该代码段的细微变化[参见所述库的第362至370行]

(让*(
(最小点(最小点))
(最大点(最大点))
(点)
(pt+1(1+pt))
(字符(pt后面的字符))
(行字符(字符串到字符“|”))
(str(当char(compose chars char'(tc.tc)line char)))
(叠加放置(使叠加pt+1)显示str)
(坐2分钟)
(删除重叠点最小点最大显示点)

第2例(共3例)

以下代码段使用了一个称为带空格的零的unicode字符(即
uFEFF
)。因为空间不能接收前景色,所以使用背景色使零宽度空间显示一条延伸整个行高的细垂直线。正如在本代码段上下文中使用的,零宽度空间的宽度为1个像素,并减小连接字符的大小,以便两者结合d个字符的宽度等于
帧字符宽度
。在OSX操作系统上使用默认字体
-*-Monaco normal-*-12-*-*-*-*-*-m-0-iso10646-1
对该代码段进行了测试。在本例中,光标会被短时间移除,以便可以更清楚地看到覆盖

(让*(
(最小点(最小点))
(最大点(最大点))
(点)
(pt+1(1+pt))
(字符(pt后面的字符))
(char str(当char(char到string char))时)
(ln char str(字符到字符串?\uFEFF))
(str(当字符
(康卡特)
(属性ln char str'face'(:背景“红色”))
(属性化字符str'face'(:高度100()()))
(内部显示光标零零)
(叠加放置(使叠加pt+1)显示str)
(坐2分钟)
(内部显示光标零t)
(删除重叠点最小点最大显示点)

第3例(共3例)

下面是一个使用xpm图像覆盖的示例,用于支持xpm图像格式的图形Emacs版本。它宽11像素,高20像素,有4种预选颜色。我在运行雪豹10.6.8的Mac上,使用Emacs时我喜欢的字体是
-*-Courier normal-*-18-*-*-m-0-iso10646-1
--帧字符宽度
为11,
帧字符高度
为20。我在大写字母“a”的左侧添加了一条细的垂直黄线,作为如何绘制自定义图像的示例。可以使用
(点后字符)编程方式替换点处的字符
并取该数字——在本例中,大写字母“A”为65——并替换相应的变量——例如,
(cond((eq(char-after(point))65)cap-ltr-A-xpm)
——并在覆盖放置中使用该变量——例如,
(覆盖放置(make overlay(point)(1+(point)))'显示cap-ltr-a-xpm)这对于截断的缓冲区和文字包都非常有效,因为在一个单词中间的一个字符上的<代码>显示/<代码>覆盖属性不会导致单词的第一部分属于前一行的末尾。当然,创建一个喜欢的自定义库需要时间。xpm图像。在本例中,光标被移除一小段时间,以便可以更清楚地看到覆盖

ImageMagick能够根据特定的字体系列和大小生成特定字符的半精确xpm,但它并不像我希望的那样精确——下面是一个指向使用该外部实用程序的说明的链接:简而言之,用户应该准备好花钱