我必须给出部分答案,因为这太复杂而无法当场弄清楚,而且我已经超出了我的时间预算。
面是框架属性。一帧可以同时显示多个缓冲区。模式是一个缓冲区属性。您询问如何在每种模式的基础上改变面部。结合所有这些,似乎这个问题不可能没有一个完全正确的答案。
如果您假设给定的帧永远不会显示多个缓冲区,则可以近似得到所需的答案。您实际上可以使用类似这样的方法来完成此操作,但修改为使用特殊显示正则表达式和一组与您的降价模式缓冲区名称匹配的正则表达式。
(append special-display-buffer-names
'("*VC-log*"
"*Help*"
("*Completions*"
(height . 25)
(font . "8x13"))))
但是,这可能不是您想要的。您的问题似乎暗示改变单个框架的面部属性。
再次假设一帧一次不会显示多个缓冲区,您可以尝试建议切换到缓冲区。但这可能还不够低,而且可能太慢了。(未经测试)
(defadvice switch-to-buffer (after switch-to-buffer activate compile)
"change the frame's default face after switch-to-buffer"
(doSomethingToChangePropertiesOfDefaultFace))
现在对于我的实际(不完整)答案......
一种更好但更复杂的方法将指示 markdown-mode 为尚未分配内置面之一的所有区域使用新面。您可以使用 copy-face 创建一个新面孔,并使用 set-face-* 为其赋予有趣的属性。
修改 markdown-mode 的 font-lock-defaults 以覆盖默认的 font-lock-fontify-region-function,如 font-lock.el 的第 946 行附近的注释块中所述,开头为“Fontification functions”。您可能可以使用一个非常轻微修改的 font-lock-default-fontify-region ,它在它之后立即执行一个额外的步骤:
(unless font-lock-keywords-only
(font-lock-fontify-syntactically-region beg end loudly))
额外的步骤解析区域类似于 font-lock-fontify-syntactically-region 所做的,将区域分解为“有趣的”子区域。但是这一次您会找到具有默认面的子区域,然后将这些子区域设置为您之前创建的新面。
总而言之,你的 .emacs 文件中应该只有几行 elisp,再加上与原始文件只有微小差异的 font-lock-default-fontify-region 的副本(调用一个新函数),加上复制 font-lock-fontify-syntactically-region 并修改它以进行您的竞标(最困难的部分)。
实际上,如果您“之后”建议 font-lock-fontify-syntactically-region 那么您可能甚至不需要修改 font-lock-defaults 或 font-lock-default-fontify-region。