2015-05-09 63 views

回答

2

答案要求用户设置一个预定义假期的日历,就像这个例子。我已经包含了5月9日的测试假期 - 如果用户希望在除5月9日以外的任何一天测试此功能,用户可能希望将任意测试假期更改为测试执行的任何一天 - 在功能测试完成后,测试条目可以被删除。

有关如何格式化假期的示例,请参阅库holidays.el中变量calendar-holidays的文档字符串 - 例如holiday-fixed; holiday-float; holiday-sexp; (lunar-phases); (solar-equinoxes-solstices); holiday-hebrew; holiday-islamic; holiday-bahai; holiday-julian; holiday-chinese;等等

你怎么可以试用这个例子?:将代码块/复制/粘贴到您的*scratch*缓冲区;并输入M-x eval-buffer RET;然后键入M-x is-holiday RET。这是一个功能齐全的工作草案。如果您在尝试之后决定不喜欢它,只需重新启动Emacs,在尝试之前您会回到您的位置。

已执行的测试是在Emacs的最新公开版本中完成的:2014-10-20在构建器10上的GNU Emacs 24.4.1(x86_64-apple-darwin10.8.0,NSapple-appkit-1038.36) -6.porkrind.org

(require 'holidays) 

(defcustom my-custom-holiday-list (mapcar 'purecopy '(
    (holiday-fixed 1 1 "New Year's Day") 
    (holiday-float 1 1 3 "Martin Luther King Day") 
    (holiday-float 2 1 3 "President's Day") 
    (holiday-float 5 1 -1 "Memorial Day") 
    ;; ARBITRARY TEST HOLIDAY -- MAY 9 
    (holiday-fixed 5 9 "Arbitrary Test Holiday -- May 9") 
    (holiday-fixed 7 4 "Independence Day") 
    (holiday-float 9 1 1 "Labor Day") 
    (holiday-float 10 1 2 "Columbus Day") 
    (holiday-fixed 11 11 "Veteran's Day") 
    (holiday-float 11 4 4 "Thanksgiving") 
    (holiday-fixed 12 25 "Christmas") 
    (solar-equinoxes-solstices) 
    (holiday-sexp calendar-daylight-savings-starts 
    (format "Daylight Saving Time Begins %s" 
     (solar-time-string 
     (/ calendar-daylight-savings-starts-time (float 60)) 
     calendar-standard-time-zone-name))) 
    (holiday-sexp calendar-daylight-savings-ends 
     (format "Daylight Saving Time Ends %s" 
     (solar-time-string 
     (/ calendar-daylight-savings-ends-time (float 60)) 
     calendar-daylight-time-zone-name))))) 
    "Custom holidays defined by the user." 
    :type 'sexp 
    :group 'holidays) 

(defun is-holiday() 
    "Is today a holiday?" 
(interactive) 
    (let* (
     (d1 (time-to-days (current-time))) 
     (date (calendar-gregorian-from-absolute d1)) 
     ee 
     res-holidays 
     (displayed-month (nth 0 date)) 
     (displayed-year (nth 2 date)) 
     (holiday-list 
     (dolist (p my-custom-holiday-list res-holidays) 
      (let* (h) 
      (when (setq h (eval p)) 
      (setq res-holidays (append h res-holidays))))))) 
    (mapcar 
     (lambda (x) 
     (let ((txt (format "%s -- %s" (car x) (car (cdr x))))) 
      (when (eq d1 (calendar-absolute-from-gregorian (car x))) 
      (push txt ee)))) 
     holiday-list) 
    (if ee 
     (message "The following holiday(s) is/are today: %s" (nreverse ee)) 
     (message "Today is not a holiday."))))