The Complete Computing Environment

Dynamic and fast agenda

(provide 'cce/dynamic-fast-agenda)


This is a clever use of the org-roam APIs and database to automatically populate the Org-mode Agendas file list, and has some really neat ideas which I'll integrate in to the CCE I think. I have been thinking that my Projects file isn't scaling so well since I can't represent project hierarchies or relationships very cleanly in the limited hierarchy I've limited myself to. This will have to be part of larger thinking, but I can implement most of this right now.

Without migrating out of Projects, I have (length org-agenda-files) {{{results(22)}}} files which are Project and Agendize tagged. I also want to integrate my Journal in to this to capture the carryover tasks and probably leave me embarrassed. Can't wait!

org-element search and update

I might turn this off.

There is some really sharp code in here to use the Org Element API to search for TODO headlines and add a Project tag to the ROAM_TAGS org-roam metadata keyword:

(defun +org-notes-project-p ()
  "Return non-nil if current buffer has any todo entry.

TODO entries marked as done are ignored, meaning the this
function returns nil if current buffer contains only completed
   (lambda (type)
     (eq type 'todo))
       (org-element-parse-buffer 'headline)
     (lambda (h)
       (org-element-property :todo-type h)))))

(add-hook 'before-save-hook #'+org-notes-project-update-tag)

(defun +org-notes-project-update-tag ()
  "Update PROJECT tag in the current buffer."
    (goto-char (point-min))
    (when (and (not (active-minibuffer-window))
      (if (+org-notes-project-p)
          (org-roam-tag-add '("Project"))
        (org-roam-tag-remove '("Project"))))))

(defun +org-notes-buffer-p ()
  "Return non-nil if the currently visited buffer is a note."
  (and buffer-file-name
        (expand-file-name (file-name-as-directory org-roam-directory))
        (file-name-directory buffer-file-name))))

DONE Evaluate turning this off.

I'm not sure I want this on by default, but it seems nice and great to have documented lying around.

org-agenda-list updating

a query against the org-roam tags table is unfortunately un-normalized. I want to add Agendize roam tag to it as well, and since it's non-normal and I think unsorted in the DB i need to be careful about it. Finally, remove files tagged Icebox. it basically works though:

(defun cce/org-roam-files-with-tags (&optional tags)
  "Return a list of note files containing Project tag."
  (let ((tags (or tags '("Project" "Agendize"))))
    (->> (org-roam-db-query
          [:select file :from nodes
                   :join tags :on (= node_id id)
                   :where (in tag $v1)]
          (apply #'vector tags)) 
         (-map #'car))))

and an advice function to update the DB before showing the agenda:

(defun cce/agenda-files-update (&rest _)
  "Update the value of `org-agenda-files'."
  (setq org-agenda-files (cce/org-roam-files-with-tags)))

(advice-add 'org-agenda :before #'cce/agenda-files-update)


DONE extend this to include Journal tasks! Programming CCE