Skip to content
/ org-ql Public
forked from alphapapa/org-ql

An Org query language, or Prototype code for a next-generation Org Agenda

Notifications You must be signed in to change notification settings

akirak/org-ql

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 

Repository files navigation

org-agenda-ng / org-ql

This is rudimentary, experimental, proof-of-concept alternative code for generating Org agendas. It doesn’t support nearly as many features as org-agenda.el does, but it might be useful in some way. It uses some existing code from org-agenda.el and tries to be compatible with parts of it, like org-agenda-finalize-entries and org-agenda-finalize.

Here’s an example of generating a kind of agenda view for today (note that the grouping is provided by org-super-agenda, not this code:

(org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
  (and (or (date = today)
           (deadline <=)
           (scheduled <= today))
       (not (done))))

screenshot.png

Here are some other examples:

(org-agenda-ng org-agenda-files
  (and (todo "TODO" "SOMEDAY")
       (tags "computer" "Emacs")
       (category "main")))

(org-agenda-ng org-agenda-files
  (habit))

(org-agenda-ng "~/org/main.org"
  (or (habit)
      (deadline <=)
      (scheduled <= today)
      (and (todo "DONE" "CANCELLED")
           (closed = today))))

(org-agenda-ng "~/org/main.org"
  (or (habit)
      (and (or (date = today)
               (deadline <=)
               (scheduled <= today))
           (not (done)))
      (and (todo "DONE" "CANCELLED")
           (closed = today))))

org-ql

Another way to look at it is like a “query language” for Org buffers. For example:

(org-ql org-agenda-files
  (and (todo "SOMEDAY")
       (tags "Emacs")
       (priority >= "B"))) ;; => ((headline (:raw-value "org-board" :begin 1220270 :end 1220403 ...)) ...)

(org-ql "~/org/main.org"
  (and (or (tags "Emacs")
           (priority >= "B"))
       (not (done)))) ;; => (((headline (:raw-value "Now" :begin 3832 :end 3843 ...))) ...)

(org-ql "~/org/main.org"
  (and (or (tags "Emacs")
           (priority >= "B"))
       (done))
  :action-fn (lambda (element)
               (org-element-property :begin element)))  ;; => (44154 46469 56008 63965 100008 ...)

(mapcar (lambda (element)
          (org-element-property :begin element))
        (org-ql "~/org/main.org"
          (and (or (tags "Emacs")
                   (priority >= "B"))
               (done))))  ;; => (44154 46469 56008 63965 100008 ...)

Instead of opening an agenda-like buffer with matching entries, org-ql can take a function as an argument that is called at each matching entry to return a result, and finally it returns a list of the results. For example, you could return a list of positions within the buffer, or a list of headings, or headings with entry contents, etc. By default, the matching element is returned, which is the result of calling org-element-headline-parser at that entry.

About

An Org query language, or Prototype code for a next-generation Org Agenda

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Emacs Lisp 100.0%