设置 Emacs 默认字体 par-buffer/mode

Posted

技术标签:

【中文标题】设置 Emacs 默认字体 par-buffer/mode【英文标题】:Set Emacs defaut font face per-buffer/mode 【发布时间】:2010-10-06 18:22:54 【问题描述】:

如何更改 Emacs 用于基于每个模式设置文本样式的默认面?

例如,假设我已经对我拥有的面部自定义感到满意,其中包括默认的固定宽度字体。但是,在一种特定模式下(例如markdown-mode.el),我希望默认字体为可变宽度。

为 markdown 模式设置独特的标题、链接等样式很容易:只需将光标放在样式文本和 M-x describe-face 上,然后单击链接进行自定义。

但是,如果没有指定其他面,则默认面是使用的面,因此它不是特定于markdown-mode,如果修改会影响所有其他模式。

我可以在markdown-mode-hook 中使用什么魔法来设置使用此模式的缓冲区的默认面?

【问题讨论】:

如果有一些变量可以控制默认面,那么您可以仅在打开带有降价的文件时调用的挂钩中将其本地化为当前缓冲区。 一般性地问问题,然后做一个具体的例子,围绕这个具体的例子回答。如果你真的需要“Set Emacs defaut font face per-mode”,见Using a different font for each major mode - Emacs Stack Exchange 【参考方案1】:

这样的事情怎么样:

(add-hook 'markdown-mode-hook (lambda () (variable-pitch-mode t))

然后您可以自定义variable-pitch 面,缓冲区中的其他面将继承自此而不是默认面。

阅读buffer-face-mode 的文档以了解更多自定义细节。 (BufFace 也用于text-scale-increasetext-scale-decrease...非常有用。)

【讨论】:

据我了解,这需要 Emacs 23,在 Emacs 22 中既找不到 variable-pitch-mode 也找不到 buffer-face-mode 哇,人们还在使用 Emacs 22? 谢谢,成功了。但是,当缓冲区使用可变间距字体时,滚动变得非常缓慢以至于无法使用。但这可能只是一个错误。【参考方案2】:

我必须给出部分答案,因为这太复杂了,无法当场弄清楚,而且我已经超出了我的时间预算。

Face 是一个框架属性。一帧可以同时显示多个缓冲区。模式是一个缓冲区属性。您询问如何在每种模式的基础上改变面部。综合所有这些,似乎这个问题不可能没有一个完全正确的答案。

如果您假设给定的帧永远不会显示多个缓冲区,则可以近似得到所需的答案。您实际上可以使用类似的方法来完成此操作,但需要修改为使用 special-display-regexps 和一组与您的降价模式缓冲区名称匹配的正则表达式。

(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。

【讨论】:

名称和行号与 GNU emacs 22.3.1 对话。 或者只是获取最新版本的 emacs 并使用 buffer-face-mode。 酷。但我可能会等到 emacs 23 真正发布后再更新。【参考方案3】:

即使对于 emacs 22.3.1 版,它实际上也很简单......

只需尝试以下操作:

(progn 
  (set-buffer "your buffer name here")
  (overlay-put (make-overlay 0 (buffer-size)) 'face 'your-face))

【讨论】:

你还可以在junis.orgfree.com/SetBufferFont.el找到一个可以轻松更改缓冲区字体的函数定义 叠加效果不好,因为它们很慢。只有当你没有太多的同时,它们才是好的......【参考方案4】:

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))))

只需将您想要的无衬线字体模式添加到列表中即可。

【讨论】:

以上代码的作用是为除最后一行之外的所有行中枚举的所有模式启用variable-pitch-mode @StéphaneGourichon (variable-pitch-mode t)【参考方案5】:

有一个我觉得非常方便的代码块,来自 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)))

【讨论】:

以上是关于设置 Emacs 默认字体 par-buffer/mode的主要内容,如果未能解决你的问题,请参考以下文章

Emacs:设置特定窗口的背景颜色

ubuntu 20.04 上的 Emacs 27.1 找不到任何字体

更改emacs中的字体设置[重复]

emacs

emacs 设置emacs的外观

mac系统下为emacs设置中文字体,解决乱码问题