First:
- Tag your active and inactive projects lists say
:PROJECTS:
and :INACTIVE:
respectively
- Mark each inactive project
SCHEDULED:
with the date when you want to next review it
Example:
* projects :PROJECTS:
** clean carpets
* inactive projects :INACTIVE:
** get better at org-agenda
SCHEDULED: <2018-11-03 Sat>
** take over the world
SCHEDULED: <2018-11-10 Sat>
Then, add a custom agenda view to list the inactive projects to review (the following makes use of this answer about how to filter based on SCHEDULED
dates):
(defun my/org-agenda-skip-if-scheduled-later ()
(ignore-errors
(let ((subtree-end (save-excursion (org-end-of-subtree t)))
(scheduled-seconds
(time-to-seconds
(org-time-string-to-time
(org-entry-get nil "SCHEDULED"))))
(now (time-to-seconds (current-time))))
(and scheduled-seconds
(>= scheduled-seconds now)
subtree-end))))
(setq org-agenda-custom-commands
'(("i" "Inactive projects review" tags "+INACTIVE+LEVEL=2"
((org-agenda-skip-function '(my/org-agenda-skip-if-scheduled-later))))
))
Finally, prevent the inactive projects appearing as calendar items in the global agenda view (based on this answer):
(defun my/org-agenda-list-exclude-tags-advice (orig-fn &rest args)
(let ((org-agenda-tag-filter-preset '("-INACTIVE")))
(funcall orig-fn args)))
(advice-add #'org-agenda-list :around #'my/org-agenda-list-exclude-tags-advice)
Note that, because I don't currently keep any TODO items in my inactive projects list, nothing above tries to exclude those from the global TODO list (it would probably be easiest to add another custom tags-todo
view to exclude INACTIVE
for that).