You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

修复要点

  1. 提取通用切换逻辑到onoff函数,明确参数定义(先关闭的主题、后启用的主题)
  2. 在run-at-time调用中,依次传入函数引用#'onoff和对应的参数,定时器触发时会自动把这些参数传递给onoff执行
  3. 保持load-theme的调用逻辑,确保两个主题都被预先加载(t t参数表示静默加载并启用,后续通过enable/disable-theme切换)

内容的提问来源于stack exchange,提问作者Peter Zimmermann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:05:20