在GNU Emacs中,如何按模式设置背景颜色?

3
在GNU Emacs中,我可以看到我可以为不同的模式设置不同的前景类型的面,例如:
(custom-set-faces
 '(message-header-to ((t (:foreground "LightGoldenrod1" :weight bold)))))

我该如何按模式设置框架的背景颜色?例如,org-mode 背景应该采用 color-theme 定义的颜色,但 message-mode 背景应为黑色?

类似下面这样,只是以下代码不起作用:

(custom-set-faces
 '(message-mode-frame ((t (:background "black")))))

1
澄清一下:您是想更改“文本”的背景还是整个框架的背景?如果是前者,您可能只需在第一个示例中添加“:background”关键字。如果是后者,据我所知,您必须设置框架的背景,这与设置窗口的背景不同。 - Dan
整个框架,即消息模式的整个背景。 - incandescentman
3
使用buffer-face-mode,您可以使一个缓冲区与其他缓冲区不同。当您设置帧背景时,它会影响帧中的所有缓冲区。 - lawlist
1
非常酷。实际上,请查看以下问题的线程,它似乎有一些适合您的答案:https://dev59.com/DXI_5IYBdhLWcg3wHvU5 - Dan
2个回答

3
这里有一个快速的示例,可以通过帧来实现 - 即它将影响框架中的每个缓冲区:
(add-hook 'post-command-hook 'change-my-background-color)

(add-hook 'change-major-mode-hook 'change-my-background-color)

(add-hook 'window-configuration-change-hook 'change-my-background-color)

(defun change-my-background-color ()
  (cond
    ((eq major-mode 'org-mode)
      (set-background-color "honeydew"))
    ((eq major-mode 'text-mode)
      (set-background-color "blue"))
    (t
      (set-background-color "red"))))

这里是更改缓冲区颜色的示例:

(defun buffer-background-red ()
(interactive)
  (setq buffer-face-mode-face `(:background "red"))
  (buffer-face-mode 1))

目前无法在窗口上实现此操作;但是,这里有一个链接,可以更改模式行的颜色以匹配活动窗口。

https://dev59.com/DXI_5IYBdhLWcg3wHvU5#20936397


-1
"整个框架,即消息模式的整个背景"。
这句话让我想到作者在Emacs中混淆了“frame和window”。每个框架可以包含多个窗口。而*-mode可以指代每个缓冲区,即窗口。
因此,如果您想为每个缓冲区设置背景颜色按模式(但不是框架),那么最好使用模式钩子像这里一样

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接