aboutsummaryrefslogtreecommitdiff
path: root/modules/music-config.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-29 08:42:10 -0400
committerCraig Jennings <c@cjennings.net>2026-06-29 08:42:10 -0400
commitdc457ce89a3e78e78d56d6380ef699c05a744137 (patch)
treee6049a44b70e61a960806b90d74dd039f689b407 /modules/music-config.el
parentdef740f809db9ebaf0774e5c8f5d7541f07343b5 (diff)
downloaddotemacs-dc457ce89a3e78e78d56d6380ef699c05a744137.tar.gz
dotemacs-dc457ce89a3e78e78d56d6380ef699c05a744137.zip
feat(completion): annotate the file-basename pickers with size and date
Eight completing-read pickers listed bare file basenames, so marginalia had no directory to resolve and couldn't annotate them. Add cj/completion-file-annotator to system-lib — an annotation-function factory that takes a candidate->path resolver and yields a size + modification-date suffix (or "dir" for directories, nil for missing files). Wire each picker through cj/completion-table-annotated with a per-site category and resolver: timer sounds, drill flashcards, Info files, the test-runner focus add/remove, vc clone dirs, hugo drafts, and agenda projects (the project's todo.org mtime). music-config's existing completion table gains the category and annotator inline, keeping its sort metadata. The candidate strings and every return value are unchanged — this only adds completion metadata — so all downstream logic is untouched. The six modules that didn't already pull in system-lib now require it. Tests: cj/completion-file-annotator gets Normal/Boundary/Error coverage (file, directory, nil path, missing file). Full suite green at 5394. Claude-Session: https://claude.ai/code/session_014fyKMTTqLrZpL3rDF3dYc3
Diffstat (limited to 'modules/music-config.el')
-rw-r--r--modules/music-config.el26
1 files changed, 18 insertions, 8 deletions
diff --git a/modules/music-config.el b/modules/music-config.el
index c627d799..d16e2bb2 100644
--- a/modules/music-config.el
+++ b/modules/music-config.el
@@ -219,14 +219,24 @@ Directories are suffixed with /; files are plain. Hidden dirs/files skipped."
(sort acc #'string-lessp)))
(defun cj/music--completion-table (candidates)
- "Completion table for CANDIDATES preserving order and case-insensitive match."
- (lambda (string pred action)
- (if (eq action 'metadata)
- '(metadata
- (display-sort-function . identity)
- (cycle-sort-function . identity)
- (completion-ignore-case . t))
- (complete-with-action action candidates string pred))))
+ "Completion table for CANDIDATES preserving order and case-insensitive match.
+Tags the `cj-music-file' category and annotates each candidate (a path relative
+to `cj/music-root', with a trailing slash for directories) with its size and
+modification date so marginalia can show them."
+ (let ((annotate (cj/completion-file-annotator
+ (lambda (c)
+ (expand-file-name
+ (if (string-suffix-p "/" c) (substring c 0 -1) c)
+ cj/music-root)))))
+ (lambda (string pred action)
+ (if (eq action 'metadata)
+ `(metadata
+ (category . cj-music-file)
+ (annotation-function . ,annotate)
+ (display-sort-function . identity)
+ (cycle-sort-function . identity)
+ (completion-ignore-case . t))
+ (complete-with-action action candidates string pred)))))
(defun cj/music--ensure-playlist-buffer ()
"Ensure EMMS playlist buffer exists and is in playlist mode. Return buffer."