设置每个缓冲区/模式的Emacs defaut字体面

设置每个缓冲区/模式的Emacs defaut字体面,emacs,fonts,themes,emacs-faces,font-lock,Emacs,Fonts,Themes,Emacs Faces,Font Lock,如何更改Emacs用于按模式设置文本样式的默认面 例如,假设我已经对自己的面部定制感到满意,其中包括默认的固定宽度字体。但是,在一种特定模式下(markdown mode.el),我希望默认字体的宽度是可变的 在标记模式下,很容易为标题、链接等设置独特的样式:只需将光标放在已设置样式的文本和M-x descripe face,然后单击链接对其进行自定义 但是,默认面是在未指定其他面时使用的面,因此它不特定于标记模式,如果修改,将影响所有其他模式 我可以在标记模式挂钩中设置什么魔法来设置使用此模式

如何更改Emacs用于按模式设置文本样式的默认面

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

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

但是,默认面是在未指定其他面时使用的面,因此它不特定于标记模式,如果修改,将影响所有其他模式


我可以在
标记模式挂钩中设置什么魔法来设置使用此模式的缓冲区的默认面

(add-hook 'markdown-mode-hook (lambda () (variable-pitch-mode t))
然后,您可以自定义
可变螺距
面,缓冲区中的其他面将从此面而不是默认面继承


有关更多自定义详细信息,请阅读
缓冲面模式的文档。(BufFace还用于
文本比例增加
文本比例减少
…非常有用。)

我必须给出一个部分答案,因为这太复杂了,无法当场计算出来,而且我已经浪费了我的时间预算

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

如果假设给定的帧永远不会显示多个缓冲区,则可以近似得到所需的答案。实际上,您可以使用类似的方法来实现这一点,但修改为使用特殊的显示正则表达式和一组与标记模式缓冲区名称匹配的正则表达式

(append special-display-buffer-names
        '("*VC-log*"
          "*Help*"
          ("*Completions*" 
           (height . 25)
           (font . "8x13"))))
然而,这可能不是你想要的。您的问题似乎暗示要更改单个帧的面属性

再次假设一个帧一次不会显示多个缓冲区,您可以尝试建议切换到缓冲区。但这一水平可能不够低,也可能太慢。(未经测试)

现在是我的实际(不完整)答案

一种更好但更复杂的方法将指示降价模式为尚未指定一个内置面的所有区域使用新面。可以使用“复制面”创建新面,并使用“设置面-*”为其提供有趣的属性

修改标记模式的字体锁定默认值,以覆盖默认字体锁定字体化区域功能,如font-lock.el第946行附近以“字体化功能”开头的注释块中所述。您可能可以使用稍微修改过的字体锁定默认fontify区域,该区域在完成后只需执行一个额外步骤:

  (unless font-lock-keywords-only
    (font-lock-fontify-syntactically-region beg end loudly))
额外的步骤解析该区域,类似于font lock fontify语法区域所做的,将该区域划分为“有趣”的子区域。但这一次,您将找到具有默认面的子区域,并将这些子区域的文本属性放置到先前创建的新面

在所有这些情况下,您觉得您的.emacs文件中应该只有几行elisp,再加上复制一个字体锁定默认fontify区域,该区域与原始区域只有微小差异(调用一个新函数),再加上复制一个字体锁定fontify区域,并根据您的要求进行修改(最困难的部分)


实际上,如果您“after”以语法方式建议字体锁定fontify区域,那么您甚至可能不需要修改字体锁定默认值或字体锁定默认fontify区域。

即使对于emacs版本22.3.1,这实际上也很简单

请尝试以下方法:

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

可变音高
-模式非常棒。我是通过这条线索发现的。但它可以变得更棒:

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

只需在列表中添加您想要的任何无衬线字体模式。

有一段代码,我觉得非常方便,来自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
package,您甚至可以轻松指定缓冲区的颜色主题:

(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 defaut字体”,请看我的理解,这需要Emacs 23,在Emacs 22中既找不到
可变音高模式
也找不到
缓冲字体模式
。哇,人们仍然使用Emacs 22?谢谢,这就是诀窍。然而,当缓冲区使用可变间距字体时,滚动会变得非常慢,以至于无法使用。但这可能只是一个bug。名称和行号与GNU emacs 22.3.1对话。或者只获取最新版本的emacs并使用buffer-face-mode.Cool。但我可能会等到emacs 23正式发布后再更新它。您还可以找到一个函数的定义,该函数可以轻松地更改叠加时缓冲区的字体,但这并不好,因为它们速度很慢。只有当您在同一时间没有太多时,它们才是好的……上面的代码所做的是为所有行中枚举的所有模式启用
可变螺距模式
,最后一行除外。@StéphaneGourichon
(可变螺距模式t)
(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)))