dotfiles/.emacs.d/functions.org
2024-01-23 21:30:45 -08:00

85 lines
3.1 KiB
Org Mode

#+TITLE: 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.
#+begin_src emacs-lisp
(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"))
#+end_src
* Capture Template Functions
These functions are for my org roam daily capture template.
** Helper Functions
#+begin_src emacs-lisp
(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-entry-get nil "ID"))
(doc-id (car (org-property-values "ID")))
(doc-title (org-get-title)))
(cond ((stringp item-id)
(format "%s [[id:%s][%s]]" prefix item-id item-name))
((and (stringp doc-id) (stringp doc-title))
(format "%s [[id:%s][%s - %s]]" prefix doc-id doc-title item-name))
(nil (error "jm/dt-format-link: couldn't find a valid id")))))
#+end_src
** Queries
#+begin_src emacs-lisp
(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 "\"")))
#+end_src
** Dynamic Habits
#+begin_src emacs-lisp
(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")))
#+end_src