如何更改Emacs用于在每个模式下设置文本样式的默认面?
例如,假设我已经对我所拥有的面部自定义感到满意,其中包括默认的固定宽度字体。但是,在一个特定模式(例如markdown-mode.el
)中,我希望默认字体是可变宽度。
很容易为标记模式设置标题,链接等的样式:只需将光标放在样式文本和M-x describe-face
上,然后点击链接进行自定义。
但是,如果没有指定其他面,默认面是使用的面,因此它不是特定于降价模式,如果修改将影响所有其他模式。
我可以在markdown-mode-hook
中使用此模式为缓冲区设置默认面部有什么魔力?
答案 0 :(得分:30)
这样的事情怎么样:
(add-hook 'markdown-mode-hook (lambda () (variable-pitch-mode t))
然后,您可以自定义variable-pitch
面,缓冲区中的其他面将从此继承,而不是默认面。
阅读buffer-face-mode
的文档以获取更多自定义详细信息。 (BufFace也用于text-scale-increase
和text-scale-decrease
......非常有用。)
答案 1 :(得分:6)
我必须给出一个部分答案,因为这太复杂了,不能当场弄清楚我已经把我的时间预算浪费了。
Face是一个框架属性。帧可以同时显示多个缓冲区。模式是缓冲属性。你问如何在每个模式的基础上改变面部。结合所有这些,似乎问题不能没有一个完全正确的答案。
如果您假设给定的帧永远不会显示多个缓冲区,则可以近似所需的答案。你可以用这样的东西来实现它,但是修改为使用特殊显示-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。
答案 2 :(得分:5)
variable-pitch
- 模式非常棒。我通过这个帖子发现了它。但它可以变得更加棒极了:
(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字体的任何模式添加到列表中。
答案 3 :(得分:2)
即使对于emacs版本22.3.1 ...
,它实际上也很简单试试以下内容:
(progn
(set-buffer "your buffer name here")
(overlay-put (make-overlay 0 (buffer-size)) 'face 'your-face))
答案 4 :(得分:0)
我发现从EmacsWiki可以看到非常方便的代码块。这样做的好处是,您不仅可以设置字体,还可以方便地配置:height
,:width
等
;; Use variable width font faces in current buffer
(defun my-buffer-face-mode-variable ()
"Set font to a variable width (proportional) fonts in current buffer"
(interactive)
(setq buffer-face-mode-face '(:family "DejaVu Sans" :height 100 :width semi-condensed))
(buffer-face-mode))
;; Use monospaced font faces in current buffer
(defun my-buffer-face-mode-fixed ()
"Sets a fixed width (monospace) font in current buffer"
(interactive)
(setq buffer-face-mode-face '(:family "Consolas" :height 100))
(buffer-face-mode))
;; Set default font faces for Info and ERC modes
(add-hook 'erc-mode-hook 'my-buffer-face-mode-variable)
(add-hook 'Info-mode-hook 'my-buffer-face-mode-variable)
结合load-theme-buffer-local
包,您甚至可以轻松指定缓冲区的颜色主题:
(defun my-buffer-face-mode-variable ()
"Set font to a variable width (proportional) fonts in current buffer"
(interactive)
(setq buffer-face-mode-face '(:family "DejaVu Sans" :height 100 :width semi-condensed))
(buffer-face-mode)
(load-theme-buffer-local 'leuven (current-buffer)))