【问题标题】:How are conflicting faces orders resolved?如何解决冲突的面孔订单?
【发布时间】:2012-07-17 17:25:02
【问题描述】:

(不知道这题的题目对不对)

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

我遇到的问题是,当我在缓冲区中输入新颜色时(例如 #306090),而不是看到 #306090 字符的背景颜色为彩虹模式希望它是这样,我看到(整行的)背景颜色发生了变化(因为我使用的是highlight-changes-mode,我非常喜欢)。

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

【问题讨论】:

    标签: emacs colors emacs-faces


    【解决方案1】:

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

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

    highlight-changes-mode 相比之下,使用“覆盖”,它可以被认为是虚拟文本属性:覆盖是缓冲区中间隔的规范以及该间隔应该起作用的一个或多个属性的规范好像它有;覆盖可以指定的属性之一是面。覆盖属性不是字符串本身的属性(因此无法在剪切和粘贴中保留)。

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

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

    【讨论】:

    • @Ap:+1,很好的答案......哦,我想我会保持“原样”,这没什么大不了的 :) 感谢您对叠加层的解释,我不是不知道这些。
    猜你喜欢
    • 2012-01-09
    • 2016-02-22
    • 2013-11-09
    • 1970-01-01
    • 2011-12-02
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多