<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/modules/vc-config.el, branch load-graph-classify-start</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-start</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-start'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-05-24T09:27:54+00:00</updated>
<entry>
<title>fix(vc): harden clipboard git-clone process and path handling</title>
<updated>2026-05-24T09:27:54+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T09:27:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=35e4d70116c8a2a5b82eaf4b8c58889dc02cbe46'/>
<id>urn:sha1:35e4d70116c8a2a5b82eaf4b8c58889dc02cbe46</id>
<content type='text'>
cj/git-clone-clipboard-url shelled out via shell-command and derived the clone directory with file-name-nondirectory, which mishandles scp-style SSH URLs with no slash (git@host:repo.git became git@host:repo). It also ran git in default-directory and only checked whether the clone dir appeared afterward, so a failed clone was silent.

The clone now runs as a direct git process (call-process, no shell) with clone -- url dir so a URL beginning with - cannot be read as a flag. The destination path comes from cj/--git-clone-dir-name, which takes the last component splitting on / and :, handling HTTPS, scp-style and ssh:// SSH, and local paths. It validates the clipboard is non-empty and the target is a writable directory that does not already contain the destination, and surfaces a non-zero git exit as a user-error with the *git-clone* output. Tests cover the deriver across URL schemes plus the empty-clipboard and clone-failure paths.
</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>vc-config: add git clone from clipboard URL feature</title>
<updated>2025-11-11T23:41:12+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-11T23:41:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=41fb8b06a4a7b5a7dd8d014570ca06b692b5ba26'/>
<id>urn:sha1:41fb8b06a4a7b5a7dd8d014570ca06b692b5ba26</id>
<content type='text'>
Introduce `cj/git-clone-clipboard-url` function for quick cloning of
git repositories using a URL from the clipboard. Allows for
directory selection using prefix arguments and opens the README file
post-cloning if available. Adjust keymaps to include the new
function and refine version control menu organization.
</content>
</entry>
<entry>
<title>feat: Complete modeline overhaul with custom segments and interactive features</title>
<updated>2025-11-04T00:01:24+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-04T00:01:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=97b03e6764539d586860382ca519060b386325e2'/>
<id>urn:sha1:97b03e6764539d586860382ca519060b386325e2</id>
<content type='text'>
Replaced mood-line with a custom, minimal modeline using only built-in
Emacs functionality to avoid native compilation issues.

**Architecture:**
- Named segment system using defvar-local for easy reordering
- Emacs 30 built-in right-alignment (mode-line-format-right-align)
- All segments marked as risky-local-variable for proper evaluation

**Features:**
- Color-coded buffer names (green=writeable, red=read-only, gold=overwrite)
- VC branch with git symbol (U+E0A0) and state-based coloring
- Position format: L:line C:col
- Help-echo tooltips on all segments
- Mouse click handlers for interactive actions
- String truncation in narrow windows (&lt; 100 chars)
- Active-window-only display for branch and misc-info

**Interactive Actions:**
- Buffer name: mouse-1 = prev-buffer, mouse-3 = next-buffer
- Major mode: mouse-1 = describe-mode
- Git branch: mouse-1 = vc-diff, mouse-3 = vc-root-diff

**Bug Fixes:**
- Disabled async native compilation to prevent "Selecting deleted buffer" errors
- Fixed difftastic loading by changing :demand to :defer
- Abstracted buffer status colors to user-constants.el for reuse

Inspired by Prot's modeline design patterns.
</content>
</entry>
<entry>
<title>feat: Upgrade diff-buffer-with-file to ediff and add difftastic for git</title>
<updated>2025-11-03T22:10:13+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-03T22:10:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=622f36660eabd850f9953b24b25ae4df04e9d38f'/>
<id>urn:sha1:622f36660eabd850f9953b24b25ae4df04e9d38f</id>
<content type='text'>
Two improvements for better diff experience:

1. **Upgraded cj/diff-buffer-with-file to use ediff** (custom-buffer-file.el)
   - Replaced basic unified diff with ediff-current-file
   - Now uses existing ediff config (horizontal split, j/k navigation)
   - C-; b D now launches interactive ediff instead of text diff
   - Simplified from 17 lines to 5 lines
   - Removed TODO comment about difftastic integration

