* Org Enable/disable certain ~org~ mode functionalities: #+begin_src elisp (defconst jm/cloud-root "~/Nextcloud") (defconst jm/notes-directory (expand-file-name "org" jm/cloud-root)) (defun jm/org-mode-setup () (org-indent-mode) (flyspell-mode) (variable-pitch-mode 1) (visual-line-mode 1) (add-to-list 'org-link-frame-setup '(file . find-file))) #+end_src Setup ~org~ mode: #+begin_src elisp (use-package org :hook ((org-mode . jm/org-mode-setup) (org-agenda-mode . jm/org-roam-refresh-agenda-list)) :config (setq jm/inbox-file (expand-file-name "inbox.org" jm/notes-directory) org-ellipsis " ▾" org-pretty-entities t org-hide-emphasis-markers t org-src-preserve-indentation t ;; Default export configuration org-export-with-toc nil org-export-with-section-numbers nil org-export-with-sub-superscripts nil org-latex-src-block-backend 'listings org-format-latex-options (plist-put org-format-latex-options :scale 1.3) ;; Org agenda timestamp formatting org-display-custom-times t org-time-stamp-custom-formats '("%m-%d-%y %a" . "%m-%d-%y %a %I:%M %p") ;; Capture templates org-capture-templates '(("i" "Inbox" entry (file jm/inbox-file) "* TODO %^{Task}\nDEADLINE: %^t SCHEDULED: %^t"))) (jm/leader-keys "oa" '(org-agenda :which-key "Org agenda") "oc" '(org-capture :which-key "Org capture") "oi" '((lambda () (interactive) (find-file jm/inbox-file)) :which-key "Open inbox file"))) #+end_src * Cosmetics ** Org-Modern Org-Modern is a package that adds several features to emacs to make it look more /modern/. #+begin_src elisp (use-package org-modern :after org :hook ((org-mode . org-modern-mode) (org-agenda-finalize . org-modern-agenda)) :config (setq org-modern-star 'replace org-modern-replace-stars '("◉" "○" "●" "○" "●" "○" "●"))) #+end_src ** Font Changes Org-faces changes the font size of the headings to make them bigger in the org file. Though this code also changes the font to a variable-pitch font. To make it so that only fixed-pitch fonts are used in things like code blocks, *set-face-attribute* is used below. #+begin_src elisp (with-eval-after-load 'org-faces ;; Set faces for heading size levels (dolist (face '((org-level-1 . 1.2) (org-level-2 . 1.1) (org-level-3 . 1.05) (org-level-4 . 1.0) (org-level-5 . 1.0) (org-level-6 . 1.0) (org-level-7 . 1.0) (org-level-8 . 1.0))) (set-face-attribute (car face) nil :font "Maple Mono" :height (cdr face))) ;; Ensure that anything that should be fixed-pitch in Org files appears that way (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch) (set-face-attribute 'org-table nil :inherit 'fixed-pitch) (set-face-attribute 'org-formula nil :inherit 'fixed-pitch) (set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch)) (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch)) (set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch) (set-face-attribute 'line-number nil :inherit 'fixed-pitch) (set-face-attribute 'line-number-current-line nil :inherit 'fixed-pitch)) #+end_src * Todo Items ** Custom States Adds custom states to tasks such as ~IN PROGRESS~, ~CANCELLED~, etc. I've also added some changes to the color of the todo items based on the status. For example, turning the task face orange if it is /in progress/. #+begin_src emacs-lisp (setq org-todo-keyword-faces '(("IN PROGRESS" . (:foreground "orange" :weight bold)) ("WAITING" . (:foreground "yellow" :weight bold)))) (setq org-modern-todo-faces '(("IN PROGRESS" . (:background "orange" :foreground "black" :weight bold)) ("WAITING" . (:background "yellow" :foreground "black" :weight bold)))) (setq org-todo-keywords '((sequence "TODO(t)" "IN PROGRESS(i)" "WAITING(w)" "|" "DONE(d)" "CANCELLED(c)" "FAILED(f)"))) (setq org-clock-in-switch-to-state "IN PROGRESS") #+end_src ** Refresh Checkboxes Adds a hook to repeated tasks in org agenda that, when repeated, checkboxes will be reset to an unchecked state. #+begin_src emacs-lisp (add-hook 'org-todo-repeat-hook #'org-reset-checkbox-state-subtree) #+end_src ** Automatic UUIDs #+begin_src emacs-lisp (add-hook 'org-after-todo-state-change-hook (lambda () (when (org-get-todo-state) (org-id-get-create)))) #+end_src ** Org Agenda Org mode by default contains an /agenda/ system which is like a basic calendar that allows you to schedule todo items from org documents. All of the todo items from each org document are stored in a central area to allow for a formation of an /agenda/. #+begin_src emacs-lisp (setq org-agenda-start-with-log-mode t) (setq org-log-done 'time) (setq org-log-into-drawer t) (setq org-priority-default ?D) (setq org-priority-lowest ?D) #+end_src * Org Roam Org-roam is a plain-text knowledge management system. It brings some of Roam's more powerful features into the Org-mode ecosystem such as org-file linking, etc. Below is the main config for org-roam. #+begin_src emacs-lisp (use-package org-roam :init (require 'org-roam-dailies) :custom (org-roam-directory jm/notes-directory) (org-roam-node-display-template "${title:60} ${file-title}") :bind (("C-c n l" . org-roam-buffer-toggle) ("C-c n f" . jm/org-roam-find) ("C-c n d" . jm/org-roam-dailies-find) ("C-c n i" . org-roam-node-insert) ("C-c n c" . org-roam-capture) ("C-c n o" . org-id-get-create) ("C-c n y" . org-roam-dailies-capture-yesterday) ("C-c n t" . org-roam-dailies-capture-today) ("C-c n k" . org-roam-dailies-capture-tomorrow) ("C-c n r" . jm/org-roam-refresh-agenda-list)) :config ;; Config for org-roam capture templates. (setq jm/org-roam-templates-directory (expand-file-name "templates" org-roam-directory) org-roam-capture-templates `(("d" "Default" plain "%?" :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n") :unnarrowed t) ("p" "Project" plain (file ,(expand-file-name "project.org" jm/org-roam-templates-directory)) :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n") :unnarrowed t) ("y" "12 Week Year" plain (file ,(expand-file-name "12-week-year.org" jm/org-roam-templates-directory)) :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n") :unnarrowed t))) (setq org-roam-dailies-capture-templates `(("d" "Default" entry "* %?" :target (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n")) ("r" "Reflection" entry (file ,(expand-file-name "reflection.org" jm/org-roam-templates-directory)) :target (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n") :unnarrowed t) ("S" "Weekly Scorecard" entry (file ,(expand-file-name "weekly-scorecard.org" jm/org-roam-templates-directory)) :target (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n") :unnarrowed t) ("s" "Daily Scorecard" entry (file ,(expand-file-name "daily-scorecard.org" jm/org-roam-templates-directory)) :target (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n") :unnarrowed t) ("t" "Todos" entry (file ,(expand-file-name "daily.org" jm/org-roam-templates-directory)) :target (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n") :unnarrowed t))) ;; Create org roam directory and templates directory if not found. (unless (file-directory-p org-roam-directory) (make-directory org-roam-directory)) (unless (file-directory-p jm/org-roam-templates-directory) (make-directory jm/org-roam-templates-directory)) (org-roam-db-autosync-mode)) #+end_src ** Consult Integration Consult Org Roam is a package that integrates searching from consult with ~org-roam~ which adds functionality such as full text searches over notes. #+begin_src emacs-lisp (use-package consult-org-roam :after org-roam :bind (("C-c n s" . consult-org-roam-search)) :init (consult-org-roam-mode 1)) #+end_src * Other Packages ** Evil Org By default, many of the org specific keybindings do not feel intuitive when using evil mode. ~evil-org~ is a package that attempts to fix this by rebinding many of the default org keybindings to work better with Evil mode. #+begin_src emacs-lisp (use-package evil-org :after org :hook (org-mode . (lambda () evil-org-mode)) :config (require 'evil-org-agenda) (evil-org-agenda-set-keys)) #+end_src ** Fix Snippets This is required as of org 9.2 as snippets such as ~