A fast, focused Emacs configuration for macOS. The configuration is written as a literate Org document, tangled and byte-compiled so startup stays quick, with packages and language tooling loaded only when you need them.
curl -fsSL https://raw.githubusercontent.com/REPPL/emacs.d/main/install.sh | bashThis clones the configuration into ~/.emacs.d as a git repository, so you can pull updates and commit your own changes. If ~/.emacs.d already exists you are asked what to do first — nothing is deleted without your consent (an existing configuration is moved to ~/.emacs.d.backup-<timestamp>; if ~/.emacs.d is already this configuration, you are offered a git pull instead). After cloning, it offers to install any missing optional tools below (pandoc, aspell, pipx and the Python language server), each with its own y/N prompt.
- Fast startup — the config is byte-compiled and loaded directly; Org itself loads lazily (only when you open an
.orgfile), and heavy packages are deferred until first use. - Modern completion — Vertico, Consult, Marginalia and Orderless in the minibuffer; Company for in-buffer completion.
- Project & version control — Projectile and Magit.
- Navigation & editing —
which-key, Flycheck, yasnippet, ace-jump, highlight-symbol, and a file tree (f8/M-0). - Python (on demand) — LSP via
pylsp, plus Black, isort and pytest; nothing Python-related loads until you open a.pyfile. - Markdown — export and preview via pandoc (
C-c C-c e/p/v) and Org-style structure editing (M-<arrows>to move, promote and demote). - Optional setup wizard — installs missing system tools on request, never on its own (
M-x ar-setup-wizard).
- Emacs 29 or newer (developed and tested on 30.2; native compilation recommended)
- git
- macOS — the configuration and its Mac-specific keybindings are developed and tested there
- Optional: pandoc (Markdown export), aspell (spell-checking), pipx (Python LSP)
To install somewhere other than the .emacs.d default location, set EMACS_D:
curl -fsSL https://raw.githubusercontent.com/REPPL/emacs.d/main/install.sh | EMACS_D=~/my-emacs bash# Back up any existing configuration first
mv ~/.emacs.d ~/.emacs.d.backup
# Clone directly to ~/.emacs.d
git clone https://github.com/REPPL/emacs.d.git ~/.emacs.dWhen you first start Emacs with this configuration:
- Package installation — Emacs installs
use-packageand the packages declared ininits/repp.org, creating theelpa/directory. - Tangle and compile — the configuration is tangled from
inits/repp.orgtoinits/repp.eland byte-compiled. The first launch takes a moment whilst packages download and the config compiles; later launches load the compiled config directly and are fast. - Restart Emacs — after packages install, restart once so everything loads cleanly.
- Optional setup wizard — the editor works out of the box. If some optional system tools are missing, a single passive note points you at
M-x ar-setup-wizard; it never blocks startup. The wizard installs missing tools (Python LSP via pipx, linters, a default Python venv), asking y/n for each — nothing installs without confirmation. It writes.setup-donein your Emacs directory once every category is complete; delete that file (or run withC-u) to re-run.
The configuration lives in three files:
init.el— startup: sets up packages, then tangles, byte-compiles and loads the configinits/repp.org— the literate configuration; edit this, and it is re-tangled on the next launchinits/custom.el— variables and faces managed byM-x customize
These are created automatically and are not committed:
elpa/— installed packageseln-cache/— native-compiled codeinits/repp.elandinits/repp.elc— tangled and byte-compiled fromrepp.orgauto-save-list/,recentf,projectile-bookmarks.eld,.lsp-session-v1— session and runtime datatramp,transient/,eshell/,tree-sitter/— runtime data
For installation and compilation issues, see docs/troubleshooting/.

