Jotain follows Emacs conventions: only global rebindings live in lisp/init-keys.el; per-package bindings stay colocated with the package's use-package block. which-key is enabled by default, so after any prefix key a paged menu of available continuations appears in the echo area. The prefix labels listed below are registered via which-key-add-key-based-replacements in init-keys.el, so they show up in those menus instead of the bare command names.
C-c — user namespace
Reserved by Emacs convention for user bindings. Jotain claims the following:
| Key | Label | Command |
|---|---|---|
C-c a |
org-agenda | org-agenda |
C-c c |
org-capture | org-capture |
C-c d |
dirvish | dirvish |
C-c D |
dirvish-side | dirvish-side |
C-c e |
eca | eca |
C-c g |
magit-file | magit-file-dispatch |
C-c h |
consult-history | consult-history |
C-c i |
consult-info | consult-info |
C-c j |
jujutsu | majutsu-log |
C-c M-j |
jujutsu-dispatch | majutsu-dispatch |
C-c k |
consult-kmacro | consult-kmacro |
C-c l |
org-store-link | org-store-link |
C-c m |
— | consult-man |
C-c n |
org-roam prefix | n f find, n i insert, n c capture |
C-c o |
combobulate prefix | structural editing dispatch |
C-c q |
claude-code-ide | claude-code-ide-menu |
C-c r |
eglot-refactor prefix | r r rename, r f format, r a actions, r o organize-imports, r q quickfix |
C-c s |
gptel-send | gptel-send |
C-c S |
gptel-menu | gptel-menu |
C-c t |
toggle-theme | auto-dark-toggle-appearance |
C-c v |
devenv | devenv transient — tasks, scripts, processes, env |
C-c M-x |
consult-mode-command | consult-mode-command |
C-x — control namespace
Built-in Emacs prefix extended with a handful of Jotain additions:
| Key | Label | Command |
|---|---|---|
C-x C-a |
dape (debug) prefix | dape-global-map — Debug Adapter Protocol: start, step, breakpoints, REPL |
C-x b |
— | consult-buffer |
C-x g |
magit-status | magit-status |
C-x G |
git-status-file | jotain-switch-git-status-buffer |
C-x M-g |
magit-dispatch | magit-dispatch |
C-x j |
rotate-window-split | jotain-toggle-window-split |
C-x J |
jj-status-file | jotain-switch-jj-status-buffer |
C-x p b |
— | consult-project-buffer |
C-x r b |
— | consult-bookmark |
C-x t b |
— | consult-buffer-other-tab |
C-x u |
vundo | vundo |
C-x 1 |
— | jotain-nav-toggle-delete-other-windows |
C-x P |
project (projection) prefix | projection-map — multi-language project commands |
Other global bindings
Single-keystroke globals that don't fit a C-c / C-x namespace — window switching, spell-check, region growth, and multi-cursor.
| Key | Command |
|---|---|
M-o |
other-window |
M-$ |
jinx-correct |
C-M-$ |
jinx-languages |
C-= |
expreg-expand |
C-> |
mc/mark-next-like-this |
C-< |
mc/mark-previous-like-this |
C-S-c C-S-c |
mc/mark-all-like-this |
C-h . |
helpful-at-point (via [remap display-local-help]) |
C-. |
embark-act |
C-; |
embark-dwim |
C-h B |
embark-bindings |
Disabled by default
| Key | Reason |
|---|---|
C-z |
Accidentally suspending Emacs from a GUI frame is never what you want |
C-x C-z |
Same |
Mode-local overrides
A few major modes rebind C-c leaves locally:
dired-mode:C-c C-e→wdired-change-to-wdired-mode(toggle writable dired)sops-mode:C-c C-csave,C-c C-kcancel,C-c C-deditembarkexports:C-c C-o→embark-exportorg-mode:C-c bis an Org Babel notebook prefix —brun buffer,erun subtree,rrestart session and run buffer,sswitch to session,kclear results,ttangle. Single blocks stay onC-c C-c, and Org's ownC-c C-vbabel map is untouched. See Notebooks with Org Babel.
Embark action menu
C-. (embark-act) opens a keyboard-driven "right-click" menu of the actions that apply to the thing at point — a minibuffer candidate, a file name, a buffer, a URL, an Elisp symbol, the active region. C-; (embark-dwim) skips the menu and runs the default action. The keys below are pressed after C-., inside the action menu:
| Key | Action |
|---|---|
C-h |
Searchable completing-read of every applicable action — the discovery entry point |
E |
embark-export — promote the candidate set to a buffer (grep for ripgrep/grep, occur for consult-line, dired for files, ibuffer for buffers) |
A |
embark-act-all — run one action on every current candidate |
B |
embark-become — re-run the input you typed through a different command |
i |
Insert the candidate into the buffer you came from |
w |
Copy the candidate to the kill-ring |
Two habits worth forming:
- Search → edit.
consult-ripgrep→C-. Eexports to a grep buffer, thenC-x C-q(wgrep) makes it editable so you can rewrite every match in place and save across all files at once. - Keep the session alive. Acting on a candidate exits the minibuffer by default; call it with a prefix (
C-u C-.) to stay in the minibuffer for successive actions — handy for deleting or renaming several files in a row.
Because Embark resolves candidate paths through project.el, the full file-action arsenal (w copy path, r rename, d delete, j jump to dired) works directly on the project-relative candidates of project-find-file without a dired detour. embark-become's file map already offers p for project-find-file, so C-. B p re-runs a plain C-x C-f input through the project finder.
Window navigation
Shift + arrow keys move focus between split windows, courtesy of the built-in windmove-default-keybindings. M-o cycles through windows linearly; C-x j rotates a two-window layout between horizontal and vertical splits.
Why no leader-key framework?
The article "general.el to conquer Emacs keybindings" makes a persuasive case for adopting general.el as a unified keybinding layer. Jotain considered and rejected the migration: general.el's primary differentiator is :states for evil-mode integration, which Jotain does not use, and Emacs 30's keymap-set plus built-in which-key plus use-package :bind already cover the article's discoverability and leader-key ergonomics without an extra dependency. The spirit of the article — memorable, categorised, self-documenting prefixes — is realised here through the which-key-add-key-based-replacements table in init-keys.el. See Inspiration & Resources for the full rationale.