我现在想实现根据当前加载的主题应用不同的whitespace颜色
下面是我当前的代码,但是不起作用
(setq day-theme 'github) ;; 白天使用的主题
(setq dark-theme 'hipster) ;;晚上使用的主题
(defun set-whitespace-color ()
(if (day-theme current-theme)
(custom-set-faces '(whitespace-space ((t (:foreground "dim gray")))))) ;;如果day-theme=当前应用的主题,则执行这一句
(if (eq dark-theme current-theme)
(custom-set-faces
'(whitespace-space ((t (:foreground "dim gray"))))
'(whitespace-space ((t (:background "dim black")))))) ;;如果dark-theme=当前应用的主题,则执行这一句
)
(run-with-timer 0 3600 'set-whitespace-color)
请问如何判断当前应用的主题呢? 我的if语句是对的吗?
根据
https://www.reddit.com/r/emacs/comments/a10hnr/cycle_through_themes/
可以试试:
(car custom-enabled-themes)
;; => sanityinc-tomorrow-eighties
少了个 eq
,除此之外你的 if
没问题。除了 if
,你还可以用 when/cond/pcase/cl-case/etc
。
cireu
3
你为什么不想一下你的两个if语句的判断形式都不一样呢
我就是故意那么做的,发上来给大家看, 就是两种方法都不起效果。
cireu
6
你这个current-theme
是什么东西?
我用describe-function
和describe-variables
都没有找到
我也不知道,我看网上有些写的是 current-theme, 但是我把他换成 custom-enabled-themes 也是不行。
我稍微改了一下(假设你同时只启用一个主题):
(defvar day-theme 'github)
(eefvar dark-theme 'hispter)
(defun set-whitespace-color ()
(when (memq day-theme custom-enabled-themes)
(custom-set-faces '(whitespace-space ((t (:foreground "dim gray"))))))
(when (memq dark-theme custom-enabled-themes)
(custom-set-faces
'(whitespace-space ((t (:foreground "dim gray"))))
'(whitespace-space ((t (:background "dim black")))))))
如果你就只用这两个主题的话,也可以这么写:
(defun set-whitespace-color ()
(if (memq 'github custom-enabled-themes)
(custom-set-faces '(whitespace-space ((t (:foreground "dim gray")))))
(custom-set-faces
'(whitespace-space ((t (:foreground "dim gray"))))
'(whitespace-space ((t (:background "dim black")))))))
另外借鉴别人代码的时候,最好看看这段代码是单独的,还是属于某个repo的一部分。有些package/配置对function/variable的命名很不在意,结果就搞得特别像Emacs内建的……
以及我觉得这个需求可以给load-theme加一个advice解决?而不是采用隔一段时间检查一下这种。
而且不知道为何,你这代码里设置颜色的部分在我这里不起作用……
不知道为啥,用您这个代码后,能判断设置hipster主题,但我加载github主题后,颜色不能变回来
我也是半吊子一个……以及感谢你让我发现了我还真有这个需求……
(defun set-whitespace-color (&rest _)
(if (memq 'github custom-enabled-themes)
(custom-set-faces '(whitespace-space ((t (:foreground "dim gray")))))
(custom-set-faces
'(whitespace-space ((t (:background "dim black" :foreground "dim gray")))))))
(advice-add 'load-theme :after #'set-whitespace-color)
我现在就这么先用着……
=======Update=======
(defun set-whitespace-color (&rest _)
(if (memq 'github custom-enabled-themes)
(set-face-attribute 'whitespace-space nil :foreground "dim gray")
(progn
(set-face-attribute 'whitespace-space nil :background "dim black")
(set-face-attribute 'whitespace-space nil :foreground "dim gray"))))
(advice-add 'load-theme :after #'set-whitespace-color)
现在是如此的状态……不使用custom-set-face
了……
感谢感谢,我这边可以了
我是这样的
;; 根据时间自动切换主题
(setq day-theme 'github) ;; 白天使用的主题
(setq dark-theme 'hipster) ;;晚上使用的主题
(defun synchronize-theme ()
(setq hour
(string-to-number
(substring (current-time-string) 11 13)))
(if (member hour (number-sequence 6 18))
(setq now day-theme)
(setq now dark-theme))
(load-theme now)
)
(run-with-timer 0 3600 'synchronize-theme)
;; 自动颜色控制
(defun set-whitespace-color ()
(when (memq day-theme custom-enabled-themes)
(custom-set-faces
'(whitespace-space ((t (:foreground "dim gray"))))
)
)
(when (memq dark-theme custom-enabled-themes)
(custom-set-faces
'(whitespace-space ((t (:foreground "dim gray"))))
'(whitespace-space ((t (:background "dim black"))))
)
)
)
(run-with-timer 0 3600 'set-whitespace-color)
现在的效果
github主题
hipster主题
现在可以根据使用的主题自动更改whitespace的配色了。
我写的这东西并不可靠……因为我完全不考虑可能同时加载两个及以上theme的情况…… @xuchunyang 的(car custom-enabled-themes)
更好点。
但是我有强迫症……所以就这么写了。
以及……你写Elisp的Code Style……好吧我有强迫症。
如果只是想根据明暗主题改变,
(defface aface '((((background light)) . (:background "black"))
(((background dark)) . (:background "white")))
"The face that changes color.")
(setq over (make-overlay 1 (point-max)))
(overlay-put over 'face 'aface)
简单一点
把这个放到sractch buffer然后运行