Yeah. Looks like prefix is computed _before_ category is
produced for
agenda. So, org-agenda-get-category is too early to be useful.
So you may need `org-agenda-with-point-at-orig-entry' as I said
in the
updated docstring.
wrapping prefix-fn in `org-agenda-with-point-at-orig-entry'
produces an error (stacktrace is below).
But it also does not make sense. If %(..) is evaluated in the
agenda buffer why does `buffer-file-name` point to the buffer of
the entry?
Also calling `org-get-category` *gets* the category, it just
produces also a warning, while `org-agenda-get-category` returns
nil. To me this looks off.
Note that the initial problem (the warning) only occurs with
timestamped entries on the current date. For any other kind of
Agenda entry calling `org-get-category` works completely without
issue.
To me this all looks like the %(..) forms get called in the entry
buffer but in the case of timestamped entries on the current date
there's an additional evaluation happening.
~lou
* This is a header with a timestamp
:PROPERTIES:
:CATEGORY: test
:END:
<2025-12-16 Di 12:00-14:00>
To Reproduce the warning the timestamp must be for the current day *and* have a
time component.
#+begin_src emacs-lisp
(setq org-agenda-files (list (buffer-file-name (current-buffer))))
(toggle-debug-on-error)
(defun prefix-fn ()
(org-agenda-with-point-at-orig-entry nil
(or (org-agenda-get-category)
buffer-file-name)))
(setq org-agenda-prefix-format '((agenda . "%(prefix-fn)")))
(org-agenda)
#+end_src
#+RESULTS:
produces the following error:
#+begin_src emacs-lisp
Debugger entered--Lisp error: (wrong-type-argument markerp nil)
marker-buffer(nil)
(set-buffer (marker-buffer --marker))
(save-current-buffer (set-buffer (marker-buffer --marker)) (save-excursion
(goto-char --marker) (or (org-agenda-get-category) buffer-file-name)))
(with-current-buffer (marker-buffer --marker) (save-excursion (goto-char
--marker) (or (org-agenda-get-category) buffer-file-name)))
(let ((--marker (get-text-property (if nil 0 (line-beginning-position))
'org-hd-marker nil))) (with-current-buffer (marker-buffer --marker)
(save-excursion (goto-char --marker) (or (org-agenda-get-category)
buffer-file-name))))
(org-agenda-with-point-at-orig-entry nil (or (org-agenda-get-category)
buffer-file-name))
prefix-fn()
(org-eval (prefix-fn))
(format "%s" (org-eval (prefix-fn)))
(format "%s" (format "%s" (org-eval (prefix-fn))))
eval((format "%s" (format "%s" (org-eval (prefix-fn)))) t)
org-agenda-format-item(nil #("This is a header with a timestamp" 0 33
(effort-minutes nil effort nil face org-level-1 fontified t)) " " "test" nil
#("<2025-12-16 Di 12:00-14:00>" 0 26 (face (org-date) keymap (keymap
(follow-link . mouse-face) (mouse-3 . org-find-file-at-mouse) (mouse-2 .
org-open-at-mouse)) mouse-face highlight fontified t) 26 27 (face (org-date)
rear-nonsticky (mouse-face highlight keymap invisible intangible help-echo
org-linked-text htmlize-link) keymap (keymap (follow-link . mouse-face)
(mouse-3 . org-find-file-at-mouse) (mouse-2 . org-open-at-mouse)) mouse-face
highlight fontified t))
"<\\([[:digit:]]\\{4\\}-[[:digit:]]\\{2\\}-[[:digit:]]\\{2\\}\\(?: .*?\\)?\\)>"
nil)
org-agenda-get-timestamps(nil)
org-agenda-get-day-entries("/home/lou/test.org" (12 16 2025) :deadline
:scheduled :timestamp :sexp)
apply(org-agenda-get-day-entries "/home/lou/test.org" (12 16 2025) (:deadline
:scheduled :timestamp :sexp))
org-agenda-list(nil)
funcall-interactively(org-agenda-list nil)
call-interactively(org-agenda-list)
org-agenda()
(progn (setq org-agenda-files (list (buffer-file-name (current-buffer))))
(defun prefix-fn nil (org-agenda-with-point-at-orig-entry nil (or
(org-agenda-get-category) buffer-file-name))) (setq org-agenda-prefix-format
'((agenda . "%(prefix-fn)"))) (org-agenda))
eval((progn (setq org-agenda-files (list (buffer-file-name
(current-buffer)))) (defun prefix-fn nil (org-agenda-with-point-at-orig-entry
nil (or (org-agenda-get-category) buffer-file-name))) (setq
org-agenda-prefix-format '((agenda . "%(prefix-fn)"))) (org-agenda)) nil)
org-babel-execute:emacs-lisp("(setq org-agenda-files (list (buffer-file-name
(current-buffer))))\n\n(defun prefix-fn ()\n
(org-agenda-with-point-at-orig-entry nil\n (or (org-agenda-get-category)\n
buffer-file-name)))\n\n(setq org-agenda-prefix-format '((agenda .
\"%(prefix-fn)\")))\n(org-agenda)" ((:colname-names) (:rowname-names)
(:result-params "replace") (:result-type . value) (:results . "replace")
(:exports . "code") (:session . "none") (:cache . "no") (:noweb . "no")
(:hlines . "no") (:tangle . "no") (:lexical . "no")))
org-babel-execute-src-block(nil ("emacs-lisp" "(setq org-agenda-files (list
(buffer-file-name (current-buffer))))\n\n(defun prefix-fn ()\n
(org-agenda-with-point-at-orig-entry nil\n (or (org-agenda-get-category)\n
buffer-file-name)))\n\n(setq org-agenda-prefix-format '((agenda .
\"%(prefix-fn)\")))\n(org-agenda)" ((:colname-names) (:rowname-names)
(:result-params "replace") (:result-type . value) (:results . "replace")
(:exports . "code") (:lexical . "no") (:tangle . "no") (:hlines . "no") (:noweb
. "no") (:cache . "no") (:session . "none")) "" nil 199 "(ref:%s)"))
org-ctrl-c-ctrl-c(nil)
funcall-interactively(org-ctrl-c-ctrl-c nil)
command-execute(org-ctrl-c-ctrl-c)Debugger entered--Lisp error:
(wrong-type-argument markerp nil)
marker-buffer(nil)
(set-buffer (marker-buffer --marker))
(save-current-buffer (set-buffer (marker-buffer --marker)) (save-excursion
(goto-char --marker) (or (org-agenda-get-category) buffer-file-name)))
(with-current-buffer (marker-buffer --marker) (save-excursion (goto-char
--marker) (or (org-agenda-get-category) buffer-file-name)))
(let ((--marker (get-text-property (if nil 0 (line-beginning-position))
'org-hd-marker nil))) (with-current-buffer (marker-buffer --marker)
(save-excursion (goto-char --marker) (or (org-agenda-get-category)
buffer-file-name))))
(org-agenda-with-point-at-orig-entry nil (or (org-agenda-get-category)
buffer-file-name))
prefix-fn()
(org-eval (prefix-fn))
(format "%s" (org-eval (prefix-fn)))
(format "%s" (format "%s" (org-eval (prefix-fn))))
eval((format "%s" (format "%s" (org-eval (prefix-fn)))) t)
org-agenda-format-item(nil #("This is a header with a timestamp" 0 33
(effort-minutes nil effort nil face org-level-1 fontified t)) " " "test" nil
#("<2025-12-16 Di 12:00-14:00>" 0 26 (face (org-date) keymap (keymap
(follow-link . mouse-face) (mouse-3 . org-find-file-at-mouse) (mouse-2 .
org-open-at-mouse)) mouse-face highlight fontified t) 26 27 (face (org-date)
rear-nonsticky (mouse-face highlight keymap invisible intangible help-echo
org-linked-text htmlize-link) keymap (keymap (follow-link . mouse-face)
(mouse-3 . org-find-file-at-mouse) (mouse-2 . org-open-at-mouse)) mouse-face
highlight fontified t))
"<\\([[:digit:]]\\{4\\}-[[:digit:]]\\{2\\}-[[:digit:]]\\{2\\}\\(?: .*?\\)?\\)>"
nil)
org-agenda-get-timestamps(nil)
org-agenda-get-day-entries("/home/lou/test.org" (12 16 2025) :deadline
:scheduled :timestamp :sexp)
apply(org-agenda-get-day-entries "/home/lou/test.org" (12 16 2025) (:deadline
:scheduled :timestamp :sexp))
org-agenda-list(nil)
funcall-interactively(org-agenda-list nil)
call-interactively(org-agenda-list)
org-agenda()
(progn (setq org-agenda-files (list (buffer-file-name (current-buffer))))
(toggle-debug-on-error) (defun prefix-fn nil
(org-agenda-with-point-at-orig-entry nil (or (org-agenda-get-category)
buffer-file-name))) (setq org-agenda-prefix-format '((agenda .
"%(prefix-fn)"))) (org-agenda))
eval((progn (setq org-agenda-files (list (buffer-file-name
(current-buffer)))) (toggle-debug-on-error) (defun prefix-fn nil
(org-agenda-with-point-at-orig-entry nil (or (org-agenda-get-category)
buffer-file-name))) (setq org-agenda-prefix-format '((agenda .
"%(prefix-fn)"))) (org-agenda)) nil)
org-babel-execute:emacs-lisp("(setq org-agenda-files (list (buffer-file-name
(current-buffer))))\n(toggle-debug-on-error)\n\n(defun prefix-fn ()\n
(org-agenda-with-point-at-orig-entry nil\n (or (org-agenda-get-category)\n
buffer-file-name)))\n\n(setq org-agenda-prefix-format '((agenda .
\"%(prefix-fn)\")))\n(org-agenda)" ((:colname-names) (:rowname-names)
(:result-params "replace") (:result-type . value) (:results . "replace")
(:exports . "code") (:session . "none") (:cache . "no") (:noweb . "no")
(:hlines . "no") (:tangle . "no") (:lexical . "no")))
org-babel-execute-src-block(nil ("emacs-lisp" "(setq org-agenda-files (list
(buffer-file-name (current-buffer))))\n(toggle-debug-on-error)\n\n(defun
prefix-fn ()\n (org-agenda-with-point-at-orig-entry nil\n (or
(org-agenda-get-category)\n buffer-file-name)))\n\n(setq
org-agenda-prefix-format '((agenda . \"%(prefix-fn)\")))\n(org-agenda)"
((:colname-names) (:rowname-names) (:result-params "replace") (:result-type .
value) (:results . "replace") (:exports . "code") (:lexical . "no") (:tangle .
"no") (:hlines . "no") (:noweb . "no") (:cache . "no") (:session . "none")) ""
nil 199 "(ref:%s)"))
org-ctrl-c-ctrl-c(nil)
funcall-interactively(org-ctrl-c-ctrl-c nil)
command-execute(org-ctrl-c-ctrl-c)
#+end_src