如何定义并持久化Emacs Calc中的美国联邦节假日?
配置Emacs Calc美国联邦节假日规则并持久化
一、可行性与规则定义方法
- 完全可行,Emacs Calc支持通过规则表达式定义动态节假日,无需每年手动更新具体日期。
- 核心函数说明:
newweek N D M Y:返回年份Y中月份M的第N个周几D对应的日期。参数规则:- N:正数表示第N个目标周几,负数表示倒数第|N|个(例如
-1代表最后一个) - D:周几编号,0=周日,1=周一,4=周四,6=周六
- M:月份(1-12)
- Y:年份变量,用
var-y表示当前计算的年份
- N:正数表示第N个目标周几,负数表示倒数第|N|个(例如
date M D Y:返回给定日期(年Y、月M、日D)对应的周几编号(0-6),用于判断调休逻辑
- 美国联邦节假日规则表达式:
- 马丁路德金纪念日:
newweek(3,1,1,var-y)(1月第3个周一) - 华盛顿诞辰:
newweek(3,1,2,var-y)(2月第3个周一) - 阵亡将士纪念日:
newweek(-1,1,5,var-y)(5月最后一个周一) - 劳动节:
newweek(1,1,9,var-y)(9月第1个周一) - 哥伦布日:
newweek(2,1,10,var-y)(10月第2个周一) - 感恩节:
newweek(4,4,11,var-y)(11月第4个周四) - 元旦、独立日需结合调休规则定义
- 马丁路德金纪念日:
- 文档位置:打开Calc后按
?进入帮助搜索newweek或date;也可通过C-h i打开Info手册,导航到Calc > Date and Time Functions章节查看详细说明。
二、持久化配置到~/.emacs
直接在~/.emacs或~/.emacs.d/init.el中定义var-Holidays变量即可,无需使用m m命令(该命令用于保存Calc会话状态,而非全局配置)。为确保配置在Calc加载后生效,用eval-after-load包裹:
(eval-after-load 'calc '(setq var-Holidays '(vec (var sat var-sat) (var sun var-sun) ;; 元旦:原日期 + 周六/周日补休下周一 (calcFunc-date (var y var-y) 1 1) (if (or (= (calcFunc-date (var y var-y) 1 1) 6) (= (calcFunc-date (var y var-y) 1 1) 0)) (calcFunc-date (var y var-y) 1 (if (= (calcFunc-date (var y var-y) 1 1) 6) 3 2)) 0) ;; 马丁路德金纪念日(1月第3个周一) (calcFunc-newweek 3 1 1 (var y var-y)) ;; 华盛顿诞辰(2月第3个周一) (calcFunc-newweek 3 1 2 (var y var-y)) ;; 阵亡将士纪念日(5月最后一个周一) (calcFunc-newweek -1 1 5 (var y var-y)) ;; 独立日:原日期 + 周六/周日补休下周一 (calcFunc-date (var y var-y) 7 4) (if (or (= (calcFunc-date (var y var-y) 7 4) 6) (= (calcFunc-date (var y var-y) 7 4) 0)) (calcFunc-date (var y var-y) 7 (if (= (calcFunc-date (var y var-y) 7 4) 6) 6 5)) 0) ;; 劳动节(9月第1个周一) (calcFunc-newweek 1 1 9 (var y var-y)) ;; 哥伦布日(10月第2个周一) (calcFunc-newweek 2 1 10 (var y var-y)) ;; 退伍军人节(11月11日) (calcFunc-date (var y var-y) 11 11) ;; 感恩节(11月第4个周四) (calcFunc-newweek 4 4 11 (var y var-y)) ;; 圣诞节(12月25日) (calcFunc-date (var y var-y) 12 25))))
三、验证配置
重启Emacs后,打开Calc执行以下命令验证效果:
- 测试独立日调休:
calc-eval "badd(<Fri Jul 1, 2022>,1)"应返回<Tue Jul 5, 2022>(跳过周一的7月4日) - 测试元旦调休:
calc-eval "badd(<Fri Dec 31, 2021>,1)"应返回<Mon Jan 3, 2022>(跳过周六的1月1日和补休的周一1月3日) - 测试感恩节规则:
calc-eval "date(newweek(4,4,11,2023))"应返回4(对应周四,日期为<Thu Nov 23, 2023>)
内容的提问来源于stack exchange,提问作者Siegfried
相关产品推荐
相关产品推荐