2. **Added difftastic for git diffs** (vc-config.el)
   - Installed binary: difftastic 0.64.0 via pacman
   - Added difftastic.el package integrated with magit
   - Keybindings in magit-diff:
     - D → difftastic-magit-diff (dwim)
     - S → difftastic-magit-show
   - Provides structural, language-aware diffs for git changes
   - Better visualization of code structure changes

**Result:**
- Buffer vs file: Interactive ediff (can navigate, merge, revert)
- Git history: Structural difftastic (language-aware visualization)
- Right tool for each job

Serves Method 3: "Make Fixing Emacs Frictionless"
- Better diffs = easier debugging and code review

Updated todo.org: Method 1 progress 7/13 (was 5/13)
</content>
</entry>
<entry>
<title>fix: Implement missing cj/goto-git-gutter-diff-hunks function</title>
<updated>2025-11-03T21:51:00+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-03T21:51:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=5a7fa3ad7bccebc4bab4ca2adc24b5f74e25860a'/>
<id>urn:sha1:5a7fa3ad7bccebc4bab4ca2adc24b5f74e25860a</id>
<content type='text'>
Fixes void-function error when pressing C-; v d keybinding.

**The Problem:**
- Keybinding C-; v d referenced undefined function
- Caused "Symbol's function definition is void" error
- Prevented interactive jumping to git diff hunks

**The Solution:**
- Added cj/goto-git-gutter-diff-hunks to modules/vc-config.el
- Uses consult-line with regex ^[+\-] to find diff markers
- Enables interactive selection of any changed line in buffer
- Properly documented with descriptive docstring

**Function:**
```elisp
(defun cj/goto-git-gutter-diff-hunks ()
  "Jump to git-gutter diff hunks using consult.
Searches for lines starting with + or - (diff markers) and allows
interactive selection to jump to any changed line in the buffer."
  (interactive)
  (require 'git-gutter)
  (consult-line "^[+\\-]"))
```

**Testing:**
- ✓ No linting issues (checkdoc clean)
- ✓ Compiles cleanly (byte-compile warnings are expected deferred loads)
- ✓ Function follows existing code patterns

Serves Method 1: "Make Using Emacs Frictionless"
- Quick win: estimated 15 min, actual 5 min
- Removes error and enables useful git workflow feature

Updated todo.org to mark task complete.
</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>refactor:keymaps: Replace define-prefix-command with defvar-keymap</title>
<updated>2025-10-26T00:56:40+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-26T00:56:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=746cefd4d674bfc6dd9fdfe4aeb79c7e760ec268'/>
<id>urn:sha1:746cefd4d674bfc6dd9fdfe4aeb79c7e760ec268</id>
<content type='text'>
Refactor the keymap definitions across multiple modules by replacing
`define-prefix-command` with `defvar-keymap`. This simplifies the
keymap setup and integrates better with the `which-key` package for
enhanced documentation and usability. Updated modules include
custom-ordering, custom-text-enclose, custom-whitespace,
mail-config, music-config, org-drill-config, test-runner, and
vc-config.
</content>
</entry>
<entry>
<title>refactor: unify and simplify key binding setups</title>
<updated>2025-10-23T05:15:14+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-23T05:15:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=d22d004ed9bdc11dbc21be368f90384ed8b1b795'/>
<id>urn:sha1:d22d004ed9bdc11dbc21be368f90384ed8b1b795</id>
<content type='text'>
Optimized key binding configurations across modules for consistency
and reduced redundancy. Improved conditional requiring to handle
errors gracefully in `music-config.el`, ensuring robustness across
different machine environments. Eliminated comments clutter and
adjusted function definitions to adhere to revised standards.
</content>
</entry>
<entry>
<title>chore: vc-config: auto-load forge when visiting magit-status</title>
<updated>2025-10-20T14:12:23+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-20T14:12:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=cfcf2c4e43afbea074787cd103c518ae90c6dd67'/>
<id>urn:sha1:cfcf2c4e43afbea074787cd103c518ae90c6dd67</id>
<content type='text'>
Add forge auto-loading when visiting magit-status in a forge-enabled
repository and bind "N" key to 'forge-pull' for convenience.
</content>
</entry>
</feed>
