Rudy’s OBTF Rudolf Adamkovič

Home / Emacs / Org Agenda


Configure!

Simplify frequently used keybindings.

  • C-s (org-agenda-schedule) to s,
  • C-d (org-agenda-deadline) to d,
  • C-c C-x C-i (org-agenda-clock-in) to i, and
  • C-c C-x C-o (org-agenda-clock-out) to o.
(with-eval-after-load 'org-agenda
  (keymap-set org-agenda-mode-map "s" #'org-agenda-schedule)
  (keymap-set org-agenda-mode-map "d" #'org-agenda-deadline)
  (keymap-set org-agenda-mode-map "i" #'org-agenda-clock-in)
  (keymap-set org-agenda-mode-map "o" #'org-agenda-clock-out))

Make n (next) and p (previous) move by agenda items instead of lines.

Note. Originally, per-item movement is bound to the capital letters N and P.

(with-eval-after-load 'org-agenda
  (keymap-set org-agenda-mode-map "n" #'org-agenda-next-item)
  (keymap-set org-agenda-mode-map "p" #'org-agenda-previous-item))

Move the point to the first item after showing the agenda.

(with-eval-after-load 'org-agenda
  (add-hook 'org-agenda-finalize-hook
            (lambda ()
              (org-agenda-next-item 1)
              (recenter-top-bottom))))

Summarize all Org files.

(with-eval-after-load 'org-agenda
  (setopt org-agenda-files
          (list (file-name-concat org-directory
                                  "obtf.org"))))

???

(with-eval-after-load 'org-agenda
  (setopt org-agenda-window-setup 'current-window
          org-agenda-skip-deadline-prewarning-if-scheduled t))

Experiment. Do not show future “copies” of repeated tasks.

(with-eval-after-load 'org-agenda
  (setopt org-agenda-show-future-repeats nil))

Make C-c a open the agenda buffer.

If the buffer already exist, do not recreate it. Instead, switch to it and refresh its content, in order to maintain the cursor position.

(defun my-org-agenda ()
  (interactive)
  (if-let* ((buffer (get-buffer "*Org Agenda*")))
      (progn (switch-to-buffer buffer)
             (org-agenda-redo))
    (org-agenda nil "a" nil)))
(keymap-global-set "C-c a" #'my-org-agenda)

Hide the separators.

(with-eval-after-load 'org-agenda
  (setopt org-agenda-block-separator nil))

Show tags next to their headings.

(with-eval-after-load 'org-agenda
  (setopt org-agenda-align-tags-to-column 0))

Show items with active timestamp first and habits last.

(with-eval-after-load 'org-agenda
  (setopt org-agenda-sorting-strategy
          '((agenda ts-up habit-down time-up priority-down category-up)
            (todo priority-down todo-state-up category-up)
            (tags priority-down todo-state-up category-up)
            (search category-keep alpha-up))))

Show military time as 09:00 instead of 9:00.

(with-eval-after-load 'org-agenda
  (setopt org-agenda-time-leading-zero t))

Hide the time grid to save space.

(with-eval-after-load 'org-agenda
  (setopt org-agenda-use-time-grid nil))

Spell out deadlines and scheduled times in full.

(with-eval-after-load 'org-agenda
  (setopt org-agenda-deadline-leaders
          '("DEADLINE:"
            "DEADLINE(-%d):"
            "DEADLINE(+%d):")
          org-agenda-scheduled-leaders
          '(""
            "(%d)")))
(with-eval-after-load 'org-agenda
  (defun org-agenda-format-date-not-aligned+ (date)
    "Format a DATE string like `org-agenda-format-date-aligned' but
without any alignement."
    (replace-regexp-in-string
     " +" " " (org-agenda-format-date-aligned date))))

;; (with-eval-after-load 'org-agenda (require 'org-habit))

Hide the private tag (not the headings tagged with it).

(with-eval-after-load 'org
  (setopt org-agenda-hide-tags-regexp "private"))
(with-eval-after-load 'org-agenda
  (setopt
   org-agenda-custom-commands
   '(("a" "Agenda"
      ((agenda
        ""
        ((org-agenda-overriding-header "Today")
         (org-agenda-start-on-weekday nil)
         (org-agenda-span 1)
         (org-agenda-format-date 'org-agenda-format-date-not-aligned+)
         (org-agenda-day-face-function (lambda (_) 'calendar-today))
         (org-agenda-dim-blocked-tasks nil)
         (org-agenda-skip-function
          '(org-agenda-skip-entry-if 'todo 'done))))
       (agenda
        ""
        ((org-agenda-overriding-header "\nTomorrow")
         (org-agenda-start-day "+1d")
         (org-agenda-span 1)
         (org-agenda-format-date 'org-agenda-format-date-not-aligned+)
         (org-agenda-dim-blocked-tasks nil)
         (org-habit-show-habits-only-for-today nil)
         (org-habit-scheduled-past-days 0)))
       (tags-todo
        "-TODO=\"WAIT\"+PRIORITY=\"A\""
        ((org-agenda-overriding-header "\nNext Up")
         (org-agenda-todo-ignore-timestamp 'all)
         (org-agenda-todo-ignore-scheduled 'all)
         (org-habit-show-habits nil)))
       (agenda
        ""
        ((org-agenda-overriding-header "\nWeek Ahead")
         (org-agenda-start-day "+2d")
         (org-agenda-start-on-weekday nil)
         (org-agenda-span 7)
         (org-agenda-dim-blocked-tasks nil)
         (org-habit-show-habits nil)))
       (tags-todo
        "+TODO=\"WAIT\"-PRIORITY=\"C\""
        ((org-agenda-overriding-header "\nWaiting")
         (org-agenda-todo-ignore-timestamp 'all)
         (org-agenda-todo-ignore-scheduled 'all)
         (org-habit-show-habits nil))))))))
(with-eval-after-load 'org-agenda
  (setopt org-agenda-prefix-format "* % c% e%? t%? s"
          org-agenda-skip-scheduled-if-deadline-is-shown t
          org-agenda-skip-scheduled-if-done t
          org-agenda-skip-deadline-if-done t
          org-agenda-sort-notime-is-late nil))

???

(with-eval-after-load 'org-agenda
  (setopt org-agenda-tags-todo-honor-ignore-options t))

Enforce dependencies in Org and reflect them in Org Agenda.

(with-eval-after-load 'org-agenda
  (setopt org-enforce-todo-dependencies t
          org-agenda-dim-blocked-tasks 'invisible))

Typeset events in bold to not miss them.

(with-eval-after-load 'org-agenda
  (defun org-agenda-theme+ (&optional theme)
    (set-face-bold 'org-agenda-calendar-sexp t)))
(with-eval-after-load 'org-agenda (org-agenda-theme+))
(with-eval-after-load 'org-agenda
  (add-hook 'enable-theme-functions #'org-agenda-theme+))

Highlight the current line.

(with-eval-after-load 'org-agenda
  (add-hook 'org-agenda-mode-hook #'hl-line-mode))

© 2025 Rudolf Adamkovič under GNU General Public License version 3.
Made with Emacs and secret alien technologies of yesteryear.