#+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 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 "op" '((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") "on" '((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 (or (org-entry-get nil "ID") (car (org-property-values "ID"))))) (when (stringp item-id) (format "%s [[id:%s][%s]]" prefix item-id item-name)))) #+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