feat(org): snap cursor past TODO keyword/priority in org buffers

Like org-agenda, snap cursor to task name when navigating headings
in normal state. Uses buffer-local post-command-hook — fires only when
on a heading and cursor is before the task name.
This commit is contained in:
2026-02-24 17:31:02 +01:00
parent 729b571cf4
commit 53d7dc040e

View File

@@ -456,6 +456,33 @@ and optional priority indicator [#A]."
(advice-add 'org-agenda-next-line :after #'my/org-agenda-goto-task-name) (advice-add 'org-agenda-next-line :after #'my/org-agenda-goto-task-name)
(advice-add 'org-agenda-previous-line :after #'my/org-agenda-goto-task-name) (advice-add 'org-agenda-previous-line :after #'my/org-agenda-goto-task-name)
;; Org buffer: snap cursor past TODO keyword/priority on headings in normal state.
;; Fires via post-command-hook (buffer-local) — only when cursor is before task name.
(defun my/org-heading-snap-past-keyword ()
"In Evil normal state, snap cursor past TODO keyword and priority on org headings."
(when (and (derived-mode-p 'org-mode)
(evil-normal-state-p)
(org-at-heading-p))
(let* ((kw-re (regexp-opt (my/org-agenda-all-keywords) 'words))
(task-start
(save-excursion
(beginning-of-line)
(skip-chars-forward "* ")
(when (looking-at kw-re)
(goto-char (match-end 0))
(skip-chars-forward " \t")
(when (looking-at "\\[#.\\][ \t]+")
(goto-char (match-end 0)))
(point)))))
(when (and task-start (< (point) task-start))
(goto-char task-start)))))
(add-hook 'org-mode-hook
(lambda ()
(add-hook 'post-command-hook
#'my/org-heading-snap-past-keyword
nil t)))
;;; ============================================================ ;;; ============================================================
;;; GPTEL — AI INTEGRATION (OpenWebUI / OpenRouter) ;;; GPTEL — AI INTEGRATION (OpenWebUI / OpenRouter)