我目前使用的配色只有少量是自定义的,使用 custom-set-faces
改了 :italic :foreground
等少量参数,毕竟那种动辄几百行的主题我是没有能力设计与修改的,而且我习惯定期更新并与上游保持一致。
平时主要用暗色主题,偶尔在白色背景的网页与 Emacs 之间切换的时候,我会暂时切换到亮色主题。那么问题来了:自定义的在暗色主题下鲜艳的颜色,这时候很多都看不清了,怎样让为数不多的自定义颜色仅在当前主题生效?
我本来的想法是使用 minor-mode
或 custom-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 写的一键切换主题的代码,主题的变量名没设置好。
再次感谢!
SGNH
4
解决了吗,没解决试试把load-theme 放在early-init中,可以解决,但是不能用package的主题 因为在early–init 中package没有加载
谢谢!
我后来自定义一组 set-face-attribute,主题就没再折腾