From 4c7d49194db5c06db4eed5acaa2f0aaa24418943 Mon Sep 17 00:00:00 2001 From: rearman Date: Fri, 20 Feb 2026 12:44:27 -0500 Subject: [PATCH] Major change to org setup Using a slightly modified version of the org-gtd setup found at https://github.com/rougier/emacs-gtd. Greatly simplifies the whole org-mode process, which I think will be better suited to my use case. --- re/re-org-defuns.el | 11 ++- re/re-org.el | 185 ++++++++++++++++++++++++++++---------------- 2 files changed, 128 insertions(+), 68 deletions(-) diff --git a/re/re-org-defuns.el b/re/re-org-defuns.el index 12e49c6..44be3b3 100644 --- a/re/re-org-defuns.el +++ b/re/re-org-defuns.el @@ -6,7 +6,7 @@ (defun re/org-agenda-show-custom (&optional arg) "Show my custom agenda." (interactive "P") - (org-agenda arg " ")) + (org-agenda arg "g")) (defun re/org-show-agenda (&optional arg) "Show the main agenda" @@ -34,5 +34,14 @@ (org-clock-in) (org-clock-out))) +(defun re/org-save-all () + "Save all `org-agenda-files' without user confirmation." + (interactive) + (message "Saving all org-agenda-files buffers...") + (save-some-buffers t + (lambda () + (when (member (buffer-file-name) org-agenda-files) t))) + (message "Saving all org-agenda-files buffers... done")) + (provide 're-org-defuns) ;;; re-org-defuns.el ends here diff --git a/re/re-org.el b/re/re-org.el index e2cd518..daf61c1 100644 --- a/re/re-org.el +++ b/re/re-org.el @@ -7,6 +7,7 @@ (setq org-startup-indented t org-startup-with-inline-images t + org-startup-folded 'content org-cycle-inline-images-display t org-M-RET-may-split-line nil org-table-export-default-format "orgtbl-to-csv" @@ -33,45 +34,79 @@ '((file . find-file))) (setq org-directory "~/org" - org-agenda-files '("~/org") - org-default-notes-file "~/org/refile.org" - org-journal-file "~/org/journal.org") + org-agenda-files (mapcar 'file-truename (file-expand-wildcards "~/org/*.org")) + ;; org-default-notes-file "~/org/refile.org" + ;; org-journal-file "~/org/journal.org" + ) (setq org-refile-targets '((nil :maxlevel . 9) (org-agenda-files :maxlevel . 9)) org-refile-use-outline-path 'file org-refile-allow-creating-parent-nodes 'confirm) -(setq org-todo-keywords '((sequence "TODO(t)" - "WAITING(w@/!)" - "IN-PROGRESS(i!)" - "ORDERED(o!)" - "QUOTED(q!)" - "|" - "RECEIVED(r!/@)" - "DELEGATED(l@)" - "DONE(d!/@)" - "CANCELLED(c@)"))) - -(setq org-tag-alist '((:startgroup . nil) - ("licenses" . ?l) - ("need" . ?n) - ("standard" . ?s) - ("wisdom" . ?w) - (:endgroup . nil))) +(setq org-todo-keywords + '((sequence "TODO(t)" "NEXT(n)" "HOLD(h)" "|" "DONE(d)"))) + +(defun log-todo-next-creation-date (&rest ignore) + "Log NEXT creation time in the property drawer under the key 'ACTIVATED'" + (when (and (string= (org-get-todo-state) "NEXT") + (not (org-entry-get nil "ACTIVATED"))) + (org-entry-put nil "ACTIVATED" (format-time-string "[%Y-%m-%d]")))) + +(add-hook 'org-after-todo-state-change-hook #'log-todo-next-creation-date) + +;; (setq org-todo-keywords '((sequence "TODO(t)" +;; "WAITING(w@/!)" +;; "IN-PROGRESS(i!)" +;; "ORDERED(o!)" +;; "QUOTED(q!)" +;; "|" +;; "RECEIVED(r!/@)" +;; "DELEGATED(l@)" +;; "DONE(d!/@)" +;; "CANCELLED(c@)"))) + +;; (setq org-tag-alist '((:startgroup . nil) +;; ("licenses" . ?l) +;; ("need" . ?n) +;; ("standard" . ?s) +;; ("wisdom" . ?w) +;; (:endgroup . nil))) (setq org-agenda-restore-windows-after-quit t org-agenda-start-on-weekday 0 - org-agenda-span 14 + org-agenda-span 10 org-deadline-warning-days 30 org-agenda-window-setup 'current-window - org-agenda-remove-tags t - org-agenda-prefix-format '((agenda . " %:c %b %?-12t% s") - (todo . " %:c % b") - (tags . " %:c % b") - (search . " %:c % b"))) + org-agenda-remove-tags t) +;; org-agenda-prefix-format '((agenda . " %:c %b %?-12t% s") +;; (todo . " %:c % b") +;; (tags . " %:c % b") +;; (search . " %:c % b"))) (setq org-agenda-custom-commands - '((" " "Agenda" + '(("g" "Get Things Done (GTD)" + ((agenda "" + ((org-agenda-skip-function + '(org-agenda-skip-entry-if 'deadline)) + (org-deadline-warning-days 0))) + (todo "NEXT" + ((org-agenda-skip-function + '(org-agenda-skip-entry-if 'deadline)) + (org-agenda-prefix-format " %i %-12:c [%e] ") + (org-agenda-overriding-header "\nTasks\n"))) + (agenda nil + ((org-agenda-entry-types '(:deadline)) + (org-agenda-format-date "") + (org-deadline-warning-days 7) + (org-agenda-skip-function + '(org-agenda-skip-entry-if 'notregexp "\\* NEXT")) + (org-agenda-overriding-header "\nDeadlines"))) + (tags-todo "inbox" + ((org-agenda-prefix-format " %?-12t% s") + (org-agenda-overriding-header "\nInbox\n"))) + (tags "CLOSED>=\"\"" + ((org-agenda-overriding-header "\nCompleted today\n"))))) + (" " "Agenda" ((tags "need" ((org-agenda-overriding-header "Needed Items"))) (tags-todo "-REFILE+TODO=\"IN-PROGRESS\"" @@ -88,51 +123,67 @@ (setq org-columns-default-format "%50ITEM(Task) %10CLOCKSUM %16TIMESTAMP_IA" org-agenda-start-with-log-mode t) -(setq org-capture-templates '(("n" - "Note" - entry - (file org-default-notes-file) - "* %?\n%T") - ("t" - "TODO" - entry - (file org-default-notes-file) - "* TODO %?\n%t\n") - ("f" - "TODO in Future" - entry - (file org-default-notes-file) - "* TODO %?\nSCHEDULED: %^t\n") - ("d" - "TODO with Deadline" - entry - (file org-default-notes-file) - "* TODO %?\nDEADLINE: %^t\n") - ("l" - "Purchase Licenses" - entry - (file org-default-notes-file) - "* TODO Get Licenses :licenses:\nDEADLINE: %^t\n- [ ] HMI\n- [ ] IO Server\n") - ("m" - "Meeting" - entry - (file+olp+datetree org-journal-file) - "* %? :meeting:\n%^T\n** Notes\n** Action Items") - ("s" - "Semi-Weekly PLC Meeting" - entry - (file+olp+datetree org-journal-file) - "* Semi-Weekly PLC Meeting :plc:semiweekly:meeting:%^g \n%t\n** ITEM1") - ("j" - "Journal" - entry - (file+olp+datetree org-journal-file) - "* %?\n%T\n"))) +(setq org-capture-templates + `(("i" "Inbox" entry (file "inbox.org") + ,(concat "* TODO %?\n" + "/Entered on/ %U")) + ("m" "Meeting" entry (file+headline "agenda.org" "Future") + ,(concat "* %? :meeting:\n" + "<%<%Y-%m-%d %a %H:00>>")) + ("n" "Note" entry (file "notes.org") + ,(concat "* Note (%a)\n" + "/Entered on/ %U\n" "\n" "%?")) + ("@" "Inbox [mu4e]" entry (file "inbox.org") + ,(concat "* TODO Reply to \"%a\" %?\n" + "/Entered on/ %U")))) + +;; (setq org-capture-templates '(("n" +;; "Note" +;; entry +;; (file org-default-notes-file) +;; "* %?\n%T") +;; ("t" +;; "TODO" +;; entry +;; (file org-default-notes-file) +;; "* TODO %?\n%t\n") +;; ("f" +;; "TODO in Future" +;; entry +;; (file org-default-notes-file) +;; "* TODO %?\nSCHEDULED: %^t\n") +;; ("d" +;; "TODO with Deadline" +;; entry +;; (file org-default-notes-file) +;; "* TODO %?\nDEADLINE: %^t\n") +;; ("l" +;; "Purchase Licenses" +;; entry +;; (file org-default-notes-file) +;; "* TODO Get Licenses :licenses:\nDEADLINE: %^t\n- [ ] HMI\n- [ ] IO Server\n") +;; ("m" +;; "Meeting" +;; entry +;; (file+olp+datetree org-journal-file) +;; "* %? :meeting:\n%^T\n** Notes\n** Action Items") +;; ("s" +;; "Semi-Weekly PLC Meeting" +;; entry +;; (file+olp+datetree org-journal-file) +;; "* Semi-Weekly PLC Meeting :plc:semiweekly:meeting:%^g \n%t\n** ITEM1") +;; ("j" +;; "Journal" +;; entry +;; (file+olp+datetree org-journal-file) +;; "* %?\n%T\n"))) (setq org-id-link-to-org-use-id 'create-if-interactive-and-no-custom-id org-id-method 'ts org-attach-id-to-path-function-list '(org-attach-id-ts-folder-format org-attach-id-uuid-folder-format)) +(advice-add 'org-refile :after (lambda (&rest _) (re/org-save-all))) + (provide 're-org) ;;; re-org.el ends here -- 2.39.5