Emacs Lisp定时切换主题报错:参数数量不符问题解决
Emacs定时切换主题报错修复
问题场景
尝试用Emacs Lisp配置定时切换主题,代码执行后*Messages*缓冲区能看到Theme Loaded输出,但主题并未切换,同时触发两次错误:
Error running timer: (wrong-number-of-arguments (lambda (light dark) (disable-theme dark) (enable-theme light)) 0) [2 times]
出错的原代码:
;; theme (defun set-theme-time () (let ((light 'modus-operandi) (dark 'modus-vivendi)) (load-theme light t t) (load-theme dark t t) (run-at-time "8:00" nil (lambda (light dark) (disable-theme dark) (enable-theme light))) (run-at-time "17:00" nil (lambda (light dark) (disable-theme light) (enable-theme dark))) (message "Theme Loaded"))) (set-theme-time)
错误原因
报错核心是参数不匹配:你定义的匿名lambda需要接收light和dark两个参数,但run-at-time在触发定时器时,默认不会传递任何参数给目标函数,导致lambda因缺少参数而报错。
修复方案
把主题切换逻辑抽成独立函数,在run-at-time中直接传递函数引用和所需参数,确保定时器触发时能正确获取参数执行。
修复后的可运行代码:
;; theme (defun onoff (theme1 theme2) (disable-theme theme1) (enable-theme theme2)) (defun set-theme-time () (let ((light 'modus-operandi) (dark 'modus-vivendi)) (load-theme light t t) (load-theme dark t t) (run-at-time "8:00" nil #'onoff dark light) (run-at-time "17:00" nil #'onoff light dark) (message "Theme Loaded"))) (set-theme-time)
修复要点
- 提取通用切换逻辑到
onoff函数,明确参数定义(先关闭的主题、后启用的主题) - 在
run-at-time调用中,依次传入函数引用#'onoff和对应的参数,定时器触发时会自动把这些参数传递给onoff执行 - 保持
load-theme的调用逻辑,确保两个主题都被预先加载(t t参数表示静默加载并启用,后续通过enable/disable-theme切换)
内容的提问来源于stack exchange,提问作者Peter Zimmermann
相关产品推荐
相关产品推荐

