#!/usr/bin/env bash # Write the agenda render cache for an external renderer. # # Runs a batch Emacs rather than talking to the daemon, because the surface # that reads the cache has to keep working while Emacs is down -- and # emacsclient is exactly the thing that cannot. Nothing here touches a running # Emacs, so it is safe to fire from a timer alongside an active session. # # The agenda file list is resolved the same way the editor resolves it, by # loading the config's own resolver rather than restating the list here. A # second copy of that list would drift the first time a calendar source is # added. # # Usage: agenda-render-cache # Env: EMACS_D -- config directory (default ~/.emacs.d) # EMACS -- emacs binary (default emacs) # AGENDA_RENDER_FILES -- colon-separated org files to read instead of # the configured agenda list. Lets a caller ask # about a known set, and lets the tests run # against a fixture rather than whatever happens # to be on the machine's real agenda today. set -euo pipefail EMACS_D="${EMACS_D:-$HOME/.emacs.d}" EMACS="${EMACS:-emacs}" if [ ! -d "$EMACS_D/modules" ]; then echo "agenda-render-cache: no modules directory at $EMACS_D/modules" >&2 exit 1 fi # -Q keeps the daemon's init out of it: this needs three modules, not a full # editor. load-prefer-newer stops a stale .elc from answering for changed # source, which would silently write yesterday's logic. exec "$EMACS" --batch -Q \ --eval '(setq load-prefer-newer t)' \ -L "$EMACS_D/modules" \ --eval '(progn (require (quote user-constants)) (require (quote org-agenda-config)) (setq org-todo-keywords cj/org-todo-keywords) (require (quote agenda-query)) (setq org-agenda-files (let ((override (getenv "AGENDA_RENDER_FILES"))) (if (and override (not (string-empty-p override))) (split-string override ":" t) (cj/--org-agenda-scan-files)))) (princ (cj/agenda-render-cache-update)) (terpri))'