Emacs for the stubborn martian vimmer

Main screenshot

MIT DOOM v1.3.0

This is an Emacs configuration for a stubborn, melodramatic and shell-dwelling vimmer disappointed with the text-editor status quo.

Doom tries to look and act like modern editors (whatever that will mean to me on any given day), emulates vim as best it can and strives to surpass it in any way possible. All to fit my needs as a software developer, indie game developer, UX designer, scientist and doom enthusiast.

It was tailored for GUI Emacs 25+ on OSX 10.11+ and Arch Linux 4.7+. I use vim everywhere else.

NOTE: you can find the theme in a separate repo.


Depends on Cask and make:

git clone https://github.com/hlissner/.emacs.d ~/.emacs.d
cd ~/.emacs.d
make          # installs plugins via cask and generates autoloads

make compile  # compiles core and autoloaded files
make snippets # install hlissner/emacs-snippets into private/snippets

Run :bc! for a more comprehensive byte compile (:bc will compile the current, open *.el file).

For OSX users, I recommend Yukihiro Matsumoto’s fork of Emacs, which you can get through homebrew:

brew tap railwaycat/emacsmacport
brew install emacs-mac --with-imagemagick --with-modern-icon --HEAD


To get a picture of what’s in here, check out:

See screenshots in the screenshots branch.


  • Strong support for a large selection of languages, including C/C++, Ruby, Python, PHP, JS, Elisp, Haskell, Lua, Julia, Go, Crystal, Assembly, Java, Swift, (Ba|z)?sh, Scala, Rust, LaTeX, Processing, Octave, and more!
  • Tamed popup windows with shackle. e.g. help buffers will always pop up at the bottom of the frame, and are removed with ESC.
  • Workspaces & session persistence with workgroups2.
  • Project and workspace-sensitive buffer navigation and functions
  • A vim-like environment with evil-mode
    • vim-seek/vim-sneak functionality with evil-snipe (2-char motions)
    • Multiple cursors with evil-multiedit
    • Repeat (most) motions with SPC and shift+SPC (backwards)
    • On-the-fly keybindings with :[nviom]map
    • Global C-x omnicompletion (e.g. C-x+C-f for files)
  • Fast search utilities:
    • Project and buffer navigation with ivy
    • File browser sidebar with neotree
    • Project search (and replace) with counsel-ag (and wgrep)
    • Buffer search with swiper
  • REPLs for many languages including Ruby, Python, PHP, JS, Elisp, Haskell and Lua.
  • Minimalistic diffs in the fringe with git-gutter-fringe.
  • Modded org-mode to be a modern note-taking/LaTeX/word-processing platform. (WIP)
  • Code debugging interface with realgud (currently supports gdb, trepanjs, bashdb and zshdb, working on Python/Ruby support)
  • A do-what-I-mean jump-to-definition implementation that either uses major-mode commands or falls back to dumb-jump/ctags.
  • A pretty mode-line inspired by Atom’s. It includes:
    • evil-search/iedit/evil-substitute mode-line integration
    • Macro-recording indicator
    • Python/ruby version in mode-line (for rbenv/pyenv)

Other features

  • Line numbers + highlight with nlinum
  • On-demand [platform agnostic] shell with eshell
  • Consistent marker-based code-folding with hideshow
  • Inline code execution anywhere (once or live) with quickrun
  • Snippet expansion and file templates with yasnippet
  • Completion with company-mode
  • Syntax checking with flycheck
  • Custom O/S interaction commands, like os-reveal and os-open-in-browser
  • Custom TODO, FIXME and NOTE highlighting and search (:todo)
  • big-mode for presentations and demonstrations (:big)
  • Tmux integration with :t and :tcd ex commands


Though this wasn’t designed with anyone else’s use in mind, I’d be happy to help anyone out with problems encountered using (or cribbing from) my config. Don’t hesitate to report bugs!

A few things to keep in mind:

  1. Cask can be flakey, especially with new builds. If you’re getting odd errors when starting up Emacs, try to run make install again. I’ve also had cryptic cask errors that I had to reboot to resolve. YMMV.
  2. If you add new functions to any of the autoloaded (core|modules)/defuns/*.el library files, run make autoloads afterwards. :reload will reload Emacs’ load-path if you have Emacs open while doing so.

Related Repositories



Here is my .emacs.d for public perusal. ...



My emacs config (mirror of https://petton.fr/git/nico/emacs.d) ...



New emacs setup - everything in .emacs.d ...



My .emacs.d directory, starting fresh. My emacs got really full on stuff I didn't always use so I think it'll be better in the long run to rewrite it and know everything in it. ...



My .emacs.d ...

Top Contributors

hlissner UndeadKernel


-   v1.3.0 zip tar
-   v1.2.9 zip tar
-   v1.2.7 zip tar
-   v1.2.2 zip tar
-   v1.2.0 zip tar
-   v1.1.3 zip tar
-   v1.1.0 zip tar
-   v1.0.0 zip tar
-   v0.9.8 zip tar
-   v0.9.6 zip tar
-   v0.9.5 zip tar
-   v0.9.1 zip tar
-   v0.7 zip tar