Alexander-Miller/company-shell@HEAD -> Alexander-Miller/company-shell@52f3bf2 FStarLang/fstar-mode.el@HEAD -> FStarLang/fstar-mode.el@aaaf256 JuliaEditorSupport/julia-emacs@5238f9a -> JuliaEditorSupport/julia-emacs@1c122f1 Kungsgeten/org-brain@6b7fced -> Kungsgeten/org-brain@cae8e22 OVYA/php-cs-fixer@6540006 -> OVYA/php-cs-fixer@95eace9 ProofGeneral/PG@2a17093 -> ProofGeneral/PG@9196749 aaronjensen/eslintd-fix@98c669e -> aaronjensen/eslintd-fix@0c43114 abicky/nodejs-repl.el@8b90948 -> abicky/nodejs-repl.el@6fad7d7 abo-abo/org-download@3c48102 -> abo-abo/org-download@b96fd7b agda/agda@74d9fd5 -> agda/agda@ff9173e alf/ob-restclient.el@c5c22e6 -> alf/ob-restclient.el@f7449b2 ananthakumaran/tide@1878a09 -> ananthakumaran/tide@3b45610 bastibe/org-journal@9d40f62 -> bastibe/org-journal@664c08e brotzeit/rustic@373f5a1 -> brotzeit/rustic@61032ea clojure-emacs/cider@7437c67 -> clojure-emacs/cider@52dcc60 clojure-emacs/clj-refactor.el@e24ba62 -> clojure-emacs/clj-refactor.el@92d3723 cpitclaudel/company-coq@6e8bc2e -> cpitclaudel/company-coq@f9dba9d cython/cython@f6bf6aa -> cython/cython@48dc1f0 defunkt/coffee-mode@86ab8aa -> defunkt/coffee-mode@35a41c7 dgutov/robe@8190cb7 -> dgutov/robe@68503b3 diml/utop@7c99d8c -> diml/utop@30c77ce dzop/emacs-jupyter@d4b06c5 -> dzop/emacs-jupyter@de7af25 emacs-ess/ESS@a2be8cb -> emacs-ess/ESS@625041a emacs-lsp/lsp-haskell@6d481f9 -> emacs-lsp/lsp-haskell@582fa27 emacs-lsp/lsp-java@dbeeee9 -> emacs-lsp/lsp-java@6efb741 emacs-php/php-mode@cade4ce -> emacs-php/php-mode@b5d9988 emacs-php/phpactor.el@5ccf65d -> emacs-php/phpactor.el@31fe2ea emacs-php/phpactor.el@5ccf65d) -> emacs-php/phpactor.el@31fe2ea) emacs-straight/csv-mode@fbf942e -> emacs-straight/csv-mode@6353374 emacs-straight/org-mode@0a8faec -> emacs-straight/org-mode@ba68555 emacs-typescript/typescript.el@a0f2c3e -> emacs-typescript/typescript.el@102587e emacsorphanage/gnuplot@a406143 -> emacsorphanage/gnuplot@f0001c3 erlang/otp@c15eb5f -> erlang/otp@3065fbf factor/factor@a62ea78 -> factor/factor@497d649 felipeochoa/rjsx-mode@014c760 -> felipeochoa/rjsx-mode@0061587 fxbois/web-mode@d1b6660 -> fxbois/web-mode@b0bb4ab greghendershott/racket-mode@5f396fa -> greghendershott/racket-mode@bd4c8cf haskell/haskell-mode@4a87d72 -> haskell/haskell-mode@7032966 jaor/geiser@645e477 -> jaor/geiser@83ad875 joaotavora/sly@cfecd21 -> joaotavora/sly@1382bda jorgenschaefer/emacs-buttercup@178c795 -> jorgenschaefer/emacs-buttercup@b360e35 leanprover/lean-mode@f26e40d -> leanprover/lean-mode@65b55b1 leanprover/lean-mode@f26e40d -> leanprover/lean-mode@65b55b1 ledger/ledger-mode@a514953 -> ledger/ledger-mode@7d78645 mgyucht/jsonnet-mode@2b90b4e -> mgyucht/jsonnet-mode@d8b486c necaris/conda.el@814439d -> necaris/conda.el@335474e nonsequitur/inf-ruby@e4ae089 -> nonsequitur/inf-ruby@41e5ed3 ocaml-ppx/ocamlformat@dba4487 -> ocaml-ppx/ocamlformat@5282e04 ocaml/dune@f3df7ab -> ocaml/dune@1944d0f ocaml/merlin@f6954e9 -> ocaml/merlin@37e38e4 polymode/poly-R@0443c89 -> polymode/poly-R@51ffeb6 polymode/polymode@3eab3c9 -> polymode/polymode@44265e3 purcell/flycheck-ledger@2065bea -> purcell/flycheck-ledger@628e25b purescript-emacs/psc-ide-emacs@2a93944 -> purescript-emacs/psc-ide-emacs@7fc2b84 s-kostyaev/ivy-erlang-complete@7d60ed1 -> s-kostyaev/ivy-erlang-complete@c443dba seagle0128/grip-mode@1a61bb7 -> seagle0128/grip-mode@9615c47 skeeto/skewer-mode@123215d -> skeeto/skewer-mode@e5bed35 tpapp/julia-repl@b11a572 -> tpapp/julia-repl@5fa04de wwwjfy/emacs-fish@688c82d -> wwwjfy/emacs-fish@db257db xuchunyang/elisp-demos@bec206b -> xuchunyang/elisp-demos@0d74766 yjwen/org-reveal@0d947cb -> yjwen/org-reveal@ea8b502
Screenshots | Get started | Contribute | Documentation | FAQ
Quick start
git clone https://github.com/hlissner/doom-emacs ~/.emacs.d
~/.emacs.d/bin/doom install
More details, including dependencies and how to install Emacs, can be found in the documentation.
Table of Contents
What is Doom Emacs

