From 53d7dc040ea7d339142a14b5e7e9e3f9ad762162 Mon Sep 17 00:00:00 2001 From: Daneel Date: Tue, 24 Feb 2026 17:31:02 +0100 Subject: [PATCH] feat(org): snap cursor past TODO keyword/priority in org buffers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- config.el | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/config.el b/config.el index eea2b6d..b97ee2a 100644 --- a/config.el +++ b/config.el @@ -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-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)