#+TITLE: jotain
#+AUTHOR: jylhis
#+DESCRIPTION: a GNU Emacs configuration built from scratch
* Something, from scratch
Jotain is Finnish for “something” — a custom GNU Emacs configuration with no framework underneath. Instead of layering on Doom or Spacemacs, it is built from scratch: Nix builds the editor from source, plain Elisp configures it.
** DONE What ships
- emacs.nix — Emacs from source, every build flag exposed, binary-cache parity with nixpkgs
- lisp/init-*.el — modular config, one file per concern; magit lives with vc, dirvish with dired
- default.nix — distribution wrapper + all ~275 tree-sitter grammars
- module.nix — home-manager service: daemon + emacsclient
- devenv.nix — the same Emacs for developers and tools
- Justfile — check, build, run, pins, cleanup
// currently
› targeting emacs 30.1 — native comp, tree-sitter, lexical binding
› setopt for every defcustom, so :set callbacks actually run
** Quickstart
#+begin_src bash
git clone https://github.com/Jylhis/jotain.git && cd jotain
devenv shell # emacs 30.1, just, nil, treefmt, nerd fonts
just run # GUI — --init-directory=<repo>, never touches ~/.emacs.d
just build # standalone: emacs 30 + 275 tree-sitter grammars
#+end_src
First launch bootstraps anything Nix doesn’t provide from MELPA; later launches load from the package cache.
** Read the manual
NAME
jotain — a custom GNU Emacs configuration built from scratch
SYNOPSIS
just run | debug | tty | daemon | client | quick
just build · just check · just compile · just fmt · just update
MANUAL SECTIONS
introduction(7)·····································································what jotain is, and why
installation(7)·····································································nix, home-manager, devenv
quickstart(7)·····································································running in minutes
architecture(7)·····································································overview · nix-build · modules
configuration(7)·····································································init · early-init · packages
usage(7)·····································································launching · devenv · ai-screenshot
keybindings(7)·····································································the full chord map
ergonomics(7)·····································································keyboard, posture, flow
FILES
/docs/·····································································full documentation index
/manual/·····································································the manual, one page per chapter
/manual/jotain.info·····································································Info file — C-h i d m Jotain RET
/man/·····································································jotain(7) + Emacs man pages
/info/·····································································GNU Emacs + Elisp manuals, from source
/options/·····································································nix module options reference
/help/packages/·····································································every package, and why
/packages/·····································································search every third-party package & symbol
SEE ALSO
github.com/Jylhis/jotain, jylhis.com, emacs(1), nix(1), just(1)
KEYBINDINGS(7)
Keybindings
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 — after any prefix, a paged menu of continuations appears in the echo area.
C-c — user namespace
Shown as which-key would page it in the echo area:
C-c-
a → org-agenda
c → org-capture
d → dirvish
D → dirvish-side
g → magit-file
h → consult-history
i → consult-info
k → consult-kmacro
l → org-store-link
m → consult-man
n → +org-roam
o → +combobulate
r → +eglot-refactor
t → toggle-theme
v → devenv
RET → gptel-send
M-RET → gptel-menu
C-' → claude-code-ide
C-x — control namespace
| key | command |
| C-x C-a | dape-global-map — DAP debug: start, step, breakpoints, REPL |
| C-x b | consult-buffer |
| C-x g | magit-status |
| C-x j | jotain-toggle-window-split |
| C-x u | vundo |
| C-x P | projection-map — multi-language project commands |
Other global bindings
M-o other-window
C-. embark-act
M-$ jinx-correct
C-; embark-dwim
C-= expreg-expand
C-h B embark-bindings
C-> mc/mark-next-like-this
C-< mc/mark-previous-like-this
Embark habits
// search → edit
consult-ripgrep → C-. E exports to a grep buffer, then C-x C-q (wgrep) makes it editable — rewrite every match in place and save across all files at once.
Disabled by default
C-z and C-x C-z — accidentally suspending Emacs from a GUI frame is never what you want.