aboutsummaryrefslogtreecommitdiffstats
path: root/emacs
diff options
context:
space:
mode:
authorGravatar Tom Willemse2018-07-17 22:28:07 -0700
committerGravatar Tom Willemse2018-07-17 22:28:07 -0700
commit497532549768def28d7664dc64ded1fd3881c6f6 (patch)
tree36c3dcc54deaf21f19e27a88e4af68416e75d649 /emacs
parent0754c6bf8fbe1a67b1974ec4aecb79e6a0946229 (diff)
downloadnew-dotfiles-497532549768def28d7664dc64ded1fd3881c6f6.tar.gz
new-dotfiles-497532549768def28d7664dc64ded1fd3881c6f6.zip
Skip any non-immediate tasks in projects
Focus should always be on the _next_ task in a project.
Diffstat (limited to 'emacs')
-rw-r--r--emacs/.emacs.d/init/oni-org-init.el36
1 files changed, 36 insertions, 0 deletions
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"