<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/modules/music-config.el, branch load-graph-classify-end</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-end</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-end'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-05-24T22:01:40+00:00</updated>
<entry>
<title>docs(load-graph): classify remaining domain and optional modules</title>
<updated>2026-05-24T22:01:40+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T22:01:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=f84bba186dca1543f9c5f02c03af355188b6e87c'/>
<id>urn:sha1:f84bba186dca1543f9c5f02c03af355188b6e87c</id>
<content type='text'>
Final classification batch: the last 19 modules — linear-config, local-repository, lorem-optimum, mail-config, markdown-config, music-config, pdf-config, quick-video-capture, reconcile-open-repos, restclient-config, slack-config, system-commands, telega-config, tramp-config, transcription-config, video-audio-recording, vterm-config, weather-config, wrap-up. I annotated each header, added a Batch 9 table to the inventory, and extended the validation allowlist. 101 of 102 modules are now classified; only elfeed-config remains, deferred on its test fix.

Two more hidden dependencies turned up. video-audio-recording uses the boundp shim for its C-; r binding, and mail-config registers C-; e directly without requiring keybindings, so it errors standalone rather than degrading. Both recorded for Phase 2.
</content>
</entry>
<entry>
<title>chore(modules): pass validate-modules in batch by adding requires</title>
<updated>2026-05-08T00:25:29+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-08T00:25:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=a41ef9774f6550da446a3ae8fbbcbcd5bf6c23c4'/>
<id>urn:sha1:a41ef9774f6550da446a3ae8fbbcbcd5bf6c23c4</id>
<content type='text'>
`make validate-modules` had 19 module-load failures, all the same shape: a module references a symbol or feature owned by another module without saying so. Production was fine because init.el orders requires correctly. The batch target loads each module in isolation, though, and surfaces the gap.

I added explicit `(require 'keybindings)` or `(require 'user-constants)` to each affected module. The requires are idempotent at runtime, so production load order is unchanged. For three optional packages (elpa-mirror, mu4e, org-contacts), I switched to `(require 'X nil t)` so the modules load cleanly when those packages aren't installed. The activation calls become no-ops in that case.

`make validate-modules` now reports 0 failures.
</content>
</entry>
<entry>
<title>feat(music): add random-aware next/previous; refactor music + calendar-sync</title>
<updated>2026-04-03T13:33:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-03T13:33:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=6cb923b4fb9ae66258a9eeef0d67d7e950daa737'/>
<id>urn:sha1:6cb923b4fb9ae66258a9eeef0d67d7e950daa737</id>
<content type='text'>
Music: random mode now respected by next/previous keys. Previous navigates
a 50-track play history ring buffer. Fixed playlist replacement bug.
24 new tests.

Calendar-sync: consolidated duplicate parse functions, extracted timezone
localization helper, unified expand-daily/monthly/yearly into parameterized
function, removed dead code. 33 new characterization tests. -90 lines.
</content>
</entry>
<entry>
<title>feat(music): add test coverage for 7 functions, refactor with extracted helpers</title>
<updated>2026-04-01T13:13:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-01T13:13:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=94a8221668c3ce96daf7c3b062c5071c03bb20b4'/>
<id>urn:sha1:94a8221668c3ce96daf7c3b062c5071c03bb20b4</id>
<content type='text'>
Add 47 new unit tests across 7 test files covering playlist-modified-p,
assert-valid-playlist-file, playlist-tracks, create-radio-station,
ensure-playlist-buffer, after-playlist-clear, and header-text.

Extract three helpers to reduce duplication: assert-m3u-files-exist (dedupes
2 identical guards), sync-playlist-file (dedupes 3 state-sync patterns),
and select-m3u-file (reusable M3U selection with cancel). Simplify
append-track-to-playlist nesting from 6 to 4 levels. Delete unused
cj/music-keymap-prefix variable.
</content>
</entry>
<entry>
<title>fix(music): place point on first track after playlist load/reload</title>
<updated>2026-03-10T12:24:25+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-10T12:24:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=699f5ba8e51a90272bf80191eae72d84d7dbb71a'/>
<id>urn:sha1:699f5ba8e51a90272bf80191eae72d84d7dbb71a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(music): force case-insensitive search when adding songs</title>
<updated>2026-02-21T13:01:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-21T13:01:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=17050d2ebbe926894d10b540e346ae85dae4e464'/>
<id>urn:sha1:17050d2ebbe926894d10b540e346ae85dae4e464</id>
<content type='text'>
Bind orderless-smart-case to nil in cj/music-fuzzy-select-and-add
so typing uppercase characters doesn't switch to case-sensitive matching.
</content>
</entry>
<entry>
<title>feat(music): add playlist UI with header overlay, track styling, and tests</title>
<updated>2026-02-15T20:31:36+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-15T20:31:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=1242a731cbe9ffc8f223ce82795b3cd8f79d1216'/>
<id>urn:sha1:1242a731cbe9ffc8f223ce82795b3cd8f79d1216</id>
<content type='text'>
Replace raw file paths with clean track descriptions (Artist - Title [M:SS]),
add multi-line header overlay showing playlist info, now-playing, mode
indicators with gold/muted toggle states, and keybinding hints. Style
non-playing tracks in Dupre steel, playing track in Dupre gold. Playlist
window now opens from the bottom at 50% height with subtle background
highlight on focus.

Unit tests for format-duration (13 tests) and track-description (16 tests).
</content>
</entry>
<entry>
<title>docs(music): add ncmpcpp keybinding comparison table to commentary</title>
<updated>2026-02-15T07:07:53+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-15T07:07:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=f5955467babd5995b394d57e1f102ff221b6cf85'/>
<id>urn:sha1:f5955467babd5995b394d57e1f102ff221b6cf85</id>
<content type='text'>
Document playlist-mode keybindings with ncmpcpp default alignment
status (83% match). Note intentional divergences (SPC/p swap,
x=consume vs crossfade) and EMMS-only features.
</content>
</entry>
<entry>
<title>feat(music): align EMMS keybindings with ncmpcpp, add consume mode</title>
<updated>2026-02-15T07:02:23+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-15T07:02:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=1c50845d4fd6c1f6ea44e23c177fecc0f2386b93'/>
<id>urn:sha1:1c50845d4fd6c1f6ea44e23c177fecc0f2386b93</id>
<content type='text'>
Reconcile playlist-mode bindings with ncmpcpp defaults: add ncmpcpp-
compatible aliases (&gt;/&lt;, +, S-up/S-down, c), new toggles (r repeat,
t repeat-track, z random, x consume), info keys (i, o), and relocate
radio (r→R), reload (R→g), shuffle (x→Z). Add consume mode that
removes tracks from playlist after playback via emms-player-finished-
hook. Fix buffer-local bug where emms-playlist-selected-marker was
checked outside with-current-buffer. 13 ERT tests.
</content>
</entry>
<entry>
<title>feat(music): add dirvish keybinding for EMMS playlist</title>
<updated>2026-02-01T07:44:44+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-01T07:44:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=4d25d607c73f4e98c51627019d4ea099f3fd00f4'/>
<id>urn:sha1:4d25d607c73f4e98c51627019d4ea099f3fd00f4</id>
<content type='text'>
Bind + to cj/music-add-dired-selection in dirvish-mode-map.
</content>
</entry>
</feed>
