<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/modules/prog-general.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-15T20:10:19+00:00</updated>
<entry>
<title>feat(yas): activate yasnippet globally with fundamental-mode extras</title>
<updated>2026-05-15T20:10:19+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-15T20:10:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=74cffcac0c9bb8e4a7ee33d51ff1f2cd9a2cd7f0'/>
<id>urn:sha1:74cffcac0c9bb8e4a7ee33d51ff1f2cd9a2cd7f0</id>
<content type='text'>
The yasnippet use-package block switches from `:hook (prog-mode . yas-minor-mode)` to `:demand t` + `(yas-global-mode 1)`. That makes yas-minor-mode active in every buffer, not just prog-mode-derived ones.

I added a small helper, `cj/--yas-activate-fundamental-extras`, attached as `:hook (yas-minor-mode . ...)`. It calls `(yas-activate-extra-mode 'fundamental-mode)` so the snippet table at `snippets/fundamental-mode/` is consulted in every buffer regardless of the buffer's own major mode. That's what makes universal triggers like `&lt;cj` work everywhere.

The new `tests/test-prog-general-yas-activation.el` covers both wiring (yas-global-mode on, fundamental-mode in yas-extra-modes, yas-minor-mode active in org/text buffers) and end-to-end expansion (the marker snippet expands correctly in fundamental, text, org, emacs-lisp, and python-ts modes). 9 tests, all green; full unit suite green with no regressions.
</content>
</entry>
<entry>
<title>chore(prog-general): disable auto-close of *compilation* window</title>
<updated>2026-05-03T22:39:10+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-03T22:39:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=2a60405ac28c12ec63fac2032b8f87599ebfc6b6'/>
<id>urn:sha1:2a60405ac28c12ec63fac2032b8f87599ebfc6b6</id>
<content type='text'>
I commented out the global `compilation-finish-functions' hook that closed the *compilation* window 1.5 seconds after a successful compile. With the F6 test runner now landing test output in *compilation*, I want the buffer to stay open afterward so I can read the results, not have it slide out from under me.

The block stays in the file as a commented-out reference so I can flip it back on later if I want. A prog-mode-only variant is noted in the comment for the day I want the auto-close back for non-prog compiles (org-export, etc.) — that needs advice on `compile' to capture the originating buffer's `major-mode' at compile-start, since the hook fires after `compilation-mode' has already taken over the current buffer. Skipped for now per the simpler path.
</content>
</entry>
<entry>
<title>feat(dev-fkeys): add project-aware F4 compile/run dispatcher</title>
<updated>2026-05-03T21:13:21+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-03T21:13:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=2c94acd52cc92dc4ebefd999dbca771367cc3090'/>
<id>urn:sha1:2c94acd52cc92dc4ebefd999dbca771367cc3090</id>
<content type='text'>
I added a new module `modules/dev-fkeys.el` that owns the dev F-key block. F4 prompts via `completing-read` with a candidate set filtered by project type (compiled / interpreted / unknown). C-F4 is the compile-only fast path. M-F4 is clean + rebuild. It runs a heuristic clean command derived from the project markers (go.mod, Cargo.toml, Eask, Makefile, CMakeLists.txt) and chains `projectile-compile-project` on success. S-F4 stays on `recompile` and now lives globally instead of duplicated across prog-general.el and prog-c.el. F6 is bound globally to `projectile-test-project` as a Phase 1 stopgap. Phase 2 replaces it with the polyglot test runner spec'd in todo.org.

Project-type detection runs against the projectile root and falls back to `unknown` when no marker matches. Interpreted markers are checked first so a Python or Node project with a Makefile for tasks classifies as interpreted instead of compiled. Compile + Run sequencing uses a one-shot `compilation-finish-functions` hook that self-removes on first invocation and only fires the follow-up when the status string starts with `finished`.

Cleanup in the same commit:
- Dropped F4/F5/F6 from `prog-general.el`'s prog-mode-hook. They are now global.
- Dropped F6→format bindings from prog-c.el / prog-python.el / prog-shell.el. C-; f was already bound in each, so this is pure removal.
- Dropped the duplicate S-F4 from prog-c.el. The global binding covers it.
- Updated the keybinding header in prog-general.el and the workflow comments in prog-c.el / prog-shell.el.
- Wired `(require 'dev-fkeys)` in init.el alongside coverage-core.

TDD: 73 tests across 11 files, one per helper. Production code is split into small testable internals (`cj/--detect-project-type`, `cj/--f4-candidates`, `cj/--f4-derive-clean-cmd`, `cj/--f4-make-once-hook`, `cj/--f4-dispatch`, `cj/--f4-compile-and-run-impl`, `cj/--f4-clean-rebuild-impl`, `cj/--f4-project-root`) plus three thin interactive wrappers. Smoke tests confirm bindings register on load.

Known limitation: if another `compilation-finish-functions` hook fires between my add-hook and the compile finishing, the chain can fire on the wrong compile. The hook self-removes on first invocation regardless of which compile it sees. Documented in the impl docstring. Acceptable for v1.

Phase 2 will replace F6 with the polyglot test runner (tree-sitter queries for Python/Go/TS, sexp scan for Elisp, buffer-local last-test memory).
</content>
</entry>
<entry>
<title>refactor: Replace doom-modeline with mood-line and remove deprecated tree-sitter</title>
<updated>2025-11-03T21:43:36+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-03T21:43:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=05c8126602905d805ddc2a4448436c9c4adb12fc'/>
<id>urn:sha1:05c8126602905d805ddc2a4448436c9c4adb12fc</id>
<content type='text'>
Method 2 improvements for cleaner, faster configuration:

