如何让自定义的配色只在当前主题中生效?

我目前使用的配色只有少量是自定义的,使用 custom-set-faces 改了 :italic :foreground 等少量参数,毕竟那种动辄几百行的主题我是没有能力设计与修改的,而且我习惯定期更新并与上游保持一致。

平时主要用暗色主题,偶尔在白色背景的网页与 Emacs 之间切换的时候,我会暂时切换到亮色主题。那么问题来了:自定义的在暗色主题下鲜艳的颜色,这时候很多都看不清了,怎样让为数不多的自定义颜色仅在当前主题生效?

我本来的想法是使用 minor-modecustom-set-theme-faces 的方法,试了之后(也许是没配置好)都没有成功。要么自定义效果不生效,要么生效了但切换到别的主题后不能自动失效。

请问,有没有更好的思路?谢谢!

Emacs: emacs-git v27.0 spacemacs develop

1 个赞

我是通过不同的 switch 函数来切换 theme,然后同时设置相关的 face:

(defun theme/swith-to-light ()
  (interactive)
  (load-theme 'xxx-light)
  (set-face-attribute ...))

(defun theme/swith-to-dark ()
  (interactive)
  (load-theme 'xxx-dark)
  (set-face-attribute ...))

也可以试试 advice,在 load-theme 前/后做些设置:

(defun load-theme@after (theme &optional no-confirm no-enable)
  (cond
   ((eq theme 'xxx-light)
    (set-face-attribute ...))
   ((eq theme 'xxx-dark)
    (set-face-attribute ...))
   (t ...)))

(advice-add 'load-theme :after 'load-theme@after)
2 个赞

谢谢!

使用 advice-add 这一方法是可以的,唯一的问题是,启动 Emacs 之后仍是默认主题和配色,需要等再次调用之后,修改的内容才能生效。我正在尝试解决,让自定义的部分启动自动运行。


更新:

两种方法均可用,第一种方法上午没试验成功是因为我之前抄了部分 @ksqsf 写的一键切换主题的代码,主题的变量名没设置好。

再次感谢!

解决了吗,没解决试试把load-theme 放在early-init中,可以解决,但是不能用package的主题 因为在early–init 中package没有加载

doom-themes或者spacemacs-theme套装完美避免这些问题 :joy::joy::joy:

谢谢! 我后来自定义一组 set-face-attribute,主题就没再折腾