|
@@ -14425,34 +14425,39 @@ D may be an absolute day number, or a calendar-type list (month day year)."
|
|
(let ((hl (calendar-check-holidays org-agenda-current-date)))
|
|
(let ((hl (calendar-check-holidays org-agenda-current-date)))
|
|
(and hl (mapconcat #'identity hl "; "))))
|
|
(and hl (mapconcat #'identity hl "; "))))
|
|
|
|
|
|
|
|
+(defvar org--diary-sexp-entry-cache (make-hash-table :test #'equal)
|
|
|
|
+ "Hash table holding return values of `org-diary-sexp-entry'.")
|
|
(defun org-diary-sexp-entry (sexp entry d)
|
|
(defun org-diary-sexp-entry (sexp entry d)
|
|
"Process a SEXP diary ENTRY for date D."
|
|
"Process a SEXP diary ENTRY for date D."
|
|
(require 'diary-lib)
|
|
(require 'diary-lib)
|
|
;; `org-anniversary' and alike expect ENTRY and DATE to be bound
|
|
;; `org-anniversary' and alike expect ENTRY and DATE to be bound
|
|
;; dynamically.
|
|
;; dynamically.
|
|
- (let* ((sexp `(let ((entry ,entry)
|
|
|
|
- (date ',d))
|
|
|
|
- ,(car (read-from-string sexp))))
|
|
|
|
- ;; FIXME: Do not use (eval ... t) in the following sexp as
|
|
|
|
- ;; diary vars are still using dynamic scope.
|
|
|
|
- (result (if calendar-debug-sexp (eval sexp)
|
|
|
|
- (condition-case nil
|
|
|
|
- (eval sexp)
|
|
|
|
- (error
|
|
|
|
- (beep)
|
|
|
|
- (message "Bad sexp at line %d in %s: %s"
|
|
|
|
- (org-current-line)
|
|
|
|
- (buffer-file-name) sexp)
|
|
|
|
- (sleep-for 2))))))
|
|
|
|
- (cond ((stringp result) (split-string result "; "))
|
|
|
|
- ((and (consp result)
|
|
|
|
- (not (consp (cdr result)))
|
|
|
|
- (stringp (cdr result)))
|
|
|
|
- (cdr result))
|
|
|
|
- ((and (consp result)
|
|
|
|
- (stringp (car result)))
|
|
|
|
- result)
|
|
|
|
- (result entry))))
|
|
|
|
|
|
+ (or (gethash (list sexp entry d) org--diary-sexp-entry-cache)
|
|
|
|
+ (puthash (list sexp entry d)
|
|
|
|
+ (let* ((sexp `(let ((entry ,entry)
|
|
|
|
+ (date ',d))
|
|
|
|
+ ,(car (read-from-string sexp))))
|
|
|
|
+ ;; FIXME: Do not use (eval ... t) in the following sexp as
|
|
|
|
+ ;; diary vars are still using dynamic scope.
|
|
|
|
+ (result (if calendar-debug-sexp (eval sexp)
|
|
|
|
+ (condition-case nil
|
|
|
|
+ (eval sexp)
|
|
|
|
+ (error
|
|
|
|
+ (beep)
|
|
|
|
+ (message "Bad sexp at line %d in %s: %s"
|
|
|
|
+ (org-current-line)
|
|
|
|
+ (buffer-file-name) sexp)
|
|
|
|
+ (sleep-for 2))))))
|
|
|
|
+ (cond ((stringp result) (split-string result "; "))
|
|
|
|
+ ((and (consp result)
|
|
|
|
+ (not (consp (cdr result)))
|
|
|
|
+ (stringp (cdr result)))
|
|
|
|
+ (cdr result))
|
|
|
|
+ ((and (consp result)
|
|
|
|
+ (stringp (car result)))
|
|
|
|
+ result)
|
|
|
|
+ (result entry)))
|
|
|
|
+ org--diary-sexp-entry-cache)))
|
|
|
|
|
|
(defun org-diary-to-ical-string (frombuf)
|
|
(defun org-diary-to-ical-string (frombuf)
|
|
"Get iCalendar entries from diary entries in buffer FROMBUF.
|
|
"Get iCalendar entries from diary entries in buffer FROMBUF.
|