1. **Replaced doom-modeline with mood-line** (modules/modeline-config.el)
   - Simplified from 70+ lines to ~10 lines (-40 lines net)
   - mood-line is lightweight, minimal, inspired by doom-modeline
   - Better performance with no dependencies
   - Keeps all essential features: buffer status, major mode, VCS,
     flycheck, cursor position, multiple-cursors counters

2. **Removed deprecated tree-sitter package** (modules/prog-general.el)
   - Deleted `(use-package tree-sitter)`
   - Now relies solely on Emacs 29+ built-in treesit with treesit-auto
   - treesit-auto continues to manage grammars automatically
   - No functionality lost, cleaner dependency tree

Both changes serve Method 2: "Stop Problems Before They Appear"
- Simpler code = fewer bugs
- Fewer dependencies = less maintenance
- Native features = better integration

Updated todo.org to mark both tasks complete [2/5 in Method 2].
</content>
</entry>
<entry>
<title>fix(dirvish): move deadgrep from D to G, preserve dired-do-delete on D</title>
<updated>2025-10-29T18:14:00+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-29T18:14:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=b9adb25f6de84eda3c6daed040b918778bc66a9e'/>
<id>urn:sha1:b9adb25f6de84eda3c6daed040b918778bc66a9e</id>
<content type='text'>
The previous commit incorrectly moved deadgrep to 'D', which conflicts
with the important dired-do-delete command (immediate delete of marked
files). This commit moves deadgrep to 'G' instead.

## Changes

**prog-general.el:**
- Move cj/deadgrep-here from 'D' to 'G' (was dired-do-chgrp, rarely used)

**dirvish-config.el:**
- Updated Commentary to document both 'D' and 'G' keybindings
- 'D' remains dired-do-delete (standard dired immediate delete)
- 'G' is now deadgrep search

## Final Keybinding Map

| Key | Binding                       | Purpose                        |
|-----|-------------------------------|--------------------------------|
| d   | cj/dirvish-duplicate-file     | Duplicate with "-copy" suffix  |
| D   | dired-do-delete               | Delete marked files (standard) |
| g   | dirvish-quick-access          | Quick directory menu           |
| G   | cj/deadgrep-here              | Search with deadgrep           |

Capital G is mnemonic for "Grep" and doesn't conflict with important
dired commands. dired-do-chgrp is rarely used and not a loss.
</content>
</entry>
<entry>
<title>feat(dirvish): add file duplication with 'd' key, move deadgrep to 'D'</title>
<updated>2025-10-29T18:08:54+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-29T18:08:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=674feedb2d4d0484040be42e5ccec95e4e355c2a'/>
<id>urn:sha1:674feedb2d4d0484040be42e5ccec95e4e355c2a</id>
<content type='text'>
This commit adds a convenient file duplication function to dirvish and
reorganizes keybindings to avoid conflicts.

## Changes

**1. New function: cj/dirvish-duplicate-file (dirvish-config.el:150)**

Duplicates the file at point with "-copy" suffix before the extension:
- report.pdf → report-copy.pdf
- script.el → script-copy.el
- README → README-copy

Features:
- Prevents duplicating directories (files only)
- Checks if target exists and prompts to overwrite
- Refreshes buffer automatically after copying
- Shows clear message with old and new names

**2. Keybinding changes**

dirvish-config.el:
- Bound 'd' to cj/dirvish-duplicate-file (was dired-flag-file-deletion)
- Updated Commentary section to document new binding

prog-general.el:
- Moved cj/deadgrep-here from 'd' to 'D' (capital D)
- More mnemonic: D for Deadgrep
- Avoids conflict with new duplicate function

## Rationale

The 'd' key is prime real estate in file managers, and duplicating files
is a very common operation. The standard dired-flag-file-deletion is still
available via 'x' or the mark-and-delete workflow.

Deadgrep on 'D' is more discoverable (capital D for Deadgrep) and less
likely to be pressed accidentally.

## Usage

In dirvish, navigate to a file and press:
- 'd' - Duplicate file with "-copy" suffix
- 'D' - Search with deadgrep in current directory
</content>
</entry>
<entry>
<title>refactor:prog-general: Simplify yasnippet configuration</title>
<updated>2025-10-28T22:26:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-28T22:26:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=5af4ba9c0f47099623994f69cf2edda80f12b5ce'/>
<id>urn:sha1:5af4ba9c0f47099623994f69cf2edda80f12b5ce</id>
<content type='text'>
Replace the `setq yas-snippet-dirs` with `list` function for better
readability and add `yas-reload-all` to ensure snippets are
reloaded. Remove `ivy-yasnippet` configuration as it is not
required.
</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:programming: Enhance language-specific keybindings and setup</title>
<updated>2025-10-20T21:17:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-20T21:17:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=df4469f231e86877b7d055bf989220a5fbc0a763'/>
<id>urn:sha1:df4469f231e86877b7d055bf989220a5fbc0a763</id>
<content type='text'>
Add language-specific keybindings and configurations for C, Go,
Python, and shell scripting panels. Introduce system utility
function declarations and improve keybinding consistency across
languages. Implement keybindings for debug, format, and static
analysis tools tailored to each programming language, enhancing the
developer experience and workflow efficiency.
</content>
</entry>
<entry>
<title>feat: prog-general: integrate LSP for improved code intelligence</title>
<updated>2025-10-20T20:00:02+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-10-20T20:00:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=3a8638a6490a682369f66987fb5aafa4c5acf19d'/>
<id>urn:sha1:3a8638a6490a682369f66987fb5aafa4c5acf19d</id>
<content type='text'>
Add Language Server Protocol support for intelligent code completion
and navigation across multiple languages. Configure `lsp-mode` and
`lsp-ui` packages with performance optimizations and enhanced
completion features.
</content>
</entry>
</feed>
