;;; org-mode.el --- org-mode customizations -*- lexical-binding: t -*- ;; Author: Andrew Scott ;; Keywords: org, convenience, tools ;; URL: https://codeberg.org/andyscott/dotfiles ;; This file is not part of GNU Emacs ;; Copyright (c) 2024 Andrew Scott ;; MIT No Attribution ;; Permission is hereby granted, free of charge, to any person obtaining a copy of this ;; software and associated documentation files (the "Software"), to deal in the Software ;; without restriction, including without limitation the rights to use, copy, modify, ;; merge, publish, distribute, sublicense, and/or sell copies of the Software, and to ;; permit persons to whom the Software is furnished to do so. ;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, ;; INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A ;; PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION ;; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ;;; Commentary: ;; My org-mode customizations. ;;; Code: (use-package org :bind (:map global-map ("C-c a" . org-agenda) ("C-c c" . org-capture) ("C-c l" . org-store-link)) :config ;; General options TODO: Comment various options more descriptively (setopt org-agenda-block-separator nil org-agenda-files (directory-files-recursively org-directory "org$") org-agenda-skip-deadline-if-done t org-agenda-skip-scheduled-if-deadline-is-shown t org-agenda-skip-scheduled-if-done t org-agenda-start-on-weekday nil org-agenda-tags-column 0 org-archive-location (concat org-directory "/archive/archive.org::* From %s") org-blank-before-new-entry '((heading . auto) (plain-list-item . auto)) org-enforce-todo-dependencies t org-fold-catch-invisible-edits 'show-and-error org-fontify-done-headline nil org-fontify-quote-and-verse-blocks t org-fontify-todo-headline t org-goto-interface 'outline-path-completion org-hide-emphasis-markers t org-insert-heading-respect-content t org-log-done 'time org-outline-path-complete-in-steps nil org-pretty-entities t org-refile-allow-creating-parent-nodes 'confirm org-refile-targets '((nil :maxlevel . 3) (org-agenda-files :maxlevel . 2)) org-refile-use-outline-path nil org-return-follows-link t org-reverse-note-order t ; Add/refile notes at the beginning of an entry org-src-preserve-indentation t org-startup-folded 'fold org-tags-column 0 org-todo-keywords '((sequence "BLOCKED(b@/!)" "IN-PROGRESS(i@/!)" "TODO(t)" "WAITING(w@/!)" "|" "DONE(d!)" "WONT-DO(n@/!)")) ;; org-todo-keyword-faces '(("TODO" . (icon-button)) ;; ("IN-PROGRESS" . (tool-bar)) ;; ("BLOCKED" . (match)) ;; ("WONT-DO" . (org-done))) org-todo-repeat-to-state "TODO") (setq org-capture-templates `( ("m" "Personal") ("mj" "Log Entry" entry (file+datetree ,(concat org-directory "/personal_log.org")) "** %?" :empty-lines 1) ("mn" "Note" entry (file+headline ,(concat org-directory "/notes.org") "Note to self...") "** %?" :empty-lines 1) ("mt" "Todo" entry (file+headline ,(concat org-directory "/inbox.org") "You can do it!") "** TODO [#B] %?\n:CREATED: %U\n " :empty-lines 1) ("p" "Projects") ("pn" "Note" entry (file+headline ,(concat org-directory "/notes.org") "Project Notes") "** %?" :empty-lines 1) ("pt" "Todo" entry (file+headline ,(concat org-directory "/inbox.org") "Project Tasks") "** TODO [#B] %?\n:CREATED: %U\n%i\n%a\nNotes: " :empty-lines 1) ("w" "Work") ("wn" "Note" entry (file+headline ,(concat org-directory "/notes.org") "Work Notes") "** %?" :empty-lines 1) ("wt" "Todo" entry (file+headline ,(concat org-directory "/inbox.org") "Work Tasks") "** TODO [#B] %?\n:CREATED: %U\n%i\n%a\nNotes: " :empty-lines 1))) ;; Headline appearance (custom-set-faces '(org-level-1 ((t (:inherit outline-1 :height 1.5)))) '(org-level-2 ((t (:inherit outline-2 :height 1.4)))) '(org-level-3 ((t (:inherit outline-3 :height 1.3)))) '(org-level-4 ((t (:inherit outline-4 :height 1.2)))) '(org-level-5 ((t (:inherit outline-5 :height 1.1))))) :hook (org-mode . org-indent-mode) :init (setopt org-directory "~/Nextcloud/Documents/org") (bind-keys :prefix-map as/org-prefix-map :prefix "C-c o" ("n" . org-metadown) ("p" . org-metaup) ("f" . org-shiftmetaright) ("b" . org-shiftmetaleft) ("v" . org-tags-view) ("C-n" . org-priority-down) ("C-p" . org-priority-up))) (use-package org-appear :config (setopt org-appear-autoentities t org-appear-autolinks t org-appear-autosubmarkers t org-appear-trigger 'on-change) :hook (org-mode . org-appear-mode)) (use-package org-modern :disabled :config (setopt org-modern-symbol "Hack") :hook (org-mode . org-modern-mode) (org-agenda-finalize . org-modern-agenda)) (use-package org-super-agenda :hook (org-agenda-mode . org-super-agenda-mode) :init (setq org-agenda-custom-commands '(("u" "Super agenda" ((agenda "" ((org-agenda-prefix-format " %?-12t %s") ;; (org-agenda-prefix-format " %-20:c%?-12t %s") (org-agenda-remove-tags t) (org-agenda-skip-function '(org-agenda-skip-entry-if 'todo '("DONE" "WONT-DO"))) (org-agenda-span 5))) (alltodo "" ((org-agenda-overriding-header "") (org-agenda-prefix-format " %?-12t %s") (org-agenda-remove-tags t) (org-super-agenda-groups '((:name "Important" :priority "A" :order 0) (:name "In-Progress" :todo "IN-PROGRESS" :order 2) (:name "Blocked" :todo "BLOCKED" :order 3) (:name "Overdue" :deadline past :scheduled past :order 1) ;; TODO: Figure out how to organize chores/personal (:name "Chores" :tag "chores" :order 19) (:name "Personal" :habit t :order 17) (:name "Research" :tag "research" :order 7) (:name "Upcoming" :deadline future :scheduled future :order 18) (:name "Project Backlog" :and (:todo "TODO" :tag "project") :order 5) (:name "General Backlog" :and (:todo "TODO" :priority "B") :order 6) (:name "Less Important" :priority<= "C" :order 20)))))))))) (use-package org-superstar :config (setopt org-indent-mode-turns-on-hiding-stars nil org-superstar-leading-bullet ?\s org-superstar-special-todo-items t) :hook (org-mode . org-superstar-mode)) (use-package org-timeblock :bind (:map as/org-prefix-map ("t" . org-timeblock)) :config (setopt org-timeblock-new-task-time 'pick org-timeblock-show-future-repeats 'next org-timeblock-scale-options (cons 7 20) org-timeblock-span 3)) (provide 'init-org) ;;; org-mode.el ends here