10 Package Reference

10.1 Package Reference

Auto-generated from ;;; @doc markers immediately above each (use-package …) form in lisp/init-*.el. To change a description, edit the source file and run just docs-refresh-packages.

See the module-level narrative under Architecture → Modules for higher-level grouping.

10.1.1 init-core.el — Core baseline

10.1.1.1 emacs (built-in / Nix)

Sane defaults for the bare editor — fill column, dialog/box use, lockfiles, recursive minibuffers, case-insensitive completion.

10.1.1.2 saveplace (built-in / Nix)

Persist point per file across sessions. Built-in.

10.1.1.3 files (built-in / Nix)

Built-in file-handling tweaks: no auto-save side files, no backup ~ files, no kill-process confirmation, plus a hook that auto-creates missing parent directories on find-file.

10.1.1.4 repeat (built-in / Nix)

Repeat-mode lets you press the trailing key alone after a prefix command (e.g. C-x o o o instead of C-x o C-x o). Built-in, enabled globally. repeat-exit-timeout' clears the transient map after two idle seconds so the user doesn't have to think about exiting it --- the ergonomic "one-shot modifier" pattern. The built-in maps cover window resizing too (resize-window-repeat-map’), so C-x ^ ^ v' just works; init-keys.el only adds a map for the Emacs 31 window-layout-*’ commands.

10.1.1.5 uniquify (built-in / Nix)

Disambiguate same-name buffers by directory prefix instead of the default <2> suffix. forward style mirrors the path.

10.1.1.6 ibuffer (built-in / Nix)

Replace list-buffers (C-x C-b) with the more capable ibuffer: dired-style filter/mark/operate on buffers.

10.1.1.7 ffap (built-in / Nix)

Tame find-file-at-point so an unknown hostname doesn’t block the editor on a DNS lookup — reject means "treat as not a host".

10.1.1.8 time (built-in / Nix)

Built-in world-clock for cross-timezone scheduling. Loaded on demand only.

10.1.1.9 exec-path-from-shell

Inherits PATH, MANPATH, and other shell-managed vars from the user’s login shell so GUI / launchd / systemd-spawned Emacs matches what the terminal sees. module.nix prepends Nix-store binaries (rg, fd, git, jj, zoxide, coreutils) to the wrapper’s PATH — this picks up ~/.nix-profile and user toolchains.

10.1.1.10 autorevert (built-in / Nix)

Auto-revert buffers when the underlying file changes on disk — essential for branch switches and external edits. Also covers non-file buffers (dired, magit) so they refresh too.

10.1.1.11 recentf (built-in / Nix)

Built-in recently-visited files list. Used by consult-recent-file and the bookmarks UI; state file lives under var/ to keep the repo root clean.

10.1.1.12 savehist (built-in / Nix)

Persist minibuffer history (M-p / M-n, vertico ordering, etc.) across sessions. Built-in, enabled globally.

10.1.1.13 bookmark (built-in / Nix)

Built-in bookmark store. State file is themed under var/ so it joins the rest of Jotain’s persistent state. save-flag 1 writes on every change so an Emacs crash never loses bookmarks; the fringe glyph is suppressed because it adds visual noise without info.

10.1.1.14 isearch (built-in / Nix)

Lazy-count isearch matches in the prompt — "(3/12)" tells you where you are without leaving the search.

10.1.1.15 shr (built-in / Nix)

Built-in HTML renderer used by eww, gnus, elfeed. Suppress page colours and proportional fonts so rendered HTML inherits the theme and the user’s monospace face — better contrast, predictable layout.

10.1.1.16 gnutls (built-in / Nix)

Built-in GnuTLS. Harden TLS connections: verify server certificates and raise an error instead of silently continuing when verification fails (gnutls-verify-error), and require a strong Diffie-Hellman prime so weak key exchanges are rejected (gnutls-min-prime-bits).

10.1.1.17 nsm (built-in / Nix)

Built-in Network Security Manager. network-security-level ’high applies the strictest connection checks (certificate changes, weak ciphers, downgrades); the settings file is themed under var/ to keep the repo root clean.

10.1.2 init-keys.el — Global keys

10.1.2.1 emacs (built-in / Nix)

Top-level rebindings — disable accidental suspend (C-z and C-x C-z), put other-window on M-o for one-key window switching, bind C-x j to the two-window rotate helper above, and rebind C-g to the DWIM quit so it closes minibuffers from elsewhere.

10.1.2.2 windmove (built-in / Nix)

Built-in directional window switching — Shift-<arrow> moves focus between split windows. Ships with Emacs; no reason not to turn it on globally.

10.1.3 init-ui.el — UI: theme, modeline, fonts

10.1.3.1 auto-dark

Flips between jotain-theme-light and jotain-theme-dark following the system appearance — works on macOS, GNOME, and anything that exposes a dark/light setting. C-c t toggles manually.

10.1.3.2 doom-modeline

A dense, IDE-style modeline with LSP/eglot status, project buffer info, and Nerd Font glyphs. Loaded after init so the primary frame doesn’t redraw before fonts are ready.

10.1.3.3 emoji (built-in / Nix)

Built-in emoji picker (Emacs 29+): C-x 8 e e' inserts by name, C-x 8 e s’ searches, C-x 8 e l' opens the full list, C-x 8 e d’ describes the emoji at point. ‘which-key’ surfaces the prefix.

10.1.3.4 display-line-numbers (built-in / Nix)

Built-in line numbers — only on programming and config buffers, never on prose or org files where they’re noise. Honour the ‘jotain-line-numbers-in-prog’ toggle so users can flip it off without editing this file.

10.1.3.5 pixel-scroll (built-in / Nix)

Built-in smooth scrolling, plus the scrolling behaviour tuning from James Cherti’s "Enhancing Emacs Scrolling" (jamescherti.com). pixel-scroll-mode' (the newcomers-presets theme's choice) smooths mouse-wheel scrolling; the theme deliberately prefers it over pixel-scroll-precision-mode’, which it leaves off citing bug#69972. fast-but-imprecise-scrolling' lets large jumps skip exact intermediate fontification --- a worthwhile redisplay win on this integrated-GPU Intel machine. scroll-conservatively’ 20 scrolls just enough to keep point visible instead of eagerly recentering (0, the default, is too eager); auto-window-vscroll' nil avoids random half-screen jumps on long lines; scroll-error-top-bottom’ moves point to the buffer edge before signalling; and the hscroll-*' pair steps horizontal scrolling one column at a time. (scroll-preserve-screen-position’ is set in init-core.el.)

10.1.3.6 hl-line (built-in / Nix)

Built-in current-line highlight — on for code and prose, off in shells/dired where it would fight the cursor.

10.1.3.7 paren (built-in / Nix)

Built-in matching-paren highlight. Tuned to flash quickly and highlight even when point is just outside the pair.

10.1.3.8 which-key (built-in / Nix)

Built-in keybinding cheatsheet. After a prefix key, displays a paged list of completions in the echo area. Discoverability multiplier — a Jotain staple.