It is a story as old as time. A stubborn, shell-dwelling, and melodramatic as vimmer -- envious of the features of modern text editors -- spirals into despair before succumbing to the dark side. This is his config.
Doom is a configuration framework for GNU Emacs tailored for Emacs bankruptcy veterans who want less framework in their frameworks and the performance of a hand rolled config (or better). It can be a foundation for your own config or a resource for Emacs enthusiasts to learn more about our favorite OS.
Doom's mantras
- Gotta go fast. Startup and run-time performance are priorities. Doom goes beyond lazy loading packages by modifying them to be snappier and load lazier!
- Close to metal. There's less between you and vanilla Emacs by design. There's less to grok, on top of Emacs.
- Readability counts. Internals ought to be written as if reading them were part of the user experience, and it is! Modules should be syntactically sweet. Backend logic should be functional (as much as elisp permits), abstraction light and (hopefully) documented.
- Opinionated, but not stubborn. Doom is a bundle of reasonable defaults and curated opinions, but all of it should be optional. Use as little or as much of it as you like.
- Your system, your rules. There are more ways to set up your development
environment than there are dislikes on Youtube Rewind '18, so Doom leaves it
to you. Doom will not automatically install system dependencies (and will
coerce its plugins not to do so either). Use
doom doctor
to figure out what's missing.
Features
- Minimalistic good looks inspired by modern editors.
- A modular architecture for a more organized Emacs configuration.
- A custom elisp library to help simplify your config.
- (Optional) Vim-emulation powered by evil-mode, including ports of popular vim plugins and functionality.
- A declarative package management system (powered by straight.el) with a command line interface. Install packages from anywhere, not just (M)ELPA.
- A curated set of sane defaults for all packages, all (major) OSes, and Emacs itself.
- Support for many programming languages. Too many to list. Includes syntax highlighting, linters/checker integration, inline code evaluation, code completion (where possible), REPLs, documentation lookups, snippets, and more!
- Support for many tools, like docker, pass, ansible, terraform, and more.
- A Spacemacs-esque keybinding scheme, centered around leader and localleader prefix keys (SPC and SPCm, by default).
- A rule-based popup management system that dictates how temporary or disposable buffers are displayed (and disposed of).
- Automatic indentation detection and editorconfig integration. Let someone else argue about tabs vs _*spaces*_.
- Project-management tools and framework-specific minor modes with their own snippets libraries.
- Project search (and replace) utilities, powered by ripgrep.
- Isolated and persistent workspaces (also substitutes for vim tabs).
- An envvar file generator that captures a snapshot of your shell environment
for Doom to load at startup. No more struggling to get Emacs to inherit your
PATH
, among other things.
Getting Help
Community
We have a Discord server! Hop on and say hi!
Troubleshooting
Encountered strange behavior or an error? Here are some things to try before you shoot off that bug report:
- Run
bin/doom sync
. This ensures Doom is properly set up and its autoloads files are up-to-date. - If you have byte-compiled your config (with
bin/doom compile
), see ifbin/doom clean
makes the issue go away. Never debug issues with a byte-compiled config, it will make your job harder. - Run
bin/doom doctor
to detect common issues in your development environment. - Search Doom's issue tracker for mention of any error messages you've received.
- Visit our FAQ to see if your issue is listed.
If all else fails, file that bug report! Please include the
behavior you've observed, the behavior you expected, and any error messages or
warnings logged to the *Messages* buffer (can be opened with SPC h
e or M-x view-echo-area-messages
).
It's a great help if you included a backtrace with errors, i.e. M-x toggle-debug-on-error
then recreating the error(s).
Contributing
Doom (and my Emacs work in general) is a labor of love and incurable madness, done on my spare time. If you'd like to support my work, there are many things you can do to help; I welcome any contribution!
- I love pull requests and bug reports. Check out the Contributing Guidelines to find out how you can help out.
- I welcome Elisp pointers! Don't hesitate to tell me my Elisp-fu sucks (but please tell me why).
- Hop on our Discord server and say hi! Help others out, hang out or talk to me about Emacs, or gamedev, or programming, machine learning, physics, pixel art, anime, gaming -- anything you like. Nourish this lonely soul!
- If you'd like to support my work financially, consider buying me a drink through liberapay or paypal. Donations are a great help. My work here contends with studies, ventures in indie gamedev, and my freelance work.