<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/modules/custom-comments.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-24T21:20:01+00:00</updated>
<entry>
<title>docs(load-graph): classify text/editing command modules</title>
<updated>2026-05-24T21:20:01+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T21:20:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=1dfd02da826d61d528fe42c5bee3c5dbcf098c82'/>
<id>urn:sha1:1dfd02da826d61d528fe42c5bee3c5dbcf098c82</id>
<content type='text'>
Second classification batch: the nine custom-* text/editing command helpers (case, comments, datetime, buffer-file, line-paragraph, misc, ordering, text-enclose, whitespace). I annotated each with the load-graph header contract and added a Batch 2 table to the inventory. They're all Layer 2, eager only to register a C-; submap at load, with no necessary eager reason, so all are Phase 3/4 deferral candidates.

The inventory records a second hidden dependency for Phase 2: custom-buffer-file guards its C-; b registration with (when (boundp 'cj/custom-keymap) ...) and declares the keymap only via eval-when-compile, so the binding silently drops when the module loads without keybindings.
</content>
</entry>
<entry>
<title>refactor(custom-editing): five hygiene fixes from the module-by-module re-review</title>
<updated>2026-05-16T07:48:18+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-16T07:48:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=a9a4d8c7148c115a242a7b35d16dd536f9c0c700'/>
<id>urn:sha1:a9a4d8c7148c115a242a7b35d16dd536f9c0c700</id>
<content type='text'>
- Guard `cj/duplicate-line-or-region' when COMMENT is non-nil but the
  current mode has no `comment-start' (e.g. fundamental-mode).
  Previously the function silently produced malformed output via
  `comment-region'; now it signals a clear `user-error'.

- Factor the `find-file' advice install in external-open.el into
  `cj/external-open-install-advice'.  Same idempotent shape
  (remove-then-add) but the intent is named.

- Add `cj/--validate-decoration-char' in custom-comments.el and
  wire it into all six divider / border / box helpers.  Rejects
  multi-char strings, empty strings, and control characters like
  newline/tab that would corrupt subsequent `M-q' flows.  Updated
  the five nil-decoration ERT tests from `:type 'wrong-type-argument'
  (the old crash signal from `string-to-char' on nil) to
  `:type 'user-error', since the validator produces a clear
  message instead of a deep crash.

- Extract `cj/--require-spell-checker' in flyspell-and-abbrev.el.
  Both `cj/flyspell-toggle' and `cj/flyspell-then-abbrev' now call
  the shared helper; the checker list lives in
  `cj/--spell-checker-executables', so adding nuspell or any other
  checker is a one-line edit.

- Preserve trailing newlines in custom-ordering output.  Both
  `cj/--arrayify' and `cj/--unarrayify' now detect a trailing
  newline on the input region and re-append it to the result,
  matching the pattern custom-text-enclose.el already uses.
</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:which-key: Add descriptive labels for custom keymaps</title>
<updated>2025-10-27T23:45:23+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-27T23:45:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=87034eab17625165b884128d8058c1158fc2f50f'/>
<id>urn:sha1:87034eab17625165b884128d8058c1158fc2f50f</id>
<content type='text'>
Enhance which-key integration by providing detailed descriptions for
new key bindings across multiple modules. This improves the
usability of custom keymaps by clarifying the purpose of each
keybinding, making it easier for users to navigate and understand
different menus and options available within the configuration.

This update ensures that all custom keymaps now display a
descriptive label in the which-key popup to explain their
functionality, aiding users in identifying keymap purposes promptly.
</content>
</entry>
<entry>
<title>feat+test:comments: add 7 comment generation functions and tests</title>
<updated>2025-10-27T01:25:59+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-27T01:25:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=0c6cd8584da8861727cbdb170fd654a8ac738671'/>
<id>urn:sha1:0c6cd8584da8861727cbdb170fd654a8ac738671</id>
<content type='text'>
   Implement 5 new comment styles (simple-divider, padded-divider, heavy-box,
   unicode-box, block-banner) and refactor 2 existing functions (inline-border,
   comment-box) to use interactive/non-interactive pattern for testability.
   Add 178 tests across 7 test files with validation for length constraints and
   cross-language support. Fix linter warnings for parameter shadowing and
   docstring formatting.
</content>
</entry>
<entry>
<title>test+fix:comments: add tests for cj/comment-reformat; fix arg issue</title>
<updated>2025-10-26T23:39:57+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-26T23:39:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=87d2586bcd99f3ceb811d4e1e287ac7ca8f5c65b'/>
<id>urn:sha1:87d2586bcd99f3ceb811d4e1e287ac7ca8f5c65b</id>
<content type='text'>
  Add 14 unit tests for cj/comment-reformat covering:
  - Emacs Lisp (12 tests): multiline joining, fill-column restoration,
    unicode, indentation, empty regions, read-only buffers
  - Python (1 test): hash-based comments
  - C (1 test): C-style comments (converted to block style by c-mode

  Fix issue where cj/comment-reformat was being called with args
</content>
</entry>
<entry>
<title>feat: undead-buffers: Add `cj/make-buffer-undead` function and tests</title>
<updated>2025-10-22T17:27:05+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-22T17:27:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=c4e9232f297ffda4443477c589f29052178d2c87'/>
<id>urn:sha1:c4e9232f297ffda4443477c589f29052178d2c87</id>
<content type='text'>
Introduce a new function `cj/make-buffer-undead` that appends a
buffer name to the `cj/undead-buffer-list`, preventing it from being
killed. This comes along with a suite of tests to check various
scenarios and edge cases for handling undead buffers.

Additionally, add tests for related functions:
`cj/kill-buffer-or-bury-alive`, `cj/kill-buffer-and-window`, and
others to ensure they correctly manage buffers, particularly with
undead-status considerations.

Refactor `undead-buffer-list` naming for consistency and clarity in
the module.
</content>
</entry>
<entry>
<title>fix(custom-comments): update comment for eval-when-compile</title>
<updated>2025-10-20T14:01:57+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-20T14:01:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=9c7309f2c5b4e14d792e722b1ead6220bedc5299'/>
<id>urn:sha1:9c7309f2c5b4e14d792e722b1ead6220bedc5299</id>
<content type='text'>
Update eval-when-compile to reference cj/custom-keymap directly, as
it's defined in keybindings.el, eliminating the need for requiring
the whole fucking keybindings module for key mapping.
</content>
</entry>
<entry>
<title>doc: custom-comments: improved commentary</title>
<updated>2025-10-18T16:38:29+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-18T16:38:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=da36822efb7ab8e1b6c993cbc1781a5a43809e83'/>
<id>urn:sha1:da36822efb7ab8e1b6c993cbc1781a5a43809e83</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: cj/custom-keymap: string versus symbol issue</title>
<updated>2025-10-18T03:08:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-18T03:08:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=c04b3e173d88eb0029f1dc200bf92e5825549d41'/>
<id>urn:sha1:c04b3e173d88eb0029f1dc200bf92e5825549d41</id>
<content type='text'>
</content>
</entry>
</feed>
