太好了,最近正在找这个,非常nice。
前面说的 change-theme
应该是指 melpa 上的 theme-changer
package,以前我也用过,效果还可以,不过现在换成使用 circadian
了。
theme-changer
不支持指定具体的时间,circadian
除了指定 sunrise sunset 外,还可以指定绝对的时间。
谢谢指正 已经改成 theme-changer
有人指出 2个包 也分享出来把
theme-changer 根据经纬度变换 不能指定具体时间
circadian 都可以指定
自取吧
记得之前看过一篇博文,作者通过mac上的感光硬件(术语不知道叫啥,也不记得是内置还是外置了),根据当前光的强弱来变换主题。
这个也很棒 收藏一下 收藏一下
发现切换主题的时候会使得 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吗,这样才安全。
有道理,可是我不太清楚要怎么实现遍历所有 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))
收到。多谢指点!
另外,对于“#”我一直没有弄明白是怎么用的。查找手册也没找到什么。能说说吗?
多谢多谢!
#'foo
就是 (function foo)
,详情请见这个页面。
它和 (quote foo)
以及 'foo
基本上一样,唯一的差别只存在于:
- 你要编译这段代码时,
(function foo)
会将foo
编译为字节码级别的函数,而不是推迟到运行时动态地确定foo
的含义。 - 你启用了 lexical binding 以使用闭包(closure)时,
(function foo)
会将foo
视作一个闭包,而(quote foo)
不会。
另外,查找手册的方法:
M-x
, elisp-index-search
, enter
, #'
, enter
赞!多谢,我再学习一下手册。
整理了一下,加上了随机选择主题
;; 亮色主题和暗色主题
(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))
这相当于用手电筒可以控制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
查看。
为了避免 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))