This .emacs.d
represents my libre attempt to build and document a maximalist Emacs configuration utilizing most (but not all) of the latest trends in the Emacs community, tailored of course to my personal taste and needs. This involves around 200 different packages.
This means spicy choices like:
eglot
overlsp-mode
vert&co
overhelm
andivy
corfu
overcompany
straight.el
overpackage.el
flymake
overflycheck
(what a comeback!)meow
overevil
lispy
overparedit
sly
overslime
prism
overrainbow-delimiters
andrainbow-blocks
gptel
over the dozens of other LLM clients
When I was starting off with Emacs, other people's customizations were deeply helpful for me as a starting point; some of those customizations still find a home in my Emacs instance today. In the spirit of free software, I hope that I can pass on the good will.
This config makes extensive use of language servers and tree-sitter grammars. Most of my best supported languages will try to load a language server or tree-sitter grammar. If it fails to, it will warn you and give you a chance to install what is missing.
I usually only support one version of Emacs at a time. Currently I am supporting:
- Emacs 29
- Emacs 30
The following operating systems are supported:
Additionally, this entire .emacs.d
can be setup with native compilation, all necessary development environments below, and as your window manager by visiting my profiles repo, which can be executed on the Guix GNU/Linux distribution.
This Emacs configuration reflects my REPL-centered exploratory programming style.
I provide an IDE and REPL for each major environment that I work in.
One can debate about which languages Emacs is actually ideal for, but Emacs is certainly a best-in-class environment for Haskell, Elixir, Common Lisp, Scheme, and Clojure.
The best supported developer environments are the Lisp languages. Since they have feature rich IDEs with powerful REPLs, they do not need Eglot.
Language | IDE | REPL | Eglot |
---|---|---|---|
Clojure | CIDER | CIDER | N/A |
Common Lisp | SLY | SLY | N/A |
Scheme | Geiser | Geiser | N/A |
Guix comes with pre-packaged language servers for these languages.
Language | IDE | REPL | Eglot |
---|---|---|---|
C | c-ts-mode |
Yes | |
C++ | c++-ts-mode |
Yes | |
Go | go-ts-mode |
go-playground | Yes |
Python | Anaconda | run-python |
Yes |
Ruby | Robe | inf-ruby | Yes |
Rust | Racer | rust-playground | Yes |
Guix lacks pre-packaged language servers for these languages.
Language | IDE | REPL | Eglot |
---|---|---|---|
Elixir | Alchemist | inf-elixir | No |
Fish | fish-mode | fish-completion | No |
Haskell | Intero | Dante | No |
JavaScript | js2-mode | Indium | No |
PHP | php-mode | PsySH | No |
SQL | sql-mode | emacsql | No |
TypeScript | Tide | Indium | No |
I don't even have a REPL for these languages, and quite frankly, most of these languages are best used within their respective IDEs.
Language | IDE | REPL | Eglot |
---|---|---|---|
GDScript | gdscript-mode | Yes | |
Groovy | groovy-mode | No | |
Java | java-ts-mode |
No | |
Kotlin | kotlin-mode | No | |
Objective-C | objc-mode |
No | |
Swift | swift-mode | No |
This configuration ships with a great many helpful tools:
Feature | Tool |
---|---|
Benchmarker | elisp-benchmarks |
Bug tracker | debbugs |
Clipboard | Clipetty |
Completion (regular buffer) | Corfu |
Completion (minibuffer) | Vert&co |
Dashboard | Dashboard |
Docker client | docker.el |
Documentation searcher | devdocs |
Evaluation overlay | eros |
Gemini browser | Elpher |
HTTP browser | EWW |
Hyperlinker | Hyperbole |
IRC client | ERC |
Kubernetes client | kubernetes-el |
LLM client | gptel |
LSP client | Eglot |
Mail client | Gnus |
Mail indexer | Notmuch |
Modal editor | Meow, Lispy |
Modeline | Smart Mode Line |
MUD client | mu.el |
Music player | Emms |
Music streamer | pianobar.el |
Organization | org-mode |
Project interaction | project.el |
REST client | restclient.el |
Shell | Eshell |
Spreadsheets | Dismal |
Syntax checker | flymake |
Syntax highlighter | prism |
Terminal | Eat |
Undo visualizer | undo-tree |
Version control | Magit |
Wikipedia editor | mediawiki.el |
Window configuration | winner-mode |
Window handling | windmove |
Window manager | exwm |
There are many beautiful theme families for you to enjoy:
- arjen-grey
- deep-thought
- dracula
- exotica
- gotham
- molokai
- omtose-phellack
- purple-haze
- sanityinc-tomorrow
- timu-caribbean
- timu-macos
- timu-rouge
- timu-spacegrey
- zenburn
Package management is provided by:
This is a modal editing setup that uses two different modal editors: Meow and Lispy. Lispy is only for Lisp languages.
I maintain the default Emacs keybindings, so I will not document them here. Meow will help you discover keystrokes after you hit SPC
.
Run meow-tutor
to learn Meow.
Lispy editing is activated only in major modes for Lisp languages when around parens in Meow's insert mode.
e
evaluate s-expressionf
forward point through parensb
undo]
move point down[
move point up>
slurp up next s-expression<
barf up s-expressionw
move s-expression ups
move s-expression downr
raise s-expressionC-1
view documentationC-2
view caller arguments
Movement between buffers is accomplished with windmove:
Shift-up
Shift-left
Shift-right
Shift-down
I have keystrokes setup to emulate tmux/screen using Emacs tabs.
C-z(one) c(reates)
a new workspace.C-z(one) k(ills)
a current workspace.C-z(one) n(ext)
workspace.C-z(one) p(revious)
workspace.
These are custom keystrokes that I have setup:
SPC a(g)
search git repo using agSPC b(uffer)
switch buffers with autocompletionSPC i(sp)
search through Lisp symbols (defaults to Emacs Lisp)SPC d(ocumentation)
brings up documentation for symbol under cursorSPC e(at)
brings up the Eat terminalSPC k(ill)
kill buffer unconditionallySPC l(ocate)
locate a fileSPC o(mpile)
compiles the buffer in a language appropriate waySPC p(ush)
pushes the current git branchSPC r(eplace string)
replace all occurrences of a string after pointSPC s(tatus)
shows the current git statusSPC t(abs)
search through tabsSPC y(ank)
show list of yanked items
The arrow keys help you manage buffers:
SPC <left>
previous bufferSPC <right>
next bufferSPC <up>
beginning of bufferSPC <bottom>
bottom of buffer
Everything is very organized in the enzuru
folder by feature, mode, preference, setup, operating system, and theme. While this repo should work immediately for you on a git pull
, it's obviously a very personalized setup and many things won't appeal to you. If I were you, I would first take a look at my init.el
and then pick a topical elisp file from there.
Happy hacking!
Licensed under the GPLv3; copyright is assigned to my eponymous charity enzu.ru