Skip to main content

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.

init-core.el — Core baseline

emacs (built-in / Nix)

Sane defaults for the bare editor — fill column, dialog/box use, lockfiles, recursive minibuffers, case-insensitive completion. Settings here are the ones that don’t deserve their own module.

saveplace (built-in / Nix)

Persist point per file across sessions. Built-in. The advice below recenters the buffer after restore so you don’t reopen on the bottom line.

diminish

Hides minor-mode lighters from the modeline. Loaded early and :demand t so that downstream use-package blocks can use the :diminish keyword without macro-expansion errors.

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. A window-resize repeat-map filling the one gap in the built-in coverage lives in init-keys.el.

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, direnv, 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.

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-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 pixel-precision smooth scrolling. Required for usable trackpad / smooth-mouse scrolling. `fast-but-imprecise-scrolling’ lets large jumps skip exact intermediate fontification — a worthwhile redisplay win on this integrated-GPU Intel machine.

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. 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)

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. (The “diff this buffer against its file” action under d' during save-some-buffers’ is already built in since Emacs 30, so it needs no config here.)

whitespace (built-in / Nix)

Strip trailing whitespace and stray tabs on save without reformatting the rest of the buffer. Built-in.

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. 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.

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. 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)

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-c 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.

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

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.

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-. on any candidate (file, symbol, region, command name) opens a menu of actions valid for that thing. C-h B replaces describe-bindings with a paged view.

embark-consult

Glue between embark and consult — exports a consult result list (e.g. consult-ripgrep) into a grep buffer with C-c C-o for the classic search → wgrep refactor flow.

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.

corfu

In-buffer completion popup — the corfu equivalent of company. Auto-triggered after 2 chars so it feels like a modern editor without a long delay.

corfu-history (built-in / Nix)

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

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.

init-navigation.el — dired, project, windows

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’).

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.

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.

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.

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.

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.

diredfl

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

dired-narrow

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

dired-subtree

Inline tree expansion in dired — TAB on a directory expands its contents below it instead of opening a new buffer.

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.

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.

dirvish

Modern dired front-end with previews, side panels, and miller columns. Overrides plain dired so every C-x d benefits. 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.

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.

init-vc.el — Version control

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 C-j) 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 (built-in / Nix)

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.

smerge-mode (built-in / Nix)

Built-in conflict-marker editor. Custom prefix C-c ^ groups upper/lower/next/prev so resolving merges doesn’t require scrolling through the smerge menu.

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)

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.

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. 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-project.el — Per-project commands

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-projects-directories’ to add+open projects not yet in the known 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 refreshes the project environment through envrc (the direnv substrate configured in init-prog) and offers to reconnect eglot servers so they see the new environment. 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 C-’ 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 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 M-RET menu. Bound to C-c RET / C-c M-RET for quick send and full menu. 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 after gptel.

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. No-op in GUI frames, so safe to enable unconditionally.

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-tracking.el — Activity tracking

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.

wakatime-mode

Heartbeats to a Wakatime / Wakapi server. The :if guard makes the whole block a no-op when wakatime-cli or WAKATIME_API_KEY is missing, so you can install Wakapi later without reconfiguring Emacs.

activity-watch-mode

ActivityWatch integration — correlates editor activity with the rest of the machine. Installed but OFF by default; enable with M-x global-activity-watch-mode once the AW server is running, or set the option in custom.el to persist.

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. M-correctsthewordatpoint;CM corrects the word at point; C-M- switches dictionaries.

markdown-mode

Markdown major mode with native code-block fontification and heading scaling. README.md opens in gfm-mode for the GitHub dialect.

denote

Plain-text note system with strict file-naming rules so notes are findable years later. Stored under ~/Documents/notes.

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)

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.

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-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).

init-lang-rust.el — Rust

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

Built-in tree-sitter Rust mode. Eglot wires rust-analyzer in init-prog; 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.

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; 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)

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.

web-mode

One mode for every templating language that mixes HTML with something else: ERB, Mustache, Django, ASP, JSP, PHP. 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.

docker-compose-mode

YAML-flavoured docker-compose syntax with awareness of compose keywords and service references.

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-mode

Major mode for Justfile — the project-aware command runner Jotain itself uses. Pairs with compile-multi for project commands.

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.

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, Zig)

cc-mode (built-in / Nix)

Built-in C/C++ mode with a Stroustrup style bias. The header extensions below default to C++ — Jotain assumes that’s the more common case in modern repos.

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.

zig-ts-mode

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

init-snippets.el — Other

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 TAB’/`S-TAB’ move between them.

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.
Last modified on July 9, 2026