冲突的面孔订单是如何解决的?

时间:2012-07-18 15:53:12

标签: emacs colors emacs-faces

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

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

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

我的问题是一个通用问题:什么决定了哪个“订单”冲突在这里得到解决?它取决于各种模式的加载顺序吗?

1 个答案:

答案 0 :(得分:6)

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

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

相比之下,

highlight-changes-mode使用"叠加,"可以将其视为虚拟文本属性:覆盖是缓冲区中间隔的规范,以及该区间应该像它具有的一个或多个属性的规范一样;覆盖可以指定的属性中的一个是面。叠加属性不是字符串本身的属性(因此不会在剪切和粘贴时存活)。

如果缓冲子字符串的text属性和覆盖该子字符串的叠加层指定了不兼容的面部属性,则叠加优先。 (如果面部属性不兼容 - 例如,当文本属性指定前景色但没有背景色,而叠加层仅指定背景色时 - 那么它们将以您的方式合并为#39 ; d期待。)

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