|
@@ -5313,61 +5313,60 @@ FILE is the path to a file to be checked for entries. DATE is date like
|
|
|
the one returned by `calendar-current-date'. ARGS are symbols indicating
|
|
|
which kind of entries should be extracted. For details about these, see
|
|
|
the documentation of `org-diary'."
|
|
|
- (setq args (or args org-agenda-entry-types))
|
|
|
(let* ((org-startup-folded nil)
|
|
|
(org-startup-align-all-tables nil)
|
|
|
- (buffer (if (file-exists-p file)
|
|
|
- (org-get-agenda-file-buffer file)
|
|
|
- (error "No such file %s" file)))
|
|
|
- arg results rtn deadline-results)
|
|
|
+ (buffer (if (file-exists-p file) (org-get-agenda-file-buffer file)
|
|
|
+ (error "No such file %s" file))))
|
|
|
(if (not buffer)
|
|
|
- ;; If file does not exist, make sure an error message ends up in diary
|
|
|
+ ;; If file does not exist, signal it in diary nonetheless.
|
|
|
(list (format "ORG-AGENDA-ERROR: No such org-file %s" file))
|
|
|
(with-current-buffer buffer
|
|
|
(unless (derived-mode-p 'org-mode)
|
|
|
(error "Agenda file %s is not in `org-mode'" file))
|
|
|
(setq org-agenda-buffer (or org-agenda-buffer buffer))
|
|
|
- (let ((case-fold-search nil))
|
|
|
- (save-excursion
|
|
|
- (save-restriction
|
|
|
- (if (eq buffer org-agenda-restrict)
|
|
|
- (narrow-to-region org-agenda-restrict-begin
|
|
|
- org-agenda-restrict-end)
|
|
|
- (widen))
|
|
|
- ;; The way we repeatedly append to `results' makes it O(n^2) :-(
|
|
|
- (while (setq arg (pop args))
|
|
|
- (cond
|
|
|
- ((and (eq arg :todo)
|
|
|
- (equal date (calendar-gregorian-from-absolute
|
|
|
- (org-today))))
|
|
|
- (setq rtn (org-agenda-get-todos))
|
|
|
- (setq results (append results rtn)))
|
|
|
- ((eq arg :timestamp)
|
|
|
- (setq rtn (org-agenda-get-blocks))
|
|
|
- (setq results (append results rtn))
|
|
|
- (setq rtn (org-agenda-get-timestamps deadline-results))
|
|
|
- (setq results (append results rtn)))
|
|
|
- ((eq arg :sexp)
|
|
|
- (setq rtn (org-agenda-get-sexps))
|
|
|
- (setq results (append results rtn)))
|
|
|
- ((eq arg :scheduled)
|
|
|
- (setq rtn (org-agenda-get-scheduled deadline-results))
|
|
|
- (setq results (append results rtn)))
|
|
|
- ((eq arg :scheduled*)
|
|
|
- (setq rtn (org-agenda-get-scheduled deadline-results t))
|
|
|
- (setq results (append results rtn)))
|
|
|
- ((eq arg :closed)
|
|
|
- (setq rtn (org-agenda-get-progress))
|
|
|
- (setq results (append results rtn)))
|
|
|
- ((eq arg :deadline)
|
|
|
- (setq rtn (org-agenda-get-deadlines))
|
|
|
- (setq deadline-results (copy-sequence rtn))
|
|
|
- (setq results (append results rtn)))
|
|
|
- ((eq arg :deadline*)
|
|
|
- (setq rtn (org-agenda-get-deadlines t))
|
|
|
- (setq deadline-results (copy-sequence rtn))
|
|
|
- (setq results (append results rtn))))))))
|
|
|
- results))))
|
|
|
+ (save-excursion
|
|
|
+ (save-restriction
|
|
|
+ (if (eq buffer org-agenda-restrict)
|
|
|
+ (narrow-to-region org-agenda-restrict-begin
|
|
|
+ org-agenda-restrict-end)
|
|
|
+ (widen))
|
|
|
+ ;; Rationalize ARGS. Also make sure `:deadline' comes
|
|
|
+ ;; first in order to populate DEADLINES before passing it.
|
|
|
+ ;;
|
|
|
+ ;; We use `delq' since `org-uniquify' duplicates ARGS,
|
|
|
+ ;; guarding us from modifying `org-agenda-entry-types'.
|
|
|
+ (setf args (org-uniquify (or args org-agenda-entry-types)))
|
|
|
+ (when (and (memq :scheduled args) (memq :scheduled* args))
|
|
|
+ (setf args (delq :scheduled* args)))
|
|
|
+ (cond
|
|
|
+ ((memq :deadline args)
|
|
|
+ (setf args (cons :deadline
|
|
|
+ (delq :deadline (delq :deadline* args)))))
|
|
|
+ ((memq :deadline* args)
|
|
|
+ (setf args (cons :deadline* (delq :deadline* args)))))
|
|
|
+ ;; Collect list of headlines. Return them flattened.
|
|
|
+ (let ((case-fold-search nil) results deadlines)
|
|
|
+ (dolist (arg args (apply #'nconc (nreverse results)))
|
|
|
+ (pcase arg
|
|
|
+ ((and :todo (guard (org-agenda-today-p date)))
|
|
|
+ (push (org-agenda-get-todos) results))
|
|
|
+ (:timestamp
|
|
|
+ (push (org-agenda-get-blocks) results)
|
|
|
+ (push (org-agenda-get-timestamps deadlines) results))
|
|
|
+ (:sexp
|
|
|
+ (push (org-agenda-get-sexps) results))
|
|
|
+ (:scheduled
|
|
|
+ (push (org-agenda-get-scheduled deadlines) results))
|
|
|
+ (:scheduled*
|
|
|
+ (push (org-agenda-get-scheduled deadlines t) results))
|
|
|
+ (:closed
|
|
|
+ (push (org-agenda-get-progress) results))
|
|
|
+ (:deadline
|
|
|
+ (setf deadlines (org-agenda-get-deadlines))
|
|
|
+ (push deadlines results))
|
|
|
+ (:deadline*
|
|
|
+ (setf deadlines (org-agenda-get-deadlines t))
|
|
|
+ (push deadlines results)))))))))))
|
|
|
|
|
|
(defsubst org-em (x y list)
|
|
|
"Is X or Y a member of LIST?"
|