根据时间切换 emacs theme

太好了,最近正在找这个,非常nice。

前面说的 change-theme 应该是指 melpa 上的 theme-changer package,以前我也用过,效果还可以,不过现在换成使用 circadian 了。

theme-changer 不支持指定具体的时间,circadian 除了指定 sunrise sunset 外,还可以指定绝对的时间。

谢谢指正 已经改成 theme-changer

有人指出 2个包 也分享出来把 theme-changer 根据经纬度变换 不能指定具体时间 circadian 都可以指定
自取吧

记得之前看过一篇博文,作者通过mac上的感光硬件(术语不知道叫啥,也不记得是内置还是外置了),根据当前光的强弱来变换主题。

3 个赞

这个也很棒 收藏一下 收藏一下

发现切换主题的时候会使得 dark-theme 和 day-theme 同时被选中, 所以稍微改了一下, 加了一个 disable-theme

(defun synchronize-theme ()
    (setq hour
        (string-to-number
            (substring (current-time-string) 11 13)))
    (if (member hour (number-sequence 6 18))
		(progn
          (setq now day-theme)
		  (setq lst dark-theme)
		  )
      (setq now dark-theme)
	  (setq lst day-theme)
	  )
    (load-theme now)
	(disable-theme lst)
)
(run-with-timer 0 3600 'synchronize-theme)

load 新 theme之前disable所有的theme吗,这样才安全。

1 个赞

有道理,可是我不太清楚要怎么实现遍历所有 theme

custom-enabled-themes 变量中以List的形式记录了当前所有激活的 theme。

可以用

(mapc #'disable-theme 'custom-enabled-themes)

全部去激活。

应当是

(mapc 'disable-theme custom-enabled-themes)

另外,以下代码不仅在首次加载 Emacs 时加载主题,并且恰在每个整点时自动更改主题。

(auto-change-theme-by-time)
(let* ((current-minutes
        (string-to-number (substring (current-time-string) 14 16)))
       (current-seconds
        (string-to-number (substring (current-time-string) 17 20)))
       (remain-seconds
        ;; remaining seconds = 3600 - 60 * min - sec
        (- 3600 (* 60 current-minutes) current-seconds))
       )
  (run-with-timer remain-seconds 3600 'auto-change-theme-by-time))

收到。多谢指点! :smiley:

另外,对于“#”我一直没有弄明白是怎么用的。查找手册也没找到什么。能说说吗?

多谢多谢!

#'foo 就是 (function foo),详情请见这个页面

它和 (quote foo) 以及 'foo 基本上一样,唯一的差别只存在于:

  1. 你要编译这段代码时,(function foo) 会将 foo 编译为字节码级别的函数,而不是推迟到运行时动态地确定 foo 的含义。
  2. 你启用了 lexical binding 以使用闭包(closure)时,(function foo) 会将 foo 视作一个闭包,而 (quote foo) 不会。

另外,查找手册的方法M-x, elisp-index-search, enter, #', enter

1 个赞

赞!多谢,我再学习一下手册。

整理了一下,加上了随机选择主题

;; 亮色主题和暗色主题
(setq day-theme-list '( modus-operandi ef-day ef-spring ef-summer))
(setq dark-theme-list '( modus-vivendi ef-night ef-autumn ef-winter))

;; 随机选取主题
(defun my-random-element (my-list)
  "Return a random element from MY-LIST."
  (let ((my-length (length my-list))
        (my-random-index (random (length my-list))))
    (nth my-random-index my-list)))

;; 根据时间选择亮/暗主题
(defun synchronize-theme ()
  (setq hour
	(string-to-number
	 (substring (current-time-string) 11 13)))
  (if (member hour (number-sequence 6 18))
      (progn
	(setq now (my-random-element day-theme-list))
	(setq lst (my-random-element dark-theme-list))
	)
    (setq now (my-random-element dark-theme-list))
    (setq lst (my-random-element day-theme-list))
    )
  (mapc 'disable-theme custom-enabled-themes)
  (load-theme now t))
(synchronize-theme) ;; 启动时立即执行一次
;; 每小时执行一次
(let* ((current-minutes
	(string-to-number (substring (current-time-string) 14 16)))
       (current-seconds
	(string-to-number (substring (current-time-string) 17 20)))
       (remain-seconds
	;; remaining seconds = 3600 - 60 * min - sec
	(- 3600 (* 60 current-minutes) current-seconds))
       )
  (run-with-timer remain-seconds 3600 'synchronize-theme))

2 个赞

这相当于用手电筒可以控制emacs的颜色主题。

我是想在白天启用浅色主题,晚上启用深色主题。在网上看到有简单的设置方法,与君共享。

按照上述链接,我的代码如下:

(load-theme 'tango t t)     ;;加载浅色主题,但不启用。
(load-theme 'zerodark t t)	;;加载深色主题,但不启用。
;;早上5点启用浅色主题, 每24小时重复一次。
(run-at-time "05:00" (* 60 60 24) (lambda () (enable-theme 'tango)))
;;晚上7点启用深色主题, 每24小时重复一次。
(run-at-time "19:00" (* 60 60 24) (lambda () (enable-theme 'zerodark)))

若需进一步了解函数参数含义,可以使用C-h f查看。

2 个赞

为了避免 enable-theme 出现混乱,考虑在enable-theme之前,先做一下disable-theme为好。

;;; Theme
(use-package modus-themes)
(use-package standard-themes)
(use-package ef-themes)

;; Switch Themes automatically according to sunrise
(use-package circadian
  :ensure nil
  :demand t
  :load-path "~/.emacs.d/site-lisp/circadian"
  :config
  (setq calendar-latitude 40.0)
  (setq calendar-longitude 116.4)
  (setq circadian-themes `((:sunrise . ,(nth (random 7) '(modus-operandi
                                                          modus-operandi-tinted
                                                          standard-light
                                                          ef-elea-light
                                                          ef-maris-light
                                                          ef-deuteranopia-light
                                                          ef-cyprus)))
                           (:sunset  . ,(nth (random 7) '(modus-vivendi
                                                          modus-vivendi-tinted
                                                          standard-dark
                                                          ef-elea-dark
                                                          ef-maris-dark
                                                          ef-deuteranopia-dark
                                                          ef-bio)))))
  (circadian-setup))