2

(我不知道这个问题的标题是否正确)

当使用几种次要模式同时改变“颜色”时,是什么决定了哪些模式显示什么?例如,我试图同时使用highlight-changes-moderainbow-mode:http: //julien.danjou.info/projects/emacs-packages

我遇到的问题是,当我在缓冲区中输入新颜色(比如#306090)时,我看到的不是彩虹模式所希望的#306090字符的背景颜色,而是看到背景颜色(整行)已更改(因为我使用的是highlight-changes-mode,我非常喜欢)。

我的问题有点笼统:是什么决定了这里解决的“顺序”冲突?是否取决于各种模式的加载顺序?

4

1 回答 1

6

它不依赖于模式的加载顺序。这取决于模式用于应用面的各自机制。

rainbow-mode用于font-lock突出显示文本,而后者又使用所谓的文本属性。文本属性是字符串对象的内在属性,可以属于不属于任何缓冲区的字符串对象。(例如,文本属性可以在剪切和粘贴中保留下来。)

highlight-changes-mode相比之下,使用“覆盖”,可以将其视为虚拟文本属性:覆盖是缓冲区中间隔的规范以及该间隔应该具有的一个或多个属性的规范;覆盖可以指定的属性之一是面。覆盖属性不是字符串本身的属性(因此不能在剪切和粘贴中幸存)。

如果缓冲区子字符串的文本属性和覆盖该子字符串的覆盖指定了不兼容的面部属性,则覆盖优先。(如果面部属性不是不兼容的——比如当一个文本属性指定了前景色但没有背景色,而叠加层只指定了背景色——那么它们会以你期望的方式合并。)

一般来说,合并面的规则很复杂,因为叠加层本身可以指定要在缓冲区位置显示的字符串,而这些字符串又可以有自己的文本属性,并且不同的规则控制这种情况;此外,某些内置面(如鼠标高光和模式线面)受其自身规则的约束。如果您想了解更多信息,请参阅信息节点“(elisp) Faces”和“(elisp) Overlays”。对于完整的故事,您需要查看显示例程的源代码(可能从 xdisp.c 中的 handle_face_prop 和 xfaces.c 中的 face_at_string_position 开始)。

于 2012-07-19T01:46:14.357 回答