10.1.3.9 calendar (built-in / Nix)

Built-in calendar. Configured for ISO week numbering and a Monday week start so it agrees with how the rest of Europe thinks about dates.

10.1.3.10 nerd-icons

Provides the Nerd-Font glyph alphabet that the rest of the nerd-icons-* family draws on. Picks the font family from jotain-font-preferences so the icons match the editor face.

10.1.3.11 nerd-icons-corfu

Decorates corfu candidates with a kind-specific glyph in the margin, so completions are scannable at a glance.

10.1.3.12 nerd-icons-completion

Adds Nerd-Font icons to marginalia annotations (file/buffer category icons in completion lists).

10.1.3.13 nerd-icons-ibuffer

Adds Nerd-Font glyphs to ibuffer rows so buffer types are visually distinguished at a glance.

10.1.3.14 hl-todo

Highlights TODO / FIXME / HACK / NOTE / XXX keywords in code with a face that survives theme changes.

10.1.3.16 pulsar

Pulses a coloured highlight when point jumps a long distance (other-window, xref, consult-line). Tells the eye where the cursor went without staring.

10.1.3.17 rainbow-delimiters

Colourises matching parens by depth in Lisp buffers — almost essential for navigating deeply nested forms.

10.1.3.18 indent-bars

Vertical indent guides for code, treesit-aware so the bars follow real syntactic indentation. Toggle via ‘jotain-indent-bars-enabled’.

10.1.4 init-tabs.el — Workspace tabs

10.1.4.1 tab-bar (built-in / Nix)

Built-in frame-local tab bar — used as a workspace switcher. Bar hides itself when only one tab exists, so single-window sessions are unaffected.

10.1.5 init-help.el — Help system

10.1.5.1 help (built-in / Nix)

Built-in help window. Auto-focus so you can scroll or dismiss with q/n/p without reaching for the mouse.

10.1.5.2 help-at-pt (built-in / Nix)

Built-in echo-area tooltips on buttons and links when point lingers — discoverability for the parts of Emacs that aren’t plain text.

10.1.5.3 apropos (built-in / Nix)

Built-in apropos. Bumped to "search everything" so it surfaces faces, classes, and customs alongside functions and variables.

10.1.5.4 helpful

Replaces the default describe-* commands with richer buffers that include source, callers, examples, and active keybindings — the single biggest discoverability upgrade in Emacs.

10.1.6 init-editing.el — Editing primitives

10.1.6.1 elec-pair (built-in / Nix)

Auto-insert matching delimiters as you type. Built-in.

10.1.6.2 delsel (built-in / Nix)

When a region is active, typing replaces it instead of leaving the selection alone. Built-in, on by default in most modern editors — Emacs needs this opt-in.

10.1.6.3 simple (built-in / Nix)

Two small built-in editing knobs. kill-region-dwim' makes C-w with no active region kill a word backwards instead of erroring; delete-pair-push-mark’ leaves a mark on the former pair contents so C-x C-x re-selects them. Both are Emacs 31+, guarded so the config loads on Emacs 30.

10.1.6.4 whitespace (built-in / Nix)

Strip trailing whitespace and stray tabs on save without reformatting the rest of the buffer. Built-in. Skipped during super-save’s automatic saves so its except-current-line handling keeps whitespace at point intact.

10.1.6.5 subword (built-in / Nix)

Treats CamelCase / snake_case word parts as separate words for M-f / M-b / M-d. Built-in. Programming-mode only — prose still gets whole-word motion.

10.1.6.6 newcomment (built-in / Nix)

