<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/assets/abbrev_defs, branch main</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-04-10T02:04:11+00:00</updated>
<entry>
<title>feat(agenda): add project-filtered agenda view on C-f8</title>
<updated>2026-04-10T02:04:11+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-10T02:04:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=c17c455be6a43effc3c6fb8d27ffd95bc96b3d8a'/>
<id>urn:sha1:c17c455be6a43effc3c6fb8d27ffd95bc96b3d8a</id>
<content type='text'>
New cj/todo-list-single-project prompts for a project, then shows the
daily agenda scoped to that project's todo.org plus calendars and inbox.
Moved cj/todo-list-all-agenda-files from C-f8 to s-f8.
</content>
</entry>
<entry>
<title>feat(vterm): pass F8, F9, F10 through to Emacs</title>
<updated>2026-04-07T18:04:48+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-07T18:04:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=04addf42cff28e0099264f3e9a83843ea50286b8'/>
<id>urn:sha1:04addf42cff28e0099264f3e9a83843ea50286b8</id>
<content type='text'>
Add nil bindings for F8 (agenda), F9 (gptel), and F10 (music) in
vterm-mode-map so these global keybindings aren't swallowed by vterm.
Also disable wttrin-debug and update abbreviations.
</content>
</entry>
<entry>
<title>fix(slack): add error visibility to notification handler</title>
<updated>2026-03-14T17:55:48+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-14T17:55:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=759b654c89e62dab207888bf5615ea8dc3874dfa'/>
<id>urn:sha1:759b654c89e62dab207888bf5615ea8dc3874dfa</id>
<content type='text'>
Websocket library silently swallows callback errors via condition-case.
Wrap cj/slack-notify in condition-case to surface errors in *Messages*.
Add cj/slack-test-notify command for pipeline verification.
</content>
</entry>
<entry>
<title>fix(calendar-sync): handle variable-length date lists in RRULE UNTIL</title>
<updated>2026-03-10T04:40:26+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-10T04:40:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=37a7bf1bf54512def40bee8405939d101a136f45'/>
<id>urn:sha1:37a7bf1bf54512def40bee8405939d101a136f45</id>
<content type='text'>
date-to-time used (reverse date) which broke when RRULE UNTIL values
were parsed as 5-element lists (year month day hour minute) from UTC
timestamps. This caused recurring events with UTC UNTIL dates to
expand to 0 occurrences, producing stale calendar entries.
</content>
</entry>
<entry>
<title>feat(json,yaml): add tree-sitter modes, formatting, and jq integration</title>
<updated>2026-03-03T01:46:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-03T01:46:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=fbaac182eed439326ac7a4f179d503541e93f8f3'/>
<id>urn:sha1:fbaac182eed439326ac7a4f179d503541e93f8f3</id>
<content type='text'>
New prog-json module: json-ts-mode with jq formatting (C-; f) and
jq-interactively (C-c C-q). Upgraded prog-yaml to yaml-ts-mode with
prettier formatting. Both use treesit-auto for grammar management.
Includes 18 new tests (10 JSON, 8 YAML), 185/185 passing.
</content>
</entry>
<entry>
<title>chore: minor housekeeping updates</title>
<updated>2026-02-05T00:44:07+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-05T00:44:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=6bf96b15da42c6c8cc92f8df5165f492ce1d0cc6'/>
<id>urn:sha1:6bf96b15da42c6c8cc92f8df5165f492ce1d0cc6</id>
<content type='text'>
- Add typo correction: should't -&gt; shouldn't
- Add dirvish shortcut pcr for career project
- Rename pc -&gt; pcl for clipper project
- Minor whitespace cleanup in init.el
</content>
</entry>
<entry>
<title>chore: add new typo corrections to abbrev_defs</title>
<updated>2026-02-04T13:52:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-04T13:52:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=7d1ca2b5a58a41a102c4afc44cfe07f91ae45fdc'/>
<id>urn:sha1:7d1ca2b5a58a41a102c4afc44cfe07f91ae45fdc</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(abbrev): correct broken abbreviation substitutions</title>
<updated>2026-01-24T18:35:22+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-01-24T18:35:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=cad427f4bb867f2667ac07c6c2b675c380f6675d'/>
<id>urn:sha1:cad427f4bb867f2667ac07c6c2b675c380f6675d</id>
<content type='text'>
- commmitting → committing (was "not")
- contstruction → construction (was "carrollton")
- dialate → dilate (was "to")
- feelingn → feeling (was "up")
- inclluding → including (was empty)
- remeditation → remediation (was "schedule")
- stoory → story (was "short")
- valiedate → validate (was "visible")
- Remove walkthrough, differentname, sunroom (valid words)
</content>
</entry>
<entry>
<title>fix(calendar-sync): disable auto-start to prevent freeze</title>
<updated>2026-01-14T21:30:35+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-01-14T21:30:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=5084dd6a72888e35ea3cabfb03531e9de48a4061'/>
<id>urn:sha1:5084dd6a72888e35ea3cabfb03531e9de48a4061</id>
<content type='text'>
Proton calendar download causes Emacs to freeze. Disabled auto-sync
by default until root cause is investigated. Manual sync still
available via C-; g s keybinding.
</content>
</entry>
<entry>
<title>feat: Fix modeline lag and add org multi-level sort with comprehensive tests</title>
<updated>2025-11-08T22:11:58+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-08T22:11:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=513dfd2a1d497da8bd9d5261458cf4140dce7ad6'/>
<id>urn:sha1:513dfd2a1d497da8bd9d5261458cf4140dce7ad6</id>
<content type='text'>
Performance improvement and new feature with full test coverage.

## Changes

### 1. Fix modeline line/column position lag (#A priority)
- Replace expensive line-number-at-pos with cached %l/%c format specifiers
- Enable line-number-mode explicitly for caching
- Result: Instant modeline updates, zero performance overhead
- Files: modules/modeline-config.el:81-83, modules/ui-config.el:53

### 2. Implement multi-level org sorting
- New function: cj/org-sort-by-todo-and-priority
- Sorts by TODO status (TODO before DONE) AND priority (A→B→C→D)
- Uses stable sorting: priority first, then TODO state
- Gracefully handles empty sections (no error)
- Bound to C-; o o (ordering → org sort)
- Files: modules/org-config.el:278-299, modules/custom-ordering.el:253,267

### 3. Comprehensive ERT test suite (12/12 passing)
- Normal cases: Mixed TODO/DONE, multiple of same type, same priority
- Boundary cases: Empty sections, single entries, no priorities
- Error cases: Non-org-mode buffer
- Test file: tests/test-org-sort-by-todo-and-priority.el

### 4. Testing improvements discovered
- Disable org-mode hooks to avoid package dependencies in batch mode
- org-sort-entries must be called from parent heading
- Preserve priority cookie in org-get-heading (t t nil t)
- Add condition-case to handle "Nothing to sort" gracefully

### 5. Minor cleanup
- Comment out chime-debug setting (org-agenda-config.el:267)
- Mark modeline lag task as DONE in todo.org

## Technical Details

Modeline optimization:
- line-number-at-pos is O(n) where n = current line
- %l and %c are O(1) lookups from cached values

Org sorting algorithm uses stable sort:
1. Sort by priority (A, B, C, D, unprioritized)
2. Sort by TODO status (preserves priority order within groups)
Result: TODO [#A], TODO [#B], DONE [#A], DONE [#B], etc.
</content>
</entry>
</feed>
