根据时间切换 emacs theme

找了些资料 都有点老了 要么就是报错 找到一个靠谱的 简单易懂 根据时间 自动切换 明暗主题 需要的自取

(setq day-theme 'light-blue)
(setq dark-theme 'misterioso)
(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)

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

[Mac] 根据环境光自动调整主题

也可以买个好点的台灯

也可以使用 f.lux 控制屏幕颜色。

那条语句是6点和18点写死的吗?

emacs的calendar有个传统功能就是在给定的任意位置的经纬度后可以算出这个位置在任意日期的日出日落时刻,误差不超过几分钟。我在没有手机前一直用这个功能玩儿呢。这样你的主题可以和宇宙联动实现全自动了!

melpa上已经有一个了 叫theme-changer 给定经纬度 会自动根据日出落时间切换。。 我想自己定时间就用了这个小时的 :)

这个也很好,小即是美。

太好了,最近正在找这个,非常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 个赞