205 lines
8.3 KiB
EmacsLisp
205 lines
8.3 KiB
EmacsLisp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; 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 scheduled-up deadline-up scheduled-up timestamp-up time-up 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\\'")
|
|
(setq org-agenda-files (list
|
|
"~/org/_index.org"
|
|
"~/org/orgzly/_todo.org"
|
|
"~/org/orgzly/_slipbox.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)
|
|
|
|
(setq org-super-agenda-groups
|
|
'(
|
|
(:name "Health"
|
|
:and (:habit t
|
|
:tag "health"))
|
|
(:name "House"
|
|
:and (:habit t
|
|
:tag "house"))
|
|
(:name "Meds"
|
|
:and (:habit t
|
|
:tag "meds"))
|
|
(:name "Health"
|
|
:and (:tag "health" :tag "homework"))
|
|
(:name "Misc"
|
|
:tag "homework")
|
|
(:name "Health"
|
|
:and (:todo ("WIP" "READY")
|
|
:tag "health"))
|
|
(:order 200 :auto-parent "t")
|
|
(:name "Slipbox"
|
|
:and (:todo ("WIP" "READY")
|
|
:tag "slipbox"))
|
|
(:name "Personal"
|
|
:and (:todo ("WIP" "READY")
|
|
:tag "personal"))
|
|
(:name "To Do"
|
|
:todo ("WIP" "READY"))
|
|
(:name "Slipbox" :tag "slipbox")
|
|
(:name "Health" :tag "health")
|
|
(:name "Personal" :tag "personal")
|
|
(: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/orgzly/_meds.org"))
|
|
(org-agenda-remove-tags t)
|
|
))
|
|
(tags-todo "+homework" (
|
|
(org-agenda-overriding-header "Homework")
|
|
(org-agenda-remove-tags t)
|
|
))
|
|
(tags-todo "+TODO=\"WIP\"&-homework" (
|
|
(org-agenda-overriding-header "WIP")
|
|
(org-agenda-remove-tags t)
|
|
))
|
|
(tags-todo "+TODO=\"READY\"&-homework" (
|
|
(org-agenda-overriding-header "Ready")
|
|
(org-agenda-remove-tags t)
|
|
))
|
|
(tags-todo "-TODO=\"WIP\"&-TODO=\"READY\"&-homework" (
|
|
(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/orgzly/_meds.org"))
|
|
(org-agenda-remove-tags t)
|
|
))
|
|
)
|
|
)
|
|
("t" "Personal (Tasks)"
|
|
(
|
|
(tags-todo "+homework" (
|
|
(org-agenda-overriding-header "Homework")
|
|
(org-agenda-remove-tags t)
|
|
))
|
|
(tags-todo "+TODO=\"WIP\"&-homework" (
|
|
(org-agenda-overriding-header "WIP")
|
|
(org-agenda-remove-tags t)
|
|
))
|
|
(tags-todo "+TODO=\"READY\"&-homework" (
|
|
(org-agenda-overriding-header "Ready")
|
|
(org-agenda-remove-tags t)
|
|
))
|
|
(tags-todo "-TODO=\"WIP\"&-TODO=\"READY\"&-homework" (
|
|
(org-agenda-overriding-header "")
|
|
(org-agenda-remove-tags t)
|
|
))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|