Bagaimana cara mendapatkan data mentah untuk agenda mode-org tanpa tampilan agenda?


10

T: Bagaimana saya bisa org-modemengembalikan data mentah untuk tampilan agenda tanpa benar-benar membuat tampilan agenda?

Saya ingin mengakses agenda saya untuk hari yang sewenang-wenang. Namun, saya tidak ingin membuat tampilan agenda semata. Sebagai gantinya, saya ingin org-modemengumpulkan dan memilah semua elemen yang akan masuk ke tampilan agenda untuk hari itu dan mengembalikannya (idealnya dalam daftar) untuk pemeriksaan dan manipulasi lebih lanjut.

Saya menduga itu org-agenda-listakan menjadi tempat untuk memulai. Namun, fungsi itu adalah binatang kusut dan tampaknya memadukan proses pengumpulan, pemilahan, dan penayangan. Karena itu, saya kira (harapan?) Bahwa saya telah melewatkan fungsi yang relevan di suatu tempat yang menyediakan fungsionalitas yang saya cari.

Jawaban:


4

Berikut ini adalah contoh kental cara mengekstrak data yang masuk ke dalam sebuah *Org Agenda*penyangga ketika biasanya menggunakan fungsi org-agenda-list, dengan org-agenda-entry-typesseperti :deadline, :scheduled, :timestamp, sexp, :deadline*, dan :scheduled*. Rentang tanggal - begindan end- harus dalam format daftar Gregorian - misalnya '(6 1 2015),. Opsi let-bound yang dapat disesuaikan adalah org-agenda-prefix-formatdan org-agenda-entry-types. Fungsi mengembalikan hasil dalam format daftar.

(require 'calendar)
(require 'org)
(require 'org-agenda)
(require 'cl)

;; Portions of following code were extracted from:
;;   https://github.com/kiwanami/emacs-calfw written by Masashi Sakurai
;; Said code has been modified by @lawlist hereinbelow.
;;
(defun org-get-entries-fn (begin end)
"Return org schedule items between BEGIN and END.
USAGE:  (org-get-entries-fn '(6 1 2015) '(12 31 2020))"
  (unless
      (and
        (calendar-date-is-valid-p begin)
        (calendar-date-is-valid-p end))
    (let ((debug-on-quit nil))
      (signal 'quit '("One or both of your Gregorian dates are invalid."))))
  (let* (
      result
      (org-agenda-buffer nil) ;; prevent error from `org-compile-prefix-format'
      ;; The variable `org-agenda-only-exact-dates' is apparently not operational.
      (org-scheduled-past-days 0) ;; avoid duplicate entries for overdue items
      (org-agenda-prefix-format "• ")
      (org-agenda-entry-types '(:scheduled))
      (date-after
        (lambda (date num)
          "Return the date after NUM days from DATE."
          (calendar-gregorian-from-absolute
           (+ (calendar-absolute-from-gregorian date) num))))
      (enumerate-days
        (lambda (begin end)
          "Enumerate date objects between BEGIN and END."
          (when (> (calendar-absolute-from-gregorian begin)
                   (calendar-absolute-from-gregorian end))
            (error "Invalid period : %S - %S" begin end))
          (let ((d begin) ret (cont t))
            (while cont
              (push (copy-sequence d) ret)
              (setq cont (not (equal d end)))
              (setq d (funcall date-after d 1)))
            (nreverse ret)))) )
    (org-compile-prefix-format nil)
    (setq result
      (loop for date in (funcall enumerate-days begin end) append
        (loop for file in (org-agenda-files nil 'ifmode) append
          (progn
            (org-check-agenda-file file)
            (apply 'org-agenda-get-day-entries file date org-agenda-entry-types)))))
    result))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.