From 497532549768def28d7664dc64ded1fd3881c6f6 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Tue, 17 Jul 2018 22:28:07 -0700 Subject: Skip any non-immediate tasks in projects Focus should always be on the _next_ task in a project. --- emacs/.emacs.d/init/oni-org-init.el | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'emacs/.emacs.d') diff --git a/emacs/.emacs.d/init/oni-org-init.el b/emacs/.emacs.d/init/oni-org-init.el index 0c3fcc5..1ad25ca 100644 --- a/emacs/.emacs.d/init/oni-org-init.el +++ b/emacs/.emacs.d/init/oni-org-init.el @@ -38,6 +38,41 @@ (set-face-attribute 'org-checkbox nil :family "Ionicons") (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-src-fontify-natively t) (setq org-return-follows-link t) @@ -47,6 +82,7 @@ (setq org-use-fast-todo-selection t) (setq org-log-into-drawer t) (setq org-agenda-todo-ignore-scheduled 'future) +(setq org-agenda-skip-function-global #'oni-org-init-skip-tasks) (setq org-agenda-files '("~/documents/gtd/todo.org" -- cgit v1.2.3-54-g00ecf