<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs.git/assets, branch v0.7.2</title>
<subtitle>my Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2</id>
<link rel='self' href='https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/'/>
<updated>2026-03-14T17:55:48+00:00</updated>
<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.git/commit/?id=7941618b74a14df29c48304a4162fce59d4499ec'/>
<id>urn:sha1:7941618b74a14df29c48304a4162fce59d4499ec</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.git/commit/?id=4080daf948b23d0b6b59394623e12983f0a9cfad'/>
<id>urn:sha1:4080daf948b23d0b6b59394623e12983f0a9cfad</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.git/commit/?id=b5cae72d8f824f235f351821f7d7052b66bc2513'/>
<id>urn:sha1:b5cae72d8f824f235f351821f7d7052b66bc2513</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.git/commit/?id=ca725c2d3b143956f66c33413ab2726c57c78231'/>
<id>urn:sha1:ca725c2d3b143956f66c33413ab2726c57c78231</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.git/commit/?id=4053d1f32957e35462121f4348abb66ccca2fb13'/>
<id>urn:sha1:4053d1f32957e35462121f4348abb66ccca2fb13</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.git/commit/?id=03efca8b2c69b4e4822ccfd7726b1eeb2b73198b'/>
<id>urn:sha1:03efca8b2c69b4e4822ccfd7726b1eeb2b73198b</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>feat(email): add password decryption to setup script</title>
<updated>2026-01-24T18:07:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-01-24T18:07:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=08fefed7f311d85881bfeb9974b1c76638b3fd24'/>
<id>urn:sha1:08fefed7f311d85881bfeb9974b1c76638b3fd24</id>
<content type='text'>
- Add password decryption loop to scripts/setup-email.sh
- Decrypt .gpg files from assets/mail-passwords/ to ~/.config/
- Add encrypted password files (.gmailpass.gpg, .cmailpass.gpg)
- Fix missing paren in text-config.el that broke config parsing
- Clean up mail-config.el
</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.git/commit/?id=b62a9a792707581243b15116910d8aef33220d3f'/>
<id>urn:sha1:b62a9a792707581243b15116910d8aef33220d3f</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.git/commit/?id=8176eff73b826f7fec9d7f458f7d2f36f4d12e58'/>
<id>urn:sha1:8176eff73b826f7fec9d7f458f7d2f36f4d12e58</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.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>chore: Update abbrev corrections and add flyspell TODO</title>
<updated>2025-11-06T23:58:59+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-06T23:58:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=8c04bf4304662e93c4ddd78306344876b7b7d3ab'/>
<id>urn:sha1:8c04bf4304662e93c4ddd78306344876b7b7d3ab</id>
<content type='text'>
- Automatic abbrev_defs updates from spell corrections
- Added TODO: investigate flyspell-then-abbrev keybinding loss in scratch

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
