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.
init-core.el — Core baselineinit-keys.el — Global keysinit-ui.el — UI: theme, modeline, fontsinit-tabs.el — Workspace tabsinit-help.el — Help systeminit-editing.el — Editing primitivesinit-completion.el — Minibuffer + in-buffer completioninit-navigation.el — dired, project, windowsinit-casual.el — Transient menus (casual)init-vc.el — Version controlinit-prog.el — prog-mode, treesit, eglotinit-snippets.el — Tempel snippetsinit-project.el — Per-project commandsinit-devenv.el — devenv.sh integrationinit-ai.el — AI assistantsinit-shell.el — Shellsinit-terminal.el — Terminal supportinit-systems.el — Sysadmin toolsinit-writing.el — Prose & notesinit-org.el — Orginit-http.el — HTTP / REST clientinit-lang-nix.el — Nixinit-lang-rust.el — Rustinit-lang-python.el — Pythoninit-lang-go.el — Goinit-lang-web.el — Web (TypeScript, JS, CSS, HTML)init-lang-devops.el — DevOps (CI, IaC, containers)init-lang-data.el — Data formatsinit-lang-systems.el — Systems (C/C++, Haskell, OCaml, Zig)init-lang-qml.el — QML (Quickshell / Qt Quick)init-core.el — Core baseline ¶emacs (built-in / Nix)saveplace (built-in / Nix)files (built-in / Nix)repeat (built-in / Nix)uniquify (built-in / Nix)ibuffer (built-in / Nix)ffap (built-in / Nix)time (built-in / Nix)exec-path-from-shellautorevert (built-in / Nix)recentf (built-in / Nix)savehist (built-in / Nix)bookmark (built-in / Nix)isearch (built-in / Nix)shr (built-in / Nix)gnutls (built-in / Nix)nsm (built-in / Nix)emacs (built-in / Nix) ¶Sane defaults for the bare editor — fill column, dialog/box use, lockfiles, recursive minibuffers, case-insensitive completion.
saveplace (built-in / Nix) ¶Persist point per file across sessions. Built-in.
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.
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.
uniquify (built-in / Nix) ¶Disambiguate same-name buffers by directory prefix instead of the default <2> suffix. forward style mirrors the path.
ibuffer (built-in / Nix) ¶Replace list-buffers (C-x C-b) with the more capable ibuffer: dired-style filter/mark/operate on buffers.
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".
time (built-in / Nix) ¶Built-in world-clock for cross-timezone scheduling. Loaded on demand only.
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.
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.
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.
savehist (built-in / Nix) ¶Persist minibuffer history (M-p / M-n, vertico ordering, etc.) across sessions. Built-in, enabled globally.
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.
isearch (built-in / Nix) ¶Lazy-count isearch matches in the prompt — "(3/12)" tells you where you are without leaving the search.
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.
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).
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.
init-keys.el — Global keys ¶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.
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.
init-ui.el — UI: theme, modeline, fonts ¶auto-darkdoom-modelineemoji (built-in / Nix)display-line-numbers (built-in / Nix)pixel-scroll (built-in / Nix)hl-line (built-in / Nix)paren (built-in / Nix)which-key (built-in / Nix)calendar (built-in / Nix)nerd-iconsnerd-icons-corfunerd-icons-completionnerd-icons-ibufferhl-todobreadcrumbpulsarrainbow-delimitersindent-barsauto-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.
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.
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.
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.
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.)
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.
paren (built-in / Nix) ¶Built-in matching-paren highlight. Tuned to flash quickly and highlight even when point is just outside the pair.
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.
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.
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.
nerd-icons-corfu ¶Decorates corfu candidates with a kind-specific glyph in the margin, so completions are scannable at a glance.
nerd-icons-completion ¶Adds Nerd-Font icons to marginalia annotations (file/buffer category icons in completion lists).
nerd-icons-ibuffer ¶Adds Nerd-Font glyphs to ibuffer rows so buffer types are visually distinguished at a glance.
hl-todo ¶Highlights TODO / FIXME / HACK / NOTE / XXX keywords in code with a face that survives theme changes.
breadcrumb ¶Headerline showing project / file / nested function position — the missing "where am I in this file?" indicator built on imenu.
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.
rainbow-delimiters ¶Colourises matching parens by depth in Lisp buffers — almost essential for navigating deeply nested forms.
indent-bars ¶Vertical indent guides for code, treesit-aware so the bars follow real syntactic indentation. Toggle via ‘jotain-indent-bars-enabled’.
init-tabs.el — Workspace tabs ¶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.
init-help.el — Help system ¶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.
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.
apropos (built-in / Nix) ¶Built-in apropos. Bumped to "search everything" so it surfaces faces, classes, and customs alongside functions and variables.
helpful ¶Replaces the default describe-* commands with richer buffers that include source, callers, examples, and active keybindings — the single biggest discoverability upgrade in Emacs.
init-editing.el — Editing primitives ¶elec-pair (built-in / Nix)delsel (built-in / Nix)simple (built-in / Nix)whitespace (built-in / Nix)subword (built-in / Nix)newcomment (built-in / Nix)emacs (built-in / Nix)replace (built-in / Nix)expregmultiple-cursorsvundosuper-savere-builder (built-in / Nix)keyfreqelec-pair (built-in / Nix) ¶Auto-insert matching delimiters as you type. Built-in.
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.
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.
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.
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.
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)
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.
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’.
expreg ¶Treesit-aware semantic region expansion. Smaller, faster successor to expand-region; produces better expansions with much less code now that treesit is everywhere.
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.
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.
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.
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.
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.
init-completion.el — Minibuffer + in-buffer completion ¶minibuffer (built-in / Nix)orderlessverticovertico-directory (built-in / Nix)vertico-multiform (built-in / Nix)vertico-buffer (built-in / Nix)vertico-posframemarginaliaconsultembarkembark-consultavyzoxideemacs (built-in / Nix)corfucorfu-history (built-in / Nix)corfu-popupinfo (built-in / Nix)capecompletion-preview (built-in / Nix)minibuffer (built-in / Nix) ¶Built-in minibuffer customisation: detailed annotations and historical sorting (Emacs 30) so frequent commands surface first.
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.
vertico ¶Vertical, performant minibuffer completion UI. Replaces the default *Completions* buffer with an inline list. The whole minibuffer experience hinges on this.
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.
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.
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.
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.
marginalia ¶Adds annotation columns (file size, mode, docstring, …) to every completion list. Pairs with vertico to make minibuffer choices self-explanatory.
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.
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.
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.
avy ¶Tree-style char/word/line jumping. Bound under M-g so it sits next to the goto family. Multi-frame aware.
zoxide ¶Frecency-ranked directory jump (like the shell zoxide). Adds visited files automatically; M-g z surfaces the most-recent matches first.
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.
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.
corfu-history (built-in / Nix) ¶Persists corfu’s pick history into savehist so frequent completions float to the top across sessions. Bundled with corfu.
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.
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.
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.
init-vc.el — Version control ¶vc (built-in / Nix)vc-git (built-in / Nix)vc-jjmagitmajutsu (built-in / Nix)magit-todosforgetransient (built-in / Nix)diff-hldiff-hl-dired (built-in / Nix)ediff (built-in / Nix)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.
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.
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).
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.
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’.
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.
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_…).
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.
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.
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.
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.
init-prog.el — prog-mode, treesit, eglot ¶prog-mode (built-in / Nix)treesit (built-in / Nix)jit-lock (built-in / Nix)treesit-foldcombobulate (built-in / Nix)eglot (built-in / Nix)eglot-booster (built-in / Nix)consult-eglotconsult-eglot-embarkdapeflymake (built-in / Nix)eldoc (built-in / Nix)xref (built-in / Nix)imenu (built-in / Nix)tagref (built-in / Nix)compile (built-in / Nix)editorconfig (built-in / Nix)apheleiawgrepdtrt-indentprog-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.
treesit (built-in / Nix) ¶Built-in tree-sitter substrate. Bumped to font-lock level 4 to enable every available syntactic decoration.
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.
treesit-fold ¶Code folding driven by treesit syntax nodes — folds along functions/classes/blocks instead of indentation guesses. Fringe indicators show fold state.
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.
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.
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.
consult-eglot ¶Consult-driven workspace symbol search — C-M-. opens an orderless-filtered list of symbols across the LSP workspace.
consult-eglot-embark ¶Embark integration for consult-eglot — gives every workspace symbol an action menu (jump to def, find refs, rename, …).
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.
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.
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.
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.
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).
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.
editorconfig (built-in / Nix) ¶Honour .editorconfig files (indent style/width, line endings, trailing whitespace). Built-in since Emacs 30.
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.
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.
dtrt-indent ¶Detect indentation width from file contents — saves us from having to special-case every project’s tab/space convention.
init-snippets.el — Tempel snippets ¶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.
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.
init-project.el — Per-project commands ¶project (built-in / Nix)project-nix-store (built-in / Nix)projectionprojection-multiprojection-multi-embarkcompile-multiconsult-compile-multicompile-multi-nerd-iconscompile-multi-embarkproject (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.
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.
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.
projection-multi ¶Bridges projection with compile-multi: project-prefix RET picks from every named compile command available in this project.
projection-multi-embark ¶Embark menu for projection-multi entries — pin a command, preview output, etc.
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.
consult-compile-multi ¶Renders compile-multi pickers through consult — gives you orderless filtering and preview on every "what command should I run?" prompt.
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.
compile-multi-embark ¶Embark actions on compile-multi entries (run, copy, edit command line). Mirrors the projection embark integration.
init-devenv.el — devenv.sh integration ¶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.
init-ai.el — AI assistants ¶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).
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.
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.
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.
init-shell.el — Shells ¶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).
comint (built-in / Nix) ¶Built-in REPL substrate (used by python, ielm, sql, etc.). The settings here apply to every comint-derived buffer.
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.
init-terminal.el — Terminal support ¶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’.
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.
clipetty ¶OSC 52 clipboard integration. Yank/kill in terminal Emacs reaches the system clipboard even through ssh + tmux.
init-systems.el — Sysadmin tools ¶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.
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.
logview ¶Major mode for log files — level filtering, timestamp parsing, thread highlighting. Configured for SLF4J (Java/Kotlin) and a custom ROS2 submode.
init-writing.el — Prose & notes ¶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.
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.
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.
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.
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).
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.
init-org.el — Org ¶org (built-in / Nix)ob-core (built-in / Nix)org-src (built-in / Nix)org-tempo (built-in / Nix)org-clock (built-in / Nix)org-appearorg-modernorg-roamorg (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.
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.
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.
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.
org-clock (built-in / Nix) ¶Built-in time tracking with persistence across restarts. Lets you resume an interrupted clock without losing the entry.
org-appear ¶Reveal Org emphasis markers (* _ / ~) only when point is on them — best of both visual worlds: clean reading, easy editing.
org-modern ¶Modern visual styling for Org buffers and agenda — typographic bullets, faux-rendered blocks, agenda decorations.
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.
init-http.el — HTTP / REST client ¶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.
init-lang-nix.el — Nix ¶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.
init-lang-rust.el — Rust ¶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.
init-lang-python.el — Python ¶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’.
init-lang-go.el — Go ¶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.
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.
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.
init-lang-web.el — Web (TypeScript, JS, CSS, HTML) ¶typescript-ts-mode (built-in / Nix)js (built-in / Nix)css-mode (built-in / Nix)mhtml-ts-mode (built-in / Nix)web-modetypescript-ts-mode (built-in / Nix) ¶Built-in tree-sitter TypeScript / TSX / JSX modes. Eglot wires typescript-language-server in init-prog.
js (built-in / Nix) ¶Built-in JavaScript major mode pinned to its tree-sitter variant.
css-mode (built-in / Nix) ¶Built-in CSS / SCSS major mode pinned to the tree-sitter variant.
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.
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.
init-lang-devops.el — DevOps (CI, IaC, containers) ¶dockerfile-mode ¶Dockerfile major mode — syntax highlighting plus build commands (M-x dockerfile-build-buffer). The runtime command name comes from jotain-docker-backend.
terraform-mode ¶HCL-aware Terraform mode for .tf files. Loaded by the mode regex; LSP comes from terraform-ls (configured in init-prog).
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.
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.
ansible ¶Ansible minor mode layered on top of yaml-mode for playbook files. Adds module-name completion and Jinja2 highlighting.
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.
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).
init-lang-data.el — Data formats ¶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, …).
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’.
csv-mode ¶CSV major mode with column alignment. csv-align-mode renders separators visually so wide files become readable without reflowing the actual bytes.
sql-indent ¶Smart indentation for SQL files — keeps SELECT lists, JOINs, and CTEs aligned without manual whitespace fiddling.
jinja2-mode ¶Jinja2 / Ansible / Saltstack templating syntax. Mode regex covers .j2, .jinja, and .jinja2.
gnuplot ¶Major mode for gnuplot script files (.plt). Useful when an analysis pipeline emits its own plotting scripts.
init-lang-systems.el — Systems (C/C++, Haskell, OCaml, Zig) ¶cc-mode (built-in / Nix)c-ts-mode (built-in / Nix)cmake-modemeson-modehaskell-modehaskell-ts-modetuaregneocamldunezig-ts-modecc-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.
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.
cmake-mode ¶CMake mode for CMakeLists.txt and .cmake files. Mode regex covers both file conventions.
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.
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.
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.
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.
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.
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.
zig-ts-mode ¶Tree-sitter Zig mode (MELPA). Eglot wires zls in init-prog; format-on-save runs ‘zig fmt’ through apheleia.
init-lang-qml.el — QML (Quickshell / Qt Quick) ¶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).