{"id":13592502,"url":"https://github.com/remyhonig/org-query","last_synced_at":"2026-01-10T15:22:17.121Z","repository":{"id":27506351,"uuid":"30986825","full_name":"remyhonig/org-query","owner":"remyhonig","description":"Create complex but readable skip-functions for org-agenda","archived":false,"fork":false,"pushed_at":"2018-01-29T13:24:03.000Z","size":29,"stargazers_count":57,"open_issues_count":2,"forks_count":4,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-08-02T16:45:00.146Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/remyhonig.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-02-18T21:03:24.000Z","updated_at":"2023-04-19T12:16:19.000Z","dependencies_parsed_at":"2022-09-24T09:23:12.614Z","dependency_job_id":null,"html_url":"https://github.com/remyhonig/org-query","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remyhonig%2Forg-query","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remyhonig%2Forg-query/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remyhonig%2Forg-query/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remyhonig%2Forg-query/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/remyhonig","download_url":"https://codeload.github.com/remyhonig/org-query/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223346792,"owners_count":17130503,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T16:01:10.094Z","updated_at":"2026-01-10T15:22:17.070Z","avatar_url":"https://github.com/remyhonig.png","language":"Emacs Lisp","funding_links":[],"categories":["Emacs Lisp"],"sub_categories":[],"readme":"[[https://travis-ci.org/remyhonig/org-query][https://travis-ci.org/remyhonig/org-query.svg?branch=master]]\n\n* Problem\n\nI wanted to use the /Getting Things Done/ productivity method for\nmanaging my projects and tasks and the only way I knew how to do this\nwas by copying the relevant functions from [[http://doc.norang.ca/org-mode.html#Projects][Bernt Hansen]] but when I\nwanted to customize the views I discovered this was error-prone and\nnot very convenient. So I decided to write my own helper functions\nwhich I turned into =org-query=. \n\n* Solution\n\n** Features\n\n*** Selection DSL\n\nTo include entries in the agenda blocks you can use queries like this.\n\n#+BEGIN_SRC emacs-lisp\n  ;; Skip the whole tree if the condition is not met\n  (org-query-select \"tree\"\n\n   ;; All criteria must be satisfied\n   (and\n\n    ;; Don't match trees under the Someday / Maybe headline\n    (not (org-query-parent (org-query-stringmatch \"^Someday / Maybe\")))\n\n    ;; The headline should have at least one child with a todo state\n    (org-query-child (org-query-todo))\n\n    ;; The headline itself should have the NEXT todo state\n    (org-query-todo '(\"NEXT\"))))\n#+END_SRC\n\nThis in contrast to the [[https://www.gnu.org/software/emacs/manual/html_node/org/Special-agenda-views.html][standard skip functions]] included in =orgmode=\nby default. The problem with those functions is that they cannot be\ncombined very easily or intuitively.\n\n*** GTD style skipping functions\n\nThis package includes a selection of functions that help to implement\nGTD-style project management. See the example for their usage.\n\n** Example\n\n*** Orgmode Tree\n\n#+BEGIN_SRC text\n * Inbox\n ** TODO do something\n * Areas of Focus\n ** Finances\n *** NEXT implement budget\n **** NEXT map current expenditures\n **** TODO map current income\n **** TODO set budgets\n **** TODO setup automatic transactions \n *** WAITING change bank\n **** DONE transfer all funds to new bank account\n **** DONE close previous bank account\n **** WAITING verify funds are in new bank account\n ** Programming\n *** TODO create org-query v2\n **** NEXT make coffee\n **** TODO checkout repo from github\n **** WAITING pull request to other project\n **** Someday / Maybe \n ***** TODO caching\n ** Family\n *** NEXT go to the movies\n **** DONE choose movie\n **** TODO buy tickets\n **** TODO pickup tickets \n #+END_SRC\n\n*** Agenda View\n\n#+BEGIN_SRC text\n============================================================\nTask to refile\n  test:       TODO do something\n\n============================================================\nTasks waiting for something\n  test:       WAITING verify funds are in new bank account\n  test:       WAITING pull request to other project\n\n============================================================\nNext tasks in active projects\n  test:       NEXT map current expenditures\n\n============================================================\nActive projects with a next task\n  test:       NEXT implement budget\n\n============================================================\nActive projects without next task\n  test:       NEXT go to the movies\n\n============================================================\nWaiting projects\n  test:       WAITING change bank\n\n============================================================\nBacklog of active projects\n  test:       TODO map current income\n  test:       TODO set budgets\n  test:       TODO setup automatic transactions\n  test:       TODO buy tickets\n  test:       TODO pickup tickets\n#+END_SRC\n\n** Usage\n\n#+name: org-config\n#+BEGIN_SRC emacs-lisp\n  (defun rmh/agendablock-tasks-waiting ()\n    `(tags-todo \"/+WAITING|+DEFERRED\"\n                ((org-agenda-overriding-header \"Tasks waiting for something\")\n                 (org-tags-match-list-sublevels nil)\n                 (org-agenda-skip-function (org-query-select \"headline\" (not (org-query-gtd-project))))\n                 (org-agenda-todo-ignore-scheduled t)\n                 (org-agenda-todo-ignore-deadlines t)\n                 )))\n\n  (defun rmh/agendablock-next-in-active ()\n    `(tags-todo \"/+NEXT\"\n                ((org-agenda-overriding-header \"Next tasks in active projects\")\n                 (org-agenda-skip-function (org-query-select \"headline\" (org-query-gtd-active-project-next-task)))\n                 (org-tags-match-list-sublevels t)\n                 (org-agenda-todo-ignore-scheduled 't)\n                 (org-agenda-todo-ignore-deadlines 't)\n                 (org-agenda-todo-ignore-with-date 't)\n                 (org-agenda-sorting-strategy\n                  '(todo-state-down effort-up category-keep)))))\n\n  (defun rmh/agendablock-backlog-of-active ()\n    `(tags-todo \"/+TODO\"\n                ((org-agenda-overriding-header \"Backlog of active projects\")\n                 (org-agenda-skip-function (org-query-select \"headline\" (org-query-gtd-backlog-task)))\n                 (org-agenda-todo-ignore-scheduled 't)\n                 (org-agenda-todo-ignore-deadlines 't)\n                 (org-agenda-todo-ignore-with-date 't)\n                 (org-agenda-sorting-strategy\n                  '(category-keep)))))\n\n  (defun rmh/agendablock-active-projects-without-next ()\n    `(tags-todo \"/+NEXT\"\n                ((org-agenda-overriding-header \"Active projects without next task\")\n                 (org-agenda-skip-function (org-query-select \"tree\" (org-query-gtd-active-project-stuck)))\n                 (org-tags-match-list-sublevels 't)\n                 (org-agenda-sorting-strategy\n                  '(category-keep)))))\n\n  (defun rmh/agendablock-active-projects-with-next ()\n    `(tags-todo \"/+NEXT\"\n                ((org-agenda-overriding-header \"Active projects with a next task\")\n                 (org-agenda-skip-function (org-query-select \"tree\" (org-query-gtd-active-project-armed)))\n                 (org-tags-match-list-sublevels 't)\n                 (org-agenda-sorting-strategy\n                  '(category-keep)))))\n\n  (defun rmh/agendablock-waiting-projects ()\n    `(tags-todo \"/+WAITING\"\n                ((org-agenda-overriding-header \"Waiting projects\")\n                 (org-agenda-skip-function (org-query-select \"tree\" (org-query-gtd-project)))\n                 (org-tags-match-list-sublevels 't)\n                 (org-agenda-sorting-strategy\n                  '(category-keep)))))\n\n  (defun rmh/agendablock-loose-tasks ()\n    `(tags-todo \"/+TODO\"\n                ((org-agenda-overriding-header \"Tasks not belonging to a project\")\n                 (org-agenda-skip-function\n                  (org-query-select \"headline\" (and (org-query-gtd-loose-task) (not (org-is-habit-p)))))\n                 (org-agenda-todo-ignore-scheduled 't)\n                 (org-agenda-todo-ignore-deadlines 't)\n                 (org-agenda-todo-ignore-with-date 't)\n                 (org-agenda-sorting-strategy\n                  '(category-keep)))))\n\n  (defun rmh/agendablock-checklists ()\n    `(tags \"CHECKLIST\"\n           ((org-agenda-overriding-header \"Checklists\")\n            (org-tags-match-list-sublevels nil))))\n\n  (defun rmh/agendablock-inbox ()\n    `(tags-todo \"LEVEL=2\"\n                ((org-agenda-overriding-header \"Tasks to refile\")\n                 (org-agenda-skip-function (org-query-select \"tree\" (org-query-gtd-refile)))\n                 (org-tags-match-list-sublevels nil))))\n\n\n  (setq org-agenda-custom-commands\n        `((\" \" \"Agenda\"\n          ((agenda \"\" ((org-agenda-ndays 1)))\n           ,(rmh/agendablock-inbox)\n           ,(rmh/agendablock-tasks-waiting)\n           ,(rmh/agendablock-next-in-active)\n           ,(rmh/agendablock-active-projects-with-next)\n           ,(rmh/agendablock-active-projects-without-next)\n           ,(rmh/agendablock-waiting-projects)\n           ,(rmh/agendablock-backlog-of-active)\n           ,(rmh/agendablock-checklists))\n          nil)\n        (\"r\" \"Review Agenda\"\n         ((agenda \"\" ((org-agenda-ndays 1)))\n          ,(rmh/agendablock-inbox)\n          ,(rmh/agendablock-loose-tasks)\n          ,(rmh/agendablock-tasks-waiting)\n          ,(rmh/agendablock-next-in-active)\n          ,(rmh/agendablock-active-projects-with-next)\n          ,(rmh/agendablock-active-projects-without-next)\n          ,(rmh/agendablock-backlog-of-active)\n          ,(rmh/agendablock-checklists))\n         nil)))\n#+END_SRC\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremyhonig%2Forg-query","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fremyhonig%2Forg-query","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremyhonig%2Forg-query/lists"}