I wanted to use the Getting Things Done productivity method for managing my projects and tasks and the only way I knew how to do this was by copying the relevant functions from Bernt Hansen but when I wanted to customize the views I discovered this was error-prone and not very convenient. So I decided to write my own helper functions which I turned into org-query.
To include entries in the agenda blocks you can use queries like this.
;; Skip the whole tree if the condition is not met (org-query-select "tree" ;; All criteria must be satisfied (and ;; Don't match trees under the Someday / Maybe headline (not (org-query-parent (org-query-stringmatch "^Someday / Maybe"))) ;; The headline should have at least one child with a todo state (org-query-child (org-query-todo)) ;; The headline itself should have the NEXT todo state (org-query-todo '("NEXT"))))This in contrast to the standard skip functions included in orgmode by default. The problem with those functions is that they cannot be combined very easily or intuitively.
This package includes a selection of functions that help to implement GTD-style project management. See the example for their usage.
* Inbox ** TODO do something * Areas of Focus ** Finances *** NEXT implement budget **** NEXT map current expenditures **** TODO map current income **** TODO set budgets **** TODO setup automatic transactions *** WAITING change bank **** DONE transfer all funds to new bank account **** DONE close previous bank account **** WAITING verify funds are in new bank account ** Programming *** TODO create org-query v2 **** NEXT make coffee **** TODO checkout repo from github **** WAITING pull request to other project **** Someday / Maybe ***** TODO caching ** Family *** NEXT go to the movies **** DONE choose movie **** TODO buy tickets **** TODO pickup tickets ============================================================ Task to refile test: TODO do something ============================================================ Tasks waiting for something test: WAITING verify funds are in new bank account test: WAITING pull request to other project ============================================================ Next tasks in active projects test: NEXT map current expenditures ============================================================ Active projects with a next task test: NEXT implement budget ============================================================ Active projects without next task test: NEXT go to the movies ============================================================ Waiting projects test: WAITING change bank ============================================================ Backlog of active projects test: TODO map current income test: TODO set budgets test: TODO setup automatic transactions test: TODO buy tickets test: TODO pickup tickets (defun rmh/agendablock-tasks-waiting () `(tags-todo "/+WAITING|+DEFERRED" ((org-agenda-overriding-header "Tasks waiting for something") (org-tags-match-list-sublevels nil) (org-agenda-skip-function (org-query-select "headline" (not (org-query-gtd-project)))) (org-agenda-todo-ignore-scheduled t) (org-agenda-todo-ignore-deadlines t) ))) (defun rmh/agendablock-next-in-active () `(tags-todo "/+NEXT" ((org-agenda-overriding-header "Next tasks in active projects") (org-agenda-skip-function (org-query-select "headline" (org-query-gtd-active-project-next-task))) (org-tags-match-list-sublevels t) (org-agenda-todo-ignore-scheduled 't) (org-agenda-todo-ignore-deadlines 't) (org-agenda-todo-ignore-with-date 't) (org-agenda-sorting-strategy '(todo-state-down effort-up category-keep))))) (defun rmh/agendablock-backlog-of-active () `(tags-todo "/+TODO" ((org-agenda-overriding-header "Backlog of active projects") (org-agenda-skip-function (org-query-select "headline" (org-query-gtd-backlog-task))) (org-agenda-todo-ignore-scheduled 't) (org-agenda-todo-ignore-deadlines 't) (org-agenda-todo-ignore-with-date 't) (org-agenda-sorting-strategy '(category-keep))))) (defun rmh/agendablock-active-projects-without-next () `(tags-todo "/+NEXT" ((org-agenda-overriding-header "Active projects without next task") (org-agenda-skip-function (org-query-select "tree" (org-query-gtd-active-project-stuck))) (org-tags-match-list-sublevels 't) (org-agenda-sorting-strategy '(category-keep))))) (defun rmh/agendablock-active-projects-with-next () `(tags-todo "/+NEXT" ((org-agenda-overriding-header "Active projects with a next task") (org-agenda-skip-function (org-query-select "tree" (org-query-gtd-active-project-armed))) (org-tags-match-list-sublevels 't) (org-agenda-sorting-strategy '(category-keep))))) (defun rmh/agendablock-waiting-projects () `(tags-todo "/+WAITING" ((org-agenda-overriding-header "Waiting projects") (org-agenda-skip-function (org-query-select "tree" (org-query-gtd-project))) (org-tags-match-list-sublevels 't) (org-agenda-sorting-strategy '(category-keep))))) (defun rmh/agendablock-loose-tasks () `(tags-todo "/+TODO" ((org-agenda-overriding-header "Tasks not belonging to a project") (org-agenda-skip-function (org-query-select "headline" (and (org-query-gtd-loose-task) (not (org-is-habit-p))))) (org-agenda-todo-ignore-scheduled 't) (org-agenda-todo-ignore-deadlines 't) (org-agenda-todo-ignore-with-date 't) (org-agenda-sorting-strategy '(category-keep))))) (defun rmh/agendablock-checklists () `(tags "CHECKLIST" ((org-agenda-overriding-header "Checklists") (org-tags-match-list-sublevels nil)))) (defun rmh/agendablock-inbox () `(tags-todo "LEVEL=2" ((org-agenda-overriding-header "Tasks to refile") (org-agenda-skip-function (org-query-select "tree" (org-query-gtd-refile))) (org-tags-match-list-sublevels nil)))) (setq org-agenda-custom-commands `((" " "Agenda" ((agenda "" ((org-agenda-ndays 1))) ,(rmh/agendablock-inbox) ,(rmh/agendablock-tasks-waiting) ,(rmh/agendablock-next-in-active) ,(rmh/agendablock-active-projects-with-next) ,(rmh/agendablock-active-projects-without-next) ,(rmh/agendablock-waiting-projects) ,(rmh/agendablock-backlog-of-active) ,(rmh/agendablock-checklists)) nil) ("r" "Review Agenda" ((agenda "" ((org-agenda-ndays 1))) ,(rmh/agendablock-inbox) ,(rmh/agendablock-loose-tasks) ,(rmh/agendablock-tasks-waiting) ,(rmh/agendablock-next-in-active) ,(rmh/agendablock-active-projects-with-next) ,(rmh/agendablock-active-projects-without-next) ,(rmh/agendablock-backlog-of-active) ,(rmh/agendablock-checklists)) nil)))