Skip any non-immediate tasks in projects

Focus should always be on the _next_ task in a project.
This commit is contained in:
Tom Willemse 2018-07-17 22:28:07 -07:00
parent 0754c6bf8f
commit 4975325497

View file

@ -38,6 +38,41 @@
(set-face-attribute 'org-checkbox nil :family "Ionicons") (set-face-attribute 'org-checkbox nil :family "Ionicons")
(prettify-symbols-mode))) (prettify-symbols-mode)))
(defun oni-org-init-heading-has-predecessor-p ()
"Determine if the heading at point has any predecessors.
Only tasks of a level greater than 3 are considered. A task has a
predecessor if there is a non-DONE sibling defined before it."
(let ((point (point)))
(save-excursion
(org-backward-heading-same-level 1)
(seq-let [level _ keyword] (org-heading-components)
(not (or (< level 3)
(= point (point))
(member keyword org-done-keywords)))))))
(defun oni-org-init-looking-for-tag-p (tag)
"Return t if we're currently looking for TAG in an agenda."
(and (eql 'org-tags-view (car org-agenda-redo-command))
(string-match-p (rx-to-string `(and word-start ,tag word-end))
org-agenda-query-string)))
(defun oni-org-init-next-heading-position ()
"Get the position of the next Org heading."
(or (ignore-errors
(org-forward-element)
(point))
(point-max)))
(defun oni-org-init-skip-tasks ()
"Skip over tasks I don't want to see right now.
Tasks being skipped over include ones with the \"ex\" tag and
ones that have a predecessor."
(let ((tags (org-get-tags-at (point))))
(when (or (and (not (oni-org-init-looking-for-tag-p "ex"))
(member "ex" tags))
(oni-org-init-heading-has-predecessor-p))
(oni-org-init-next-heading-position))))
(setq org-default-notes-file "~/documents/gtd/inbox.org") (setq org-default-notes-file "~/documents/gtd/inbox.org")
(setq org-src-fontify-natively t) (setq org-src-fontify-natively t)
(setq org-return-follows-link t) (setq org-return-follows-link t)
@ -47,6 +82,7 @@
(setq org-use-fast-todo-selection t) (setq org-use-fast-todo-selection t)
(setq org-log-into-drawer t) (setq org-log-into-drawer t)
(setq org-agenda-todo-ignore-scheduled 'future) (setq org-agenda-todo-ignore-scheduled 'future)
(setq org-agenda-skip-function-global #'oni-org-init-skip-tasks)
(setq org-agenda-files (setq org-agenda-files
'("~/documents/gtd/todo.org" '("~/documents/gtd/todo.org"