如何更改Emacs用于在每个模式下设置文本样式的默认面?
例如,假设我已经对我拥有的面部自定义感到满意,其中包括默认的固定宽度字体.但是,在一个特定模式(markdown-mode.el
比方说)中,我希望默认字体是可变宽度.
为标记模式设置标题,链接等很容易:只需将光标放在样式文本上M-x describe-face
,然后单击链接进行自定义.
但是,如果未指定其他面,则默认面是使用的面,因此它不是特定于降价模式,如果修改将影响所有其他模式.
markdown-mode-hook
使用此模式设置缓冲区的默认面可以添加什么魔力?
这样的事情怎么样:
(add-hook 'markdown-mode-hook (lambda () (variable-pitch-mode t))
然后variable-pitch
,您可以自定义面,缓冲区中的其他面将继承此面而不是默认面.
阅读文档以buffer-face-mode
获取更多自定义详细信息.(BufFace也用于text-scale-increase
和text-scale-decrease
...非常有用的.)
我必须给出一个部分答案,因为这太复杂了,不能当场弄清楚我已经把我的时间预算搞得一团糟了.
Face是一个框架属性.帧可以同时显示多个缓冲区.模式是缓冲属性.你问如何在每个模式的基础上改变面部.结合所有这些,似乎问题不能没有一个完全正确的答案.
如果您假设给定的帧永远不会显示多个缓冲区,则可以近似所需的答案.您可以使用类似的方法实现此目的,但修改为使用special-display-regexps和一组与markdown-mode缓冲区名称匹配的regexp.
(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))
而现在我的实际(不完整)答案......
一种更好但更复杂的方法将指示降价模式为尚未分配其中一个内置面的所有区域使用新面.您可以使用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.
该variable-pitch
-mode是真棒.我通过这个帖子发现了它.但它可以变得更加棒极了:
(dolist (hook '(erc-mode-hook LaTeX-mode-hook org-mode-hook edit-server-start-hook markdown-mode-hook)) (add-hook hook (lambda () (variable-pitch-mode t))))
只需将sans-serif字体所需的任何模式添加到列表中即可.