dotfiles/.emacs.d/functions.org
2024-02-20 15:08:25 -08:00

2.8 KiB

Custom Elisp Functions

As of now, I haven't added anything here, though I do expect to start adding some custom functions as I learn more about Elisp.

Org Roam Dailies Shortcuts

Shortcut to goto todays org-roam dailies document.

(defun jm/org-roam-goto-day (days)
  (let* ((rel-time (+ (time-convert (current-time) 'integer) (* days 86400)))
         (path (format-time-string "%Y-%m-%d.org" rel-time))
         (full-path (file-name-concat org-roam-directory "daily" path)))
    (if (file-exists-p full-path)
        (find-file full-path)
      (org-roam-dailies--capture rel-time))))

(jm/leader-keys
  "oy" '((lambda () (interactive) (jm/org-roam-goto-day -1)) :which-key "Open/create yesterday's daily notes file")
  "ot" '((lambda () (interactive) (jm/org-roam-goto-day 0)) :which-key "Open/create today's daily notes file")
  "ok" '((lambda () (interactive) (jm/org-roam-goto-day 1)) :which-key "Open/create tomorrow's daily notes file"))

Capture Template Functions

These functions are for my org roam daily capture template.

Helper Functions

(defun jm/dt-filter-tasks (helper query)
  (let ((entries (org-map-entries helper query 'agenda)))
    (mapconcat #'identity (delq nil entries) "\n")))

(defun jm/dt-format-link (prefix)
  (let ((item-name (org-entry-get nil "ITEM"))
        (item-id (org-id-get-create))
        (doc-title (org-get-title)))
    (format "%s [[id:%s][%s - %s]]" prefix item-id doc-title item-name)))

Queries

(defun jm/dt-get-priority (priority &optional prompt)
  (jm/dt-filter-tasks
   (lambda () (when (equal priority (org-entry-get nil "PRIORITY"))
                (jm/dt-format-link (or prompt "-"))))
   "TODO=\"TODO\"|TODO=\"IN PROGRESS\""))

(defun jm/dt-get-due-within (days &optional prompt)
  (let* ((time (or (org-capture-get :default-time) (current-time)))
         (date (+ (time-convert time 'integer) (* days 86400))))
    (jm/dt-filter-tasks
     (lambda () (when (member (org-get-todo-state) '("TODO" "IN PROGRESS"))
                  (jm/dt-format-link (or prompt "-"))))
     (format-time-string "DEADLINE<=\"<%Y-%m-%d>\"" date))))

(defun jm/dt-get-status (status &optional prompt)
  (jm/dt-filter-tasks (lambda () (jm/dt-format-link (or prompt "- [ ]")))
                      (concat "TODO=\"" status "\"")))

Dynamic Habits

(defun jm/dt-habit (habit)
  (let* ((org-date (or (org-capture-get :default-time) (current-time)))
         (today (downcase (format-time-string "%a" org-date))))
    (when (seq-contains-p (cdr habit) today)
      (car habit))))

(defun jm/dt-habits (habits)
  (let ((out-list '()))
    (dolist (habit habits out-list)
      (when-let (out (jm/dt-habit habit))
        (push out out-list)))
    (mapconcat #'identity out-list "\n")))