Defaults for the built-in comment commands (M-;, C-x C-;, M-j). comment-multi-line' makes M-j continue inside an open block comment instead of closing/reopening; extra-line’ style puts opening and closing delimiters on their own lines for comment-region'; comment-empty-lines’ makes comment-region' treat blank lines the same as content lines; comment-auto-fill-only-comments’ keeps automatic line wrapping (when auto-fill-mode' is on) confined to comments. C-c ; is an ergonomic alias for comment-line’ — C-; is taken by embark-dwim. Deliberate tradeoff: org-mode shadows C-c ; with ‘org-toggle-comment’, which is the org equivalent anyway. Per-mode overrides go in the language module via a named hook: (defun my-foo-mode-setup () (setq-local comment-multi-line nil)) (add-hook ’foo-mode-hook #’my-foo-mode-setup)

10.1.6.7 emacs (built-in / Nix)

Bindings for the two transpose commands Emacs ships without defaults, so the prose-level family (sentence, paragraph) is reachable alongside the built-in C-t (chars), M-t (words), C-x C-t (lines), and C-M-t (sexps, tree-sitter aware in Emacs 30+). Caveat: transpose-lines works on real newlines, so it gives surprising results under visual-line-mode where wrapped "lines" are visual only.

10.1.6.8 replace (built-in / Nix)

Emacs 30 ships replace-regexp-as-diff' and multi-file-replace-regexp-as-diff’ — run a regex replacement, but see the result as a unified diff first and either apply it as a patch or abort. Worth reaching for on any non-trivial refactor. The dired-marked variant is bound in ‘init-navigation.el’.

10.1.6.9 expreg

Treesit-aware semantic region expansion. Smaller, faster successor to expand-region; produces better expansions with much less code now that treesit is everywhere.

10.1.6.10 multiple-cursors

Visual multi-cursor editing. C-> and C-< select the next/prev occurrence; C-S-c C-S-c selects every occurrence in the buffer.

10.1.6.11 vundo

Visual undo tree on C-x u. Stateless — no .undo-tree side files cluttering the filesystem like undo-tree.el used to leave behind.

10.1.6.12 super-save

Auto-saves buffers when idle and on focus loss, writing the actual file rather than #foo# auto-save side files. Also strips trailing whitespace except on the current line so you don’t fight your own cursor.

10.1.6.13 re-builder (built-in / Nix)

Make M-x re-builder' use string syntax --- the same form you'd paste into re-search-forward’ — instead of the default ‘read’ syntax that requires escaping every backslash twice.

10.1.6.14 keyfreq

Counts command invocations to disk; M-x keyfreq-show ranks the busiest commands so you can spot rebinding opportunities. Tiny, no daemon, no network.

10.1.7 init-completion.el — Minibuffer + in-buffer completion

10.1.7.1 minibuffer (built-in / Nix)

Built-in minibuffer customisation: detailed annotations and historical sorting (Emacs 30) so frequent commands surface first.

10.1.7.2 orderless

Fuzzy, space-separated, order-independent completion. Pairs with partial-completion (path globbing) so /u/s/a matches /usr/share/applications. The single most important UX win in the minibuffer.

10.1.7.3 vertico

Vertical, performant minibuffer completion UI. Replaces the default *Completions* buffer with an inline list. The whole minibuffer experience hinges on this.

10.1.7.4 vertico-directory (built-in / Nix)

Path-savvy editing in vertico — RET enters a candidate directory, DEL/M-DEL delete a path component instead of one character. Bundled with vertico.

10.1.7.5 vertico-multiform (built-in / Nix)

Per-category and per-command display modes (grid for files, buffer for line/grep so the preview window has room). Bundled with vertico.

10.1.7.6 vertico-buffer (built-in / Nix)

Lets vertico render in a regular buffer instead of the minibuffer — used by vertico-multiform for consult-line and the grep family so candidates have room to breathe.

10.1.7.7 vertico-posframe

vertico-posframe renders the vertico candidate list in a floating child frame instead of the minibuffer window, giving minibuffer completion the same surface treatment as the corfu popup. Driven through vertico-multiform (the t' catch-all in the categories above) rather than a global vertico-posframe-mode, per upstream: multiform toggles the mode per session, and the entries above it keep their own displays (file grid, consult-line and the grep family buffer). On a tty (ghostel, nix-on-droid) posframe cannot work, so vertico stays in the plain minibuffer. M-P’ in the minibuffer toggles the posframe display per session.

10.1.7.8 marginalia

Adds annotation columns (file size, mode, docstring, …) to every completion list. Pairs with vertico to make minibuffer choices self-explanatory.

10.1.7.9 consult

Consult provides preview-as-you-go variants of nearly every Emacs lookup: buffer switch, line jump, grep, recent files, imenu, flymake, register store. The big binding table below replaces a dozen built-ins with a single, consistent UI.

10.1.7.10 embark

Right-click for the keyboard. C-.' (embark-act) on any candidate --- file, symbol, region, buffer, command name, URL --- opens a menu of actions valid for that thing; C-;’ (embark-dwim) skips the menu and runs the default action (visit the file, browse the URL, jump to the definition). Press C-h' after C-.’ to turn the menu into a searchable completing-read' --- the best way to discover what applies. Inside the menu i’/w' insert or copy the candidate, A’ (embark-act-all) acts on every candidate at once, and B' (embark-become) re-runs the typed input through another command; C-u C-.’ keeps the minibuffer open for successive actions. ‘C-h B’ replaces describe-bindings with a paged view.

10.1.7.11 embark-consult

Glue between embark and consult — teaches embark-export' to turn a consult result list into the right major mode: consult-grep and consult-ripgrep become a grep buffer, consult-line an occur buffer, file candidates a dired buffer, buffer candidates an ibuffer buffer. The grep/ripgrep export is the classic search → C-c C-o’ → wgrep (‘C-x C-q’) refactor flow that edits every match in place across all the matched files.

10.1.7.12 avy

Tree-style char/word/line jumping. Bound under M-g so it sits next to the goto family. Multi-frame aware.

10.1.7.13 zoxide

Frecency-ranked directory jump (like the shell zoxide). Adds visited files automatically; M-g z surfaces the most-recent matches first.

10.1.7.14 emacs (built-in / Nix)

TAB indents and completes. tab-always-indent' is complete’ (unless jotain-completion-free-tab' is set, which restores the stock t’ – indent only): TAB first indents the line, and once the line is already indented indent-for-tab-command' runs completion-at-point’, opening the corfu popup. Inside the popup TAB is repointed to corfu-insert' (see the corfu block below), so a second TAB accepts the candidate -- the same open-then-accept gesture as C-M-i’ (jotain-completion-key'), which stays bound as a GUI-safe alternative. tab-first-completion’ stays at its default nil (complete right after indenting); set it to e.g. ‘word’ if you want TAB not to complete immediately after typing a word.

10.1.7.15 corfu

In-buffer completion popup — the corfu equivalent of company. The popup appears on its own only in the modes listed by jotain-completion-auto-modes' (default: programming modes), so prose stays quiet. Two keys open-and-accept, used twice each: with no popup they run completion-at-point’ and open the popup; with the popup showing they insert the selected candidate. TAB is one of them (via tab-always-indent' complete’ to open, and corfu-map's TAB rebound to corfu-insert’ to accept), and C-M-i' (jotain-completion-key’) is the GUI-safe alternative. RET stays unbound in corfu-map', so Enter always inserts a newline even while the popup is showing. The top candidate is always preselected (corfu-preselect’ first'), so it is highlighted and ready the instant the popup opens; the accept key commits it (the map's ’ is repointed from corfu-complete' to corfu-insert’, which finishes the completion and expands a snippet). M-n'/M-p’ move, C-g' dismisses. Set jotain-completion-free-tab’ to restore the stricter "TAB indents only" behaviour.

10.1.7.16 corfu-history (built-in / Nix)

Persists corfu’s pick history into savehist so frequent completions float to the top across sessions. Bundled with corfu.

10.1.7.17 corfu-popupinfo (built-in / Nix)

Documentation panel beside the popup — a child frame that shows the selected candidate’s docstring or source location, the way an IDE shows a detail pane. Off unless jotain-completion-doc-popup' is non-nil. The delay is a cons (INITIAL . SUBSEQUENT): it waits a beat before first appearing so it does not flash on every pause, then refreshes quickly as you move between candidates. Bundled with corfu; binds only M-t’/M-h'/M-g’/C-M-v', so it never touches the freed RET/TAB or the M-n’/‘M-p’ navigation keys.

10.1.7.18 cape

Completion-at-point Extensions — extra capf functions (dabbrev, file path, keyword) that feed corfu when the major mode’s own capf finds nothing useful. These three go on the global completion-at-point-functions' so they act as fallbacks after the buffer-local, major-mode capfs run. cape-elisp-symbol’ is instead added buffer-locally in Elisp buffers, where it completes symbols even inside comments and docstrings (out there ‘elisp-completion-at-point’ only fires in code), without polluting completion elsewhere.

10.1.7.19 completion-preview (built-in / Nix)

Inline completion preview — the built-in completion-preview-mode' (Emacs 30, extended in 31). It greys out the most likely completion after point as you type, the way a modern editor does, drawing its candidate from the same completion-at-point-functions’ the corfu popup uses. Enabled globally via global-completion-preview-mode' (adopted from the newcomers-presets theme), so the ghost text appears in every buffer --- prose, shells, and the minibuffer included; on the Emacs 30.1 floor, which has no globalized variant, it falls back to the per-mode jotain-completion-auto-modes’ hooks. Gated on jotain-completion-inline-preview'. RET is never bound by the mode, so Enter always stays a newline. TAB tracks jotain-completion-free-tab’: by default the mode’s shipped C-i' (which IS the TAB event) → completion-preview-insert’ binding is kept, so when only the ghost text shows (no popup yet) TAB accepts it – the modern-editor feel; with the strict "TAB indents only" opt-in that binding is removed so TAB still only indents. M-RET' also accepts the whole preview, and M-i’ just the common prefix. The preview is suppressed inside comments and strings, and its sort is paired with corfu’s so the ghost text matches the popup’s top row.

10.1.8 init-navigation.el — dired, project, windows

10.1.8.1 dired (built-in / Nix)

Built-in directory editor — Jotain’s primary file manager. The custom block below tames cross-platform ls quirks (BSD on macOS lacks --group-directories-first and --dired). M-s R previews a regex replacement across the contents of all marked files as a unified diff (Emacs 30’s dired-do-replace-regexp-as-diff'). !’/&' hand the file under point to the OS default application (open’/xdg-open'/start’) via ‘dired-guess-shell-alist-user’; files can also be dragged out to desktop apps with the mouse.

10.1.8.2 dired-x (built-in / Nix)

Built-in dired extras — dired-omit-mode hides dotfiles and cache directories so dired listings show only the things you actually want to see.

10.1.8.3 dired-async

Async file ops for dired — wraps dired-do-copy, dired-do-rename, dired-do-symlink, dired-do-hardlink so they fork into a subprocess instead of blocking the main Emacs. Multi-GB copies no longer freeze the UI; the mode-line shows progress and a message fires on completion.

10.1.8.4 dired-rsync

rsync from dired — bound to C-c C-r in dired-mode-map. Best for very large transfers or TRAMP sources/destinations: hands marked files to rsync in an async shell buffer with live progress. Uses --progress (not --info=progress2) so stock macOS rsync 2.6.9 still works; noisier output, but portable.

10.1.8.5 ls-lisp (built-in / Nix)

Pure-Lisp ls emulation. Fallback for macOS without GNU coreutils — gives us folders-first sorting that BSD ls cannot produce.

10.1.8.6 wdired (built-in / Nix)

Built-in writable dired — C-c C-e turns the dired buffer into a regular text buffer where you can rename/chmod files with the usual editing commands. Save to commit changes.

10.1.8.7 diredfl

Pretty colours for dired (font-locks files by type, age, executability). Pure cosmetic, big readability win.

10.1.8.8 dired-narrow

Live filter dired buffers by typing a fragment after /. Faster than re-running ls with a glob.

10.1.8.9 trashed

Browse the system trash bin from inside Emacs. With delete-by-moving-to-trash set in init-core, every dired deletion is recoverable through M-x trashed.

10.1.8.10 pretty-sha-path

Shortens /nix/store/abc123-foo-1.0 to …foo-1.0 in dired and shell buffers — purely cosmetic, but transformative on a system that’s mostly Nix store paths.

10.1.8.11 dirvish

Modern dired front-end with previews, side panels, and miller columns. Overrides plain dired so every C-x d benefits. TAB' on a directory expands its contents inline as a subtree (dirvish-subtree-toggle’); <backtab>' opens the subtree management transient (dirvish-subtree-menu’). This uses dirvish’s own subtree engine — the standalone dired-subtree' package is deliberately not loaded, because dirvish's subtree-state’ attribute and revert pipeline are built around dirvish-subtree' and the two engines corrupt each other's overlays when combined. dirvish-side’ (C-c D) already provides the docked side-tree that Emacs 31’s new ‘speedbar-window’ offers, so speedbar is intentionally not wired up here.

10.1.8.12 winner (built-in / Nix)

Built-in window-layout undo/redo — pairs with the toggle helper below so C-x 1 becomes a reversible "expand this window" command.

10.1.9 init-casual.el — Transient menus (casual)

10.1.9.1 casual

Discoverable Transient menus over built-in tools: dired, calc, isearch, ibuffer, and Info. Each menu is bound to C-o' in its own mode map (’ for isearch, whose ‘C-o’ is already meaningful), so the menus stay out of the global keymap and act on the current mode. Builds on the transient library magit already pulls in.

10.1.10 init-vc.el — Version control

10.1.10.1 vc (built-in / Nix)

Built-in version control. Pinned to Git + Jujutsu — every other backend is a slow startup tax (probes every visited file’s parents) you almost never benefit from. JJ is supplied by vc-jj' below; without it in this list the backend never gets consulted and project.el won't discover .jj’ roots.

10.1.10.2 vc-git (built-in / Nix)

Quick jump to a file git status reports as changed. Runs git status --porcelain=v1 -z -uall' (-z keeps spaces and non-ASCII paths intact; -uall forces untracked listing regardless of status.showUntrackedFiles) and offers M/A/R/C/U/T/?? entries through completing-read’. Adapted from Rahul M. Juliato’s emacs-solo/switch-git-status-buffer.

10.1.10.3 vc-jj

Jujutsu (jj) backend for built-in vc' and project’. Adds the JJ entry pinned in vc-handled-backends' above, so C-x v …’, the modeline VC state, and project.el' all light up on jj repos (typically colocated with git). The jj side wants [ui] diff-formatter = ":git" conflict-marker-style = "git" set via jj config edit –user’ so vc/diff-hl/smerge read jj diffs and conflicts in the format they expect.

jotain-switch-jj-status-buffer' (C-x J --- not C-x C-j, which stays on its Emacs 28+ default dired-jump’) is the jj twin of the git status jump above: it parses jj diff --summary -r @' and offers the changed files (deletions omitted --- the file is gone) through completing-read’. The richer interactive view is ‘majutsu’ (C-c j).

10.1.10.4 magit

The Git porcelain. Bound C-x g for status, C-x M-g for global dispatch, C-c g for the file-specific menu. Refined hunks + whitespace-ignoring diffs are turned on globally.

10.1.10.5 majutsu (built-in / Nix)

The Jujutsu porcelain — a magit-style interface for jj, sitting alongside magit (jj is normally colocated with git, so both apply). C-c j opens the status/log buffer (majutsu-log', aliased majutsu’); C-c M-j opens the top-level transient dispatcher. Provided by Nix (nix/extra-packages.nix), so ‘:ensure nil’.

10.1.10.6 magit-todos

Surfaces TODO/FIXME/HACK comments as a section in magit-status. Scan depth pinned to 1 so it stays fast on large repos.

10.1.10.7 forge

PRs, issues, and reviews from GitHub/GitLab/Forgejo inside magit. Uses the Emacs-30 built-in sqlite so no external emacsql binary is needed. Auth via ~/.authinfo.gpg (machine api.github.com login USER^forge password ghp_…).

10.1.10.8 transient (built-in / Nix)

Built-in transient menu system that magit/forge are built on. Themed under var/ so its three state files don’t drop at the repo root.

10.1.10.9 diff-hl

Fringe indicators for added/changed/removed lines in the buffer you’re editing. diff-hl-flydiff-mode updates pre-save so the indicators reflect uncommitted edits, not just the last save.

10.1.10.10 diff-hl-dired (built-in / Nix)

Dired integration for diff-hl — shows VC change indicators next to files in dired listings. Kept in its own block rather than the diff-hl' :hook above because diff-hl-dired-mode’ lives in diff-hl-dired.el', not the package's main file: hooking it from the diff-hl’ block makes use-package autoload it from "diff-hl", which does not define it, so with stale package autoloads (e.g. a ‘var/package-quickstart.el’ caching old /nix/store paths) the hook errors and empties every dired buffer. Naming the correct feature here pins the autoload to the right file.

10.1.10.11 ediff (built-in / Nix)

Built-in interactive diff. Configured with plain window setup so the control panel doesn’t pop a separate frame, plus whitespace-ignoring diffs for less merge noise.

10.1.11 init-prog.el — prog-mode, treesit, eglot

10.1.11.1 prog-mode (built-in / Nix)

Built-in prog-mode parent. Just turns on the fill-column indicator — hl-line and show-paren live in init-ui so they apply outside programming buffers too.

10.1.11.2 treesit (built-in / Nix)

Built-in tree-sitter substrate. Bumped to font-lock level 4 to enable every available syntactic decoration.

10.1.11.3 jit-lock (built-in / Nix)

Defer fontification of newly exposed text by a few hundredths of a second so heavy treesit level-4 font-lock never blocks keystrokes or scrolling. Pairs with ‘redisplay-skip-fontification-on-input’ (set in init-core) — matters more on this slower Intel CPU.

10.1.11.4 treesit-fold

Code folding driven by treesit syntax nodes — folds along functions/classes/blocks instead of indentation guesses. Fringe indicators show fold state.

10.1.11.5 combobulate (built-in / Nix)

Structural editing via treesit (move/clone/raise nodes, transpose siblings). Heavy enough to be opt-in per buffer via M-x combobulate-mode or .dir-locals.el. Provided by Nix.

10.1.11.6 eglot (built-in / Nix)

Built-in LSP client. Per-language eglot-ensure hooks live here so all LSP wiring is visible in one place; per-language mode regexes stay in their init-lang-* file. C-c r is the refactor prefix (rename/format/code-actions).

Beyond the curated hook list, jotain-prog--maybe-eglot-ensure' auto-starts eglot for ANY project file whose language server is on the buffer's (envrc-applied) PATH --- so enabling languages.X.enable’ in a project’s devenv lights up its LSP in Emacs with no per-language config.

10.1.11.7 eglot-booster (built-in / Nix)

Wrap local stdio language servers in emacs-lsp-booster, which converts server JSON into Elisp bytecode Emacs reads directly and buffers I/O so a busy server can’t block the UI. Function-valued contacts (the rass resolvers above) are boosted at their result, so multiplexed sessions are boosted too. The binary rides the distribution wrapper PATH (nix/runtime-deps.nix), not a devenv: the mode resolves it once at enable time, before any buffer-local exec-path exists. Only local stdio servers are boosted — a server over TRAMP needs the binary on the remote host (eglot-booster-no-remote-boost' below leaves remote contacts unboosted, since it defaults to nil and would otherwise prepend the booster command and break remote M-x eglot’), and network-port servers are never boosted. Provided by Nix (not on MELPA); ‘:if’ skips the block cleanly in the MELPA-fallback launch where the library is absent.

10.1.11.8 consult-eglot

Consult-driven workspace symbol search — C-M-. opens an orderless-filtered list of symbols across the LSP workspace.

10.1.11.9 consult-eglot-embark

Embark integration for consult-eglot — gives every workspace symbol an action menu (jump to def, find refs, rename, …).

10.1.11.10 dape

Debug Adapter Protocol client — the debugging counterpart to eglot. Ships adapter configs for dlv (Go), debugpy (Python), codelldb (Rust/C/C++), and more; the adapter binary (e.g. dlv) comes from the project/host PATH, same convention as the LSP servers. C-x C-a is the prefix (the gud convention); stepping commands carry repeat-maps, so C-x C-a n n n keeps stepping.

10.1.11.11 flymake (built-in / Nix)

Built-in inline diagnostic display. Indicator chars (! ? ·) and end-of-line message rendering keep diagnostics legible without opening a side window: ‘short’ shows only the most severe diagnostic per line, so a busy line stays readable. M-n / M-p navigate.

10.1.11.12 eldoc (built-in / Nix)

Built-in echo-area documentation. Single-line display plus small idle delay so it feels responsive without flashing while you type.

10.1.11.13 xref (built-in / Nix)

Built-in cross-reference engine. Pinned to ripgrep (in the devenv shell) for orders-of-magnitude faster project-wide lookups than default grep.

10.1.11.14 imenu (built-in / Nix)

Built-in symbol index (the source behind consult-imenu', M-g i). imenu-auto-rescan’ reparses the buffer on each invocation so the index never goes stale after you add or rename a definition.

10.1.11.15 tagref (built-in / Nix)

Cross-reference checker for [tag:x]'/[ref:x]’ directives. Adds completion, xref navigation (M-. jumps from a ref to its tag, M-? finds references), and M-x tagref-check' (clickable compilation buffer). Needs the tagref’ CLI on PATH (dev shell / Home Manager wrapper). Provided by Nix (not on MELPA).

10.1.11.16 compile (built-in / Nix)

Built-in compile / recompile. Auto-scroll until the first error and skip the "save?" prompt — the annoying defaults that make people reach for projectile or compilation-multi alternatives.

10.1.11.17 editorconfig (built-in / Nix)

Honour .editorconfig files (indent style/width, line endings, trailing whitespace). Built-in since Emacs 30.

10.1.11.18 apheleia

Async format-on-save through external formatters (ruff, nixfmt, rustfmt, prettier, …). Replaces hand-rolled per-language hooks with one place to look. Per-buffer override safe-local-variable lets .dir-locals.el opt out.

10.1.11.19 wgrep

Edit grep / ripgrep result buffers in place; saving propagates edits to every matched file. Powers the project-wide refactor flow: consult-ripgrep → C-c C-o (embark-export) → C-x C-q (wgrep) → edit → C-c C-c.

10.1.11.20 dtrt-indent

Detect indentation width from file contents — saves us from having to special-case every project’s tab/space convention.

10.1.12 init-snippets.el — Tempel snippets

10.1.12.1 tempel

Lightweight template/snippet engine from the corfu/cape author. Templates are read from templates/*.eld' (keyed by major mode); M-+’ completes a snippet by name, M-*' inserts one interactively, and once fields are active M-}’/M-{' or C-M-n’/C-M-p' move between them, with M-RET’ to finish. TAB is deliberately not a field-navigation key – it indents and drives completion instead, so it never fights the snippet fields. Set jotain-completion-snippets' to nil to keep snippet names out of the completion popup; M-+’ and ‘M-*’ still work.

10.1.12.2 eglot-tempel

Lets Tempel expand the snippets language servers send back (e.g. function-argument placeholders from rust-analyzer / pyright). ‘eglot-tempel-mode’ must be enabled before eglot connects, so it is armed the moment eglot loads rather than after the first session.

10.1.13 init-project.el — Per-project commands

10.1.13.1 project (built-in / Nix)

Built-in project tracker. Extra root markers below mean a project is recognised when any of these is present, not just on a VCS root. Project list lives under var/. C-x p P' scans jotain-repositories-roots’ to add+open projects not yet in the known list.

10.1.13.2 project-nix-store (built-in / Nix)

project.el' backend for the Nix (and Guix) store: each /nix/store’ path that is a directory becomes a project root, so project-find-file' jumps between files under the same store path while reading a dependency's source. project-nix-store-try’ is registered ahead of the built-in ‘project-try-vc’ (upstream’s performance advice), and store paths are kept out of the saved project list.

10.1.13.3 projection

.dir-locals.el-driven per-project commands (configure, build, test, run, package, install) auto-detected from Makefile/justfile/Cargo.toml/etc and exposed under C-x P.

10.1.13.4 projection-multi

Bridges projection with compile-multi: project-prefix RET picks from every named compile command available in this project.

10.1.13.5 projection-multi-embark

Embark menu for projection-multi entries — pin a command, preview output, etc.

10.1.13.6 compile-multi

Per-major-mode picker for named compile commands ("go test", "pytest file", "nix flake check", …). Complement to projection, kept side by side because neither system fully covers the other.

10.1.13.7 consult-compile-multi

Renders compile-multi pickers through consult — gives you orderless filtering and preview on every "what command should I run?" prompt.

10.1.13.8 compile-multi-nerd-icons

Decorates compile-multi entries with nerd-font glyphs for the command type — purely visual, but a useful at-a-glance hint.

10.1.13.9 compile-multi-embark

Embark actions on compile-multi entries (run, copy, edit command line). Mirrors the projection embark integration.

10.1.14 init-devenv.el — devenv.sh integration

10.1.14.1 devenv (built-in / Nix)

Native devenv.sh integration (the in-repo lisp/devenv.el library). C-c v opens a transient with task and script runners, devenv test/build through compilation-mode with Nix error matching, a process-manager dashboard (start/stop/restart/logs), and environment introspection (devenv eval/info/search). devenv-reload re-runs devenv print-dev-env and re-applies the environment buffer-locally via the native loader (devenv-env-global-mode), and offers to reconnect eglot servers. devenv.nix buffers are routed to the bundled devenv lsp server while nil keeps serving other Nix files, and devenv-mcp-setup registers the project’s devenv mcp server with mcp.el so gptel can call its tools. devenv-allow/devenv-revoke manage devenv 2.1’s auto-activation trust database, which also gates the native env loader, and devenv-modeline-mode (enabled here) shows the per-buffer status — devenv[on]/[off]/[!] — in the mode line. Everything degrades to a clean error when the devenv binary is not on PATH.

10.1.15 init-ai.el — AI assistants

10.1.15.1 claude-code-ide (built-in / Nix)

Agentic multi-file editing through the Claude Code CLI. Bound to C-c q (user-reserved space, so no major mode shadows it) so the menu is one key away whenever a refactor needs more context than a single LSP rename can carry. Provided by Nix (manzaltu/claude-code-ide.el is not on MELPA).

10.1.15.2 eca

Editor Code Assistant — AI pair-programming client (chat, inline completion, rewrite, MCP) talking to an external ‘eca’ server over JSONRPC. The server binary is provided by Nix and found on $PATH, so nothing is downloaded; provider keys come from the environment, same as gptel. C-c e starts a session and opens the chat.

10.1.15.3 gptel

Conversational LLM front-end with multiple backends. OpenRouter — an OpenAI-compatible aggregator fronting Claude, GPT, Gemini, DeepSeek, Qwen, GLM and more behind one key — is the default; direct Anthropic, Gemini and local Ollama backends stay selectable from the C-c S menu. Bound to C-c s / C-c S for quick send and full menu — user-reserved space, so org-mode and friends can’t shadow them. Keys come from the environment first, then auth-source via auth-source-1password.

10.1.15.4 mcp

Model Context Protocol bridge — lets gptel call MCP tools so the LLM can read files, query databases, and act through registered servers. Loaded on demand via its autoloads (‘devenv-mcp-setup’, M-x mcp-connect-server) — nothing here forces a load.

10.1.16 init-shell.el — Shells

10.1.16.1 eshell (built-in / Nix)

Built-in Lisp-driven shell — works the same on every platform and is the right tool for Emacs-flavoured pipelines (commands as Elisp functions, no subprocess for builtins).

10.1.16.2 comint (built-in / Nix)

Built-in REPL substrate (used by python, ielm, sql, etc.). The settings here apply to every comint-derived buffer.

10.1.16.3 ielm (built-in / Nix)

Built-in Emacs Lisp REPL. Emacs 31+ can persist input history across sessions like comint/shell already do; point it at a file under ‘var/’. Guarded so the config loads on Emacs 30.

10.1.17 init-terminal.el — Terminal support

10.1.17.1 ghostel

Terminal emulator powered by libghostty-vt (the Ghostty VT engine) via a native dynamic module. Replaces vterm: real PTY for tmux/ncurses/TUI programs, plus shell integration (OSC 7 directory tracking, OSC 133 prompt jumping) injected automatically for bash/zsh/fish. The Nix package builds the module from source and ships it in the package directory; in a source checkout the module is downloaded into the writable elpa/ dir on first ‘M-x ghostel’.

10.1.17.2 kkp

Kitty Keyboard Protocol — lets terminal Emacs distinguish C-i/TAB, C-m/RET, C-[/ESC, and pass Shift-modified function keys through. Only loaded in tty and daemon sessions — the daemon arm matters because a daemon can later serve ‘emacsclient -nw’ frames; pure GUI sessions skip it entirely.

10.1.17.3 clipetty

OSC 52 clipboard integration. Yank/kill in terminal Emacs reaches the system clipboard even through ssh + tmux.

10.1.18 init-systems.el — Sysadmin tools

10.1.18.1 auth-source-1password

Pulls credentials from the 1Password CLI (op). Once enabled, every package that uses auth-source — magit/forge, gptel, smtpmail, circe — resolves credentials by host against the 1Password vault transparently.

10.1.18.2 sops

Transparent SOPS encrypt/decrypt for YAML/JSON/env files. C-c C-c saves an encrypted edit; C-c C-d toggles into the editing view; C-c C-k cancels.

10.1.18.3 logview

Major mode for log files — level filtering, timestamp parsing, thread highlighting. Configured for SLF4J (Java/Kotlin) and a custom ROS2 submode.

10.1.19 init-writing.el — Prose & notes

10.1.19.1 text-mode (built-in / Nix)

Built-in text-mode tweaks for prose: visual line wrap and hanging indent on wrapped lines. Proportional fonts come from ‘mixed-pitch’ (below); code modes stay monospaced.

10.1.19.2 mixed-pitch

Proportional fonts for prose via the variable-pitch' face, while code, tables, and verbatim spans stay monospaced (fixed-pitch’). This keeps Org tables aligned, where a blanket ‘variable-pitch-mode’ would leave them ragged. Enabled in every text-mode buffer and opted out of the column-sensitive ones: YAML (see init-lang-data), commit messages, and email.

10.1.19.3 jinx

Just-in-time spell check using enchant — no on-save scan, no per-buffer flyspell setup. global-jinx-mode' replaces both flyspell-mode’ and flyspell-prog-mode' in one shot: jinx keys off faces, so in a code buffer it checks only comments and strings and leaves the code alone, no flyspell-prog-mode’ equivalent needed. Enabled from ‘emacs-startup’ rather than a bag of per-mode hooks so prose and code get checked. M-$ corrects the word at point (C-u M-$ walks every misspelling); C-M-$ switches dictionaries. Data/config buffers that only look like prose opt back out in init-lang-data.

10.1.19.4 markdown-mode

Markdown major mode with native code-block fontification, heading scaling, and nested imenu. README.md opens in gfm-mode for the GitHub dialect. markdown-mode’s own commands stay on their C-c C-...' defaults; a parallel C-c m ...’ prefix surfaces the high-traffic ones: markup/image hiding, link and fenced-code insertion, follow-link, heading promote/demote, and the live HTML preview toggle. gfm-mode inherits every binding via its parent map.

10.1.19.5 denote

Plain-text note system with strict file-naming rules so notes are findable years later. Stored under jotain-notes-directory (default ~/Documents/notes), shared with Org (init-org.el).

10.1.19.6 pdf-tools

In-Emacs PDF viewing — search, annotate, follow links, outline. Needs libpoppler at build time, which the emacs-pgtk / emacs-mac variants in nixpkgs already provide.

10.1.20 init-org.el — Org

10.1.20.1 org (built-in / Nix)

Built-in Org — outline, agenda, capture, literate-programming. Treated as a "third-party" package despite being built-in because it’s the size and surface area of one. Capture templates and a small bind table live below.

10.1.20.2 ob-core (built-in / Nix)

Org Babel, configured as a notebook. Enables a curated set of Org-provided languages (see jotain-org-babel-languages'), swaps the blanket evaluation prompt for a trust check --- your notes and project files run on C-c C-c’, a .org' from anywhere else still asks --- and redisplays inline images after every run so :file’ plots refresh in place. Adds a C-c b' notebook prefix in Org buffers: b’ run buffer, e' run subtree, r’ restart session and run buffer, s' switch to session, k’ clear results, t' tangle. Blocks are not re-evaluated during export (:eval never-export’); what you see in the buffer is what gets exported.

10.1.20.3 org-src (built-in / Nix)

Built-in source-block editing (C-c '). Edits open in the current window rather than stealing the frame layout, and indentation is left exactly as written — Org’s default of re-indenting on exit corrupts Python blocks, where leading whitespace is syntax.

10.1.20.4 org-tempo (built-in / Nix)

Built-in <KEY TAB' block expansion, plus entries for the languages this config actually runs --- <py’, <sh', <el’, <sql', <jp’ (Python with a session, for notebook-style work). Org’s own list covers the structural blocks (<s', <q’, ‘<e’); these add the source blocks worth two keystrokes.

10.1.20.5 org-clock (built-in / Nix)

Built-in time tracking with persistence across restarts. Lets you resume an interrupted clock without losing the entry.

10.1.20.6 org-appear

Reveal Org emphasis markers (* _ / ~) only when point is on them — best of both visual worlds: clean reading, easy editing.

10.1.20.7 org-modern

Modern visual styling for Org buffers and agenda — typographic bullets, faux-rendered blocks, agenda decorations.

10.1.20.8 org-roam

Zettelkasten-style note-linking on top of Org. SQLite database auto-syncs in the background; C-c n f / i / c are the three bindings you actually use day-to-day.

10.1.21 init-http.el — HTTP / REST client

10.1.21.1 verb

Org-mode HTTP/REST client. Write requests as Org headings and send them with C-c C-r C-r'; responses (JSON, images, PDF) render in a side buffer. verb-command-map’ is bound under C-c C-r' in Org buffers, per verb's own convention. Loads with Org (:after org’), and since Org itself is deferred until the first ‘.org’ file verb stays off the startup path. url.el-backed, so no external curl/plz dependency.

10.1.22 init-lang-nix.el — Nix

10.1.22.1 nix-ts-mode (built-in / Nix)

Tree-sitter Nix major mode. Nix is the package manager and dev-shell tool the whole config is built around, so it gets a dedicated module even though we don’t write much of it daily. Provided by Nix; format-on-save flows through apheleia → nixfmt (configured in init-prog). A blank-line indent rule fills the gap where tree-sitter leaves an empty line at column 0.

10.1.23 init-lang-rust.el — Rust

10.1.23.1 rust-ts-mode (built-in / Nix)

Built-in tree-sitter Rust mode. Eglot wires rust-analyzer in init-prog, with workspace configuration (clippy on save, build scripts, proc macros) contributed to the global ‘eglot-workspace-configuration’ above; format-on-save runs rustfmt through apheleia.

10.1.24 init-lang-python.el — Python

10.1.24.1 python (built-in / Nix)

Built-in Python mode pinned to its tree-sitter variant so we get the modern parser without any third-party package. The LSP server (pyright/basedpyright/ruff-lsp) comes from the project’s own environment, not from this config. When IPython is on PATH it becomes the REPL — better completion, tracebacks and %magic' for run-python’ and for Org Babel :session' blocks alike --- while one-shot (sessionless) Babel blocks stay on plain python3’.

10.1.25 init-lang-go.el — Go

10.1.25.1 go-ts-mode (built-in / Nix)

Built-in tree-sitter Go modes: go-ts-mode for source files, go-mod-ts-mode for go.mod, go-work-ts-mode (Emacs 31) for go.work. Eglot wires gopls in init-prog, with gopls workspace configuration contributed to the global eglot-workspace-configuration above; format-on-save runs goimports through apheleia; dape drives dlv for debugging. All Go tooling (go, gopls, goimports, dlv) comes from the project/host PATH, not from this config.

10.1.25.2 go-tag

Struct-tag editing (json:"..."', db:"..."’, …). gopls has no equivalent; the underlying gomodifytags' binary comes from the project environment. Bound under the buffer-local C-c C-t’ Go tooling prefix so it never shadows the global ‘C-c t’ theme toggle.

10.1.25.3 gotest

Run the Go test or benchmark at point, the current file’s tests, or the whole project, with compilation-mode error jumping. Complements the project-wide compile-multi "go test" commands with single-test / single-file runs. Shares the mode-local ‘C-c C-t’ Go tooling prefix with go-tag.

10.1.26 init-lang-web.el — Web (TypeScript, JS, CSS, HTML)

10.1.26.1 typescript-ts-mode (built-in / Nix)

Built-in tree-sitter TypeScript / TSX / JSX modes. Eglot wires typescript-language-server in init-prog.

10.1.26.2 js (built-in / Nix)

Built-in JavaScript major mode pinned to its tree-sitter variant.

10.1.26.3 css-mode (built-in / Nix)

Built-in CSS / SCSS major mode pinned to the tree-sitter variant.

10.1.26.4 mhtml-ts-mode (built-in / Nix)

Built-in tree-sitter HTML mode for plain .html/.htm (parses HTML + embedded JS + CSS). Templating dialects still go to web-mode below, which mhtml-ts-mode does not handle.

10.1.26.5 web-mode

One mode for every templating language that mixes HTML with something else: ERB, Mustache, Django, ASP, JSP, PHP. Plain .html goes to mhtml-ts-mode above. The M-o rebind below stops web-mode-map from shadowing our global other-window binding.

10.1.27 init-lang-devops.el — DevOps (CI, IaC, containers)

10.1.27.1 dockerfile-mode

Dockerfile major mode — syntax highlighting plus build commands (M-x dockerfile-build-buffer). The runtime command name comes from jotain-docker-backend.

10.1.27.2 terraform-mode

HCL-aware Terraform mode for .tf files. Loaded by the mode regex; LSP comes from terraform-ls (configured in init-prog).

10.1.27.3 gitlab-ci-mode

YAML mode tuned for .gitlab-ci.yml keywords — includes, rules, jobs. Saves a lot of typo’d job names on CI debugging days.

10.1.27.4 just-ts-mode

Tree-sitter major mode for Justfile — the project-aware command runner Jotain itself uses (the just grammar). Pairs with compile-multi for project commands. just-ts-mode self-registers a Justfile auto-mode entry; the :mode' regexes here map the .just’ extension used for included/modular recipes.

10.1.27.5 ansible

Ansible minor mode layered on top of yaml-mode for playbook files. Adds module-name completion and Jinja2 highlighting.

10.1.27.6 bazel

Bazel/Starlark support — major modes for BUILD, WORKSPACE, MODULE.bazel, REPO.bazel, *.bzl, .bazelrc, .bazelignore and .bazeliskrc (auto-mode-alist comes from the package’s own autoloads). C-c C-f runs buildifier; format-on-save for the Starlark-family buffers is wired through apheleia in init-prog.

10.1.27.7 robot-mode

Major mode for Robot Framework test suites and resource files (.robot/.resource) — the keyword-driven acceptance-test / RPA syntax, with font-lock and table-aware indentation. LSP and format-on-save are wired in init-prog (server/formatter resolved from the project PATH, like the other languages).

10.1.28 init-lang-data.el — Data formats

10.1.28.1 yaml-mode

YAML major mode (MELPA). Loaded on demand for the dozens of YAML-shaped files in any modern repo (CI, k8s, helm). YAML derives from text-mode' upstream, so we re-fire prog-mode-hook’ to get the full editor surface (line numbers, flymake, indent guides, …).

10.1.28.2 yaml-ts-mode (built-in / Nix)

Built-in tree-sitter YAML mode (Emacs 29+). Same prog-mode hook tweak as yaml-mode'; kept in its own use-package block so users running the built-in mode aren't forced to install the MELPA yaml-mode’ package by ‘use-package-always-ensure’.

10.1.28.3 csv-mode

CSV major mode with column alignment. csv-align-mode renders separators visually so wide files become readable without reflowing the actual bytes.

10.1.28.4 sql-indent

Smart indentation for SQL files — keeps SELECT lists, JOINs, and CTEs aligned without manual whitespace fiddling.

10.1.28.5 jinja2-mode

Jinja2 / Ansible / Saltstack templating syntax. Mode regex covers .j2, .jinja, and .jinja2.

10.1.28.6 gnuplot

Major mode for gnuplot script files (.plt). Useful when an analysis pipeline emits its own plotting scripts.

10.1.29 init-lang-systems.el — Systems (C/C++, Haskell, OCaml, Zig)

10.1.29.1 cc-mode (built-in / Nix)

Built-in cc-mode, kept for its auto-mode-alist' decisions and as the grammarless fallback. The :mode’ list is the source of truth for which extensions are C vs C++ (headers default to C++); jotain-prog-ts-remaps' (init-prog.el) then remaps the chosen c-mode’/c++-mode' to c-ts-mode’/c++-ts-mode' whenever the grammar is loadable, so buffers actually open in tree-sitter. The c-basic-offset’/‘c-default-style’ below still apply to the remaining cc-mode buffers (java/awk/other) and when a build lacks the C grammar.

10.1.29.2 c-ts-mode (built-in / Nix)

Built-in tree-sitter C/C++ modes. C/C++ buffers land here via the c'/cpp’ entries in jotain-prog-ts-remaps' (init-prog.el); this block carries the shared indentation. c-ts-mode-indent-offset’ is 4 (matching the old cc-mode c-basic-offset'); the style is k&r’ — the closest built-in tree-sitter style, since the previous Stroustrup style has no tree-sitter equivalent. eglot wires clangd and apheleia wires clang-format for both modes in init-prog.el.

10.1.29.3 cmake-mode

CMake mode for CMakeLists.txt and .cmake files. Mode regex covers both file conventions.

10.1.29.4 meson-mode

Meson mode for meson.build, meson_options.txt, and meson.options files. Formatting is configured centrally through apheleia, using the Meson CLI supplied by the dev shell.

10.1.29.5 haskell-mode

Haskell major mode. Loaded on demand only — keeps the rare Haskell editing session from costing every Emacs start. Kept as the dependency of haskell-ts-mode' below and for .cabal’/‘.lhs’ files.

10.1.29.6 haskell-ts-mode

Tree-sitter Haskell mode (NonGNU ELPA). .hs' files route here. It derives from haskell-mode’, so eglot’s built-in haskell-mode' → haskell-language-server’ entry matches it by derivation with no extra wiring; HLS comes from the project/host PATH.

10.1.29.7 tuareg

Tuareg — kept for OCaml lexer/parser sources (.mll'/.mly’), which the tree-sitter neocaml' modes below do not cover. Regular OCaml .ml’/‘.mli’ now use neocaml. ocamllsp/ocamlformat come from the project/host PATH, not this config.

10.1.29.8 neocaml

Tree-sitter OCaml via neocaml (MELPA): neocaml-mode' for .ml’ (the ocaml' grammar) and neocaml-interface-mode’ for .mli' (the ocaml-interface’ grammar). eglot (ocamllsp) and apheleia (ocamlformat) are wired for both in init-prog; neocaml also self-registers with eglot and dape. All OCaml tooling comes from the project/host PATH.

10.1.29.9 dune

Dune major mode for the OCaml build system’s dune, dune-project, and dune-workspace files — the OCaml counterpart to the CMake/Meson modes above.

10.1.29.10 zig-ts-mode

Tree-sitter Zig mode (MELPA). Eglot wires zls in init-prog; format-on-save runs ‘zig fmt’ through apheleia.

10.1.30 init-lang-qml.el — QML (Quickshell / Qt Quick)

10.1.30.1 qml-ts-mode (built-in / Nix)

Tree-sitter QML major mode (xhcoding/qml-ts-mode), for editing Quickshell / Qt Quick .qml' files. Provided by Nix; its qmljs’ grammar ships via treesit-grammars.with-all-grammars. LSP through eglot → qmlls and format-on-save through apheleia → qmlformat are both configured in init-prog. The Qt tooling (qmlls/qmlformat) rides the distribution wrapper PATH (nix/runtime-deps.nix).