;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; helper for building agenda file lists (defun my/load-org-agenda-files-recursively (dir) "Find all directories in DIR." (unless (file-directory-p dir) (error "Not a directory `%s'" dir)) (unless (equal (directory-files dir nil org-agenda-file-regexp t) nil) (add-to-list 'org-agenda-files dir) ) (dolist (file (directory-files dir nil nil t)) (unless (member file '("." "..")) (let ((file (concat dir file "/"))) (when (file-directory-p file) (load-org-agenda-files-recursively file) ) ) ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; set org habit status for yesterday and schedule for today. this is to facilitate adding "skipped" log entries for better reporting and tracking of habits ; this assumes youre operating on daily habits ; https://emacs.stackexchange.com/questions/9433/how-to-make-org-prompt-for-a-timestamp-when-changing-state-of-a-todo/63809 ; https://stackoverflow.com/questions/25437069/how-can-i-mark-org-habits-as-done-in-the-past (defun my/org-habit-with-date (&optional arg) (interactive "P") (setq my-activation-time (current-time)) (cl-letf* ((org-read-date-prefer-future nil) (org-popup-calendar-for-date-prompt nil) (my-current-time (org-read-date t t nil "when:" nil "-1d" nil)) ((symbol-function 'current-time) #'(lambda () my-current-time)) ((symbol-function 'org-today) #'(lambda () (time-to-days my-current-time))) ((symbol-function 'org-current-effective-time) #'(lambda () my-current-time)) (super-org-entry-put (symbol-function 'org-entry-put)) ((symbol-function 'org-entry-put) #'(lambda (pom property value) (print property) (if (lambda (or (equal property "LAST_REPEAT") (equal property "SCHEDULED"))) (let ((my-value (format-time-string (org-time-stamp-format t t) my-current-time))) (funcall super-org-entry-put pom property my-value)) (funcall super-org-entry-put pom property value) )))) (if (eq major-mode 'org-agenda-mode) (org-agenda-todo arg) (org-todo arg)) ) (if (eq major-mode 'org-agenda-mode) (org-agenda-schedule arg my-activation-time) (org-schedule arg my-activation-time) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; org-agenda tuning (view stuff only) ;; Remove completed deadline tasks from the agenda view (setq org-agenda-skip-deadline-if-done t) ;; Remove completed scheduled tasks from the agenda view (setq org-agenda-skip-scheduled-if-done t) ;; Remove completed items from search results (setq org-agenda-skip-timestamp-if-done t) ;; Dont show deadline pre-warning if already scheduled (scheduled means the time when you /start work/ on a todo ; this is very different than norms ;; see https://orgmode.org/manual/Deadlines-and-Scheduling.html (setq org-agenda-skip-deadline-prewarning-if-scheduled t) ;; dont tend to care about tag inheritance outside of search (setq org-agenda-use-tag-inheritance nil) ;; add new option to update habit for yesterday and reschedule it as active today (add-hook 'org-agenda-mode-hook (lambda () (local-set-key (kbd "y") 'my/org-habit-with-date))) (setq org-agenda-use-time-grid nil) (setq org-agenda-window-setup "current-window") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Set some org agendas/dashboards (setq org-agenda-sorting-strategy '( (agenda habit-down time-up scheduled-down priority-down category-keep) (todo habit-up time-down scheduled-down deadline-down todo-state-down priority-down alpha-up) (tags priority-down category-keep) (search category-keep) ) ) (setq org-agenda-file-regexp "\\`[^.].*\\.org\\'") (when (not kmn/is-dayjob) (setq org-agenda-files (list "~/org/health/_health.org" "~/org/health/health_houdini.org" "~/org/health/health_mike.org" "~/org/_index.org" "~/org/orgzly/_todo.org" "~/org/orgzly/_slipbox.org" )) ) (when kmn/is-dayjob (setq org-agenda-files (list "~/org/_index.org" "~/org/_slipbox.org" "~/org/_todo.org" )) ) ; use *all* org agenda files as refile targets (setq org-refile-targets '((nil :maxlevel . 3) (org-agenda-files :maxlevel . 3))) (require 'org-super-agenda) (org-super-agenda-mode) (when (not kmn/is-dayjob) (setq org-super-agenda-groups '( (:name "Health" :and (:habit t :tag "health")) (:name "Houdini" :and (:habit t :tag "houdini")) (:name "House" :and (:habit t :tag "house")) (:name "Personal" :and (:habit t :tag "personal")) (:name "Meds" :and (:habit t :tag "meds")) (:name "Misc" :habit t) (:name "Health" :and (:todo ("WIP" "READY") :tag "health")) (:order 100 :auto-parent "t") (:name "Personal" :todo ("WIP" "READY")) (:name "Slip Box" :tag "slipbox") (:name "To Do" :priority>= "C") (:name "Low Priority" :priority< "C") )) (setq org-agenda-custom-commands '( ("r" "Personal (Combined)" ( (agenda "" ( (org-agenda-overriding-header "Scheduled") (org-agenda-remove-tags t) (org-deadline-warning-days 14) (org-agenda-entry-types '(:deadline :scheduled)) )) (agenda "" ( (org-agenda-overriding-header "Habits") (org-agenda-files (list "~/org/orgzly/_habits.org" "~/org/health/_meds.org")) (org-agenda-remove-tags t) )) (todo "WIP" ( (org-agenda-overriding-header "WIP") (org-agenda-remove-tags t) )) (todo "READY" ( (org-agenda-overriding-header "Ready") (org-agenda-remove-tags t) )) (tags-todo "-TODO=\"WIP\"-TODO=\"READY\"" ( (org-agenda-overriding-header "") (org-agenda-remove-tags t) )) ) ) ("h" "Personal (Habits/Scheduled)" ( (agenda "" ( (org-agenda-overriding-header "Scheduled") (org-agenda-remove-tags t) (org-deadline-warning-days 14) (org-agenda-entry-types '(:deadline :scheduled)) )) (agenda "" ( (org-agenda-overriding-header "Habits") (org-agenda-files (list "~/org/orgzly/_habits.org" "~/org/health/_meds.org")) (org-agenda-remove-tags t) )) ) ) ("t" "Personal (Tasks)" ( (todo "WIP" ( (org-agenda-overriding-header "WIP") (org-agenda-remove-tags t) )) (todo "READY" ( (org-agenda-overriding-header "Ready") (org-agenda-remove-tags t) )) (tags-todo "-TODO=\"WIP\"-TODO=\"READY\"" ( (org-agenda-overriding-header "") (org-agenda-remove-tags t) )) ) ) ("d" "Destiny" ( (agenda "" ( (org-agenda-start-on-weekday 2) (org-agenda-overriding-header "Scheduled") (org-agenda-files (list "~/org/games/games_destiny.org")) )) (alltodo "" ( (org-agenda-overriding-header "") (org-agenda-files (list "~/org/games/games_destiny.org")) (org-super-agenda-groups '( (:name "WIP" :and (:todo "WIP" :not (:tag "crafting"))) (:name "READY" :and (:todo "READY" :not (:tag "crafting"))) (:name "Low Priority" :not (:tag "crafting")) (:name "Patterns Needed" :not (:property ("resonance_needed" "0"))) (:name "Barrel" :not (:property ("barrel" "true"))) (:name "Magazine" :not (:property ("magazine" "true"))) (:name "Perk 1" :not (:property ("perk_1" "true"))) (:name "Perk 2" :not (:property ("perk_2" "true"))) (:name "Frame" :not (:property ("frame" "true"))) (:name "Weapon Leveling" :not (:property ("level_at_all_perks_or_higher" "true"))) (:name "Enhanced Perk 1" :not (:property ("enhanced_perk_1" "true"))) (:name "Enhanced Perk 2" :not (:property ("enhanced_perk_2" "true"))) (:name "Masterwork" :not (:property ("masterworked" "true"))) )) )) ) ) ("o" . "Photography") ) ) ) (when kmn/is-dayjob (setq org-super-agenda-groups '( (:name "Habits" :habit t) (:order 100 :auto-parent "t") (:name "Active" :todo ("WIP" "READY")) (:name "Slip Box" :tag "slipbox") (:name "To Do" :priority>= "C") (:name "Low Priority" :priority< "C"))) (setq org-agenda-custom-commands '( ("r" "PCE" ( (agenda "" ( (org-agenda-overriding-header "Scheduled") (org-agenda-remove-tags t) (org-deadline-warning-days 14) (org-agenda-entry-types '(:deadline :scheduled)) )) (agenda "" ( (org-agenda-overriding-header "Habits") (org-agenda-files (list "~/org/_habits.org")) (org-agenda-remove-tags t) )) (todo "WIP" ( (org-agenda-overriding-header "WIP") (org-agenda-remove-tags t) )) (todo "READY" ( (org-agenda-overriding-header "Ready") (org-agenda-remove-tags t) )) (tags-todo "-TODO=\"WIP\"-TODO=\"READY\"" ( (org-agenda-overriding-header "") (org-agenda-remove-tags t) )) ) ) ) ) )