dkellner-switch-org-task.el 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. ;; dkellner-switch-org-task.el --- super-fast task switching with ivy-mode
  2. (require 'dash)
  3. (bind-key "C-c t" #'dkellner/switch-org-task)
  4. (defun dkellner/switch-org-task ()
  5. (interactive)
  6. (let ((tasks (dkellner/tasks-for-switching)))
  7. (ivy-read "Switch to task: " (map-keys tasks)
  8. :require-match t
  9. :action (lambda (e) (dkellner/org-clock-in-silently
  10. (cdr (assoc e tasks)))))))
  11. (defun dkellner/tasks-for-switching ()
  12. (if (org-clock-is-active)
  13. (dkellner/tasks-surrounding-active-clock)
  14. (dkellner/all-tasks-in-agenda-files)))
  15. (defun dkellner/all-tasks-in-agenda-files ()
  16. (-mapcat #'dkellner/tasks-in-org-file org-agenda-files))
  17. (defun dkellner/tasks-in-org-file (org-file)
  18. (with-current-buffer (find-file-noselect (expand-file-name org-file))
  19. (org-element-map (org-element-parse-buffer) 'headline
  20. #'dkellner/org-element-to-marker-map)))
  21. (defun dkellner/tasks-surrounding-active-clock ()
  22. (with-current-buffer (org-clock-is-active)
  23. (save-excursion
  24. (save-restriction
  25. (widen)
  26. (goto-char org-clock-marker)
  27. (org-save-outline-visibility nil
  28. (outline-show-subtree)
  29. (goto-char org-clock-marker)
  30. (outline-up-heading 1)
  31. (org-narrow-to-subtree)
  32. (org-element-map (org-element-parse-buffer) 'headline
  33. (lambda (h) (when (> (org-element-property :level h)
  34. (org-element-property :level (org-element-at-point)))
  35. (dkellner/org-element-to-marker-map h)))))))))
  36. (defun dkellner/org-element-to-marker-map (element)
  37. (let ((m (make-marker)))
  38. (set-marker m (org-element-property :begin element))
  39. `(,(org-element-property :raw-value element) . ,m)))
  40. (defun dkellner/org-clock-in-silently (clock-marker)
  41. (with-current-buffer (marker-buffer clock-marker)
  42. (goto-char clock-marker)
  43. (org-clock-in)
  44. (basic-save-buffer)))
  45. (provide 'dkellner-switch-org-task)