Doom Emacs Setup

Last Updated: March 6th, 2021

Doom Emacs is for people who like Vim but in reality want to get things done. Emacs, but with extra Vim keybindings, oh and configured to work out of the box.

Some people may want to show and compare versions of Emacs or Doom Emacs and I've given a way that's pretty simple. Below I've listed my configs for Doom Emacs so others can see what some people choose, I'll even explain why.

I have not gotten around to writing my own elisp extensions for emacs yet, but I would really like to create one for the Crystal REPL or for the Amber Framework + Slang.

If you want to see what setup I use this on check this out.

If you want to learn more about Emacs then check checkout my emacs wiki entry.


I have my config setup to reflect my workflow and such. I keep notes in a certain place as well as my code and LaTeX projects.

(load! "custom.el")                                      ; Custom theme stuff
(load! "+bindings.el")                                   ; Load my custom key bindings bindings
(load! "+org.el")                                        ; Load my custom org settings
;; (load! "+irc.el")                                     ; Load my irc settings for Circe settings
;; (load! "+rss.el")                                     ; Load my RSS Feeds settings

;; These don't follow the typical file convention
(projectile-add-known-project "$PAPERS")       ; My LaTeX Writings
(projectile-add-known-project "$NOTES")          ; My Org and Markdown Notes

;; Settings for basic Doom Emacs things
(setq projectile-project-search-path                     ; All Coding related Projects denoted by the $CODE evironment variable. Preferably a XDG directory suck as `$HOME/.local/code/`
      '( "$CODE/asm/"                                    ; All Assembly Projects
         "$CODE/C/"                                      ; All C Projects
         "$CODE/lisp/common-lisp/"                       ; All Common Lisp Related Projects
         "$CODE/lisp/elisp/"                             ; All Emacs Lisp Related Projects
         "$CODE/lisp/scheme/"                            ; All Scheme Related Projects
         "$CODE/crystal/"                                ; All Crystal Projects
         "$CODE/misc/"                                   ; Misc. Projects such as snippets and small tests
         "$CODE/php/"                                    ; All PHP Projects
         "$CODE/shell/"                                  ; All shell scripts
         "$CODE/tex/")                                   ; All TeX/LaTeX Projects
      projectile-sort-order 'recentf                     ; Sort projects by recently opened and worked on
      display-line-numbers-type t                        ; I like seeing line numbers, what can I say?
      org-directory "$NOTES/org/")               ; Org Directory, in the .notes dir where I like all my notes

;; Emacs fonts
(setq doom-font
      (font-spec :family "Liberation Mono"               ; Linux Liberation Mono Font
                 :size 16))                              ; Font-Size

;; Aspell/ispell stuff to fix errors for some
(setq ispell-program-name "aspell"
      ispell-dictionary "english")

;; GNU TRAMP Configuration
(setq tramp-default-method "ssh"                         ; Default to SSH, that's what I primarily use
      tramp-terminal-type "tramp"                        ; Let other terminal know what client I'm connecting with (might need to configure server)
      tramp-auto-save-directory "$XDG_CACHE_HOME/tramp/" ; Send Tramp info into XDG Cache directory on machine
      tramp-chunksize 2000)                              ; Resonable Chunk size for speed and disk space in mind

;;; Activate Packages defined in packages.el
(use-package doom-themes                                 ; Doom themes, so I can have my nice themes :)
  (setq doom-themes-enable-bold t                        ; if nil, bold is universally disabled
        doom-themes-enable-italic t)                     ; if nil, italics is universally disabled
  (load-theme 'doom-spacegrey t)


For my init, I setup just what I need and I try to disable what I don't utilize. For a full list refer to the repository.

(doom! :completion
       (company +auto)     ; the ultimate code completion backend
       (ivy                ; a search engine for love and

       doom                ; what makes DOOM look the way it does
       doom-quit           ; DOOM quit-message prompts when you quit Emacs
       doom-dashboard      ; a nifty splash screen for Emacs
       hl-todo             ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
       modeline            ; snazzy, Atom-inspired modeline, plus API
       nav-flash           ; blink the current line after jumping
       ophints             ; highlight the region an operation acts on
        +defaults)         ; tame sudden yet inevitable temporary windows
       unicode             ; extended unicode support for various languages
       vc-gutter           ; vcs diff in the fringe
       window-select       ; visually switch windows
       workspaces          ; tab emulation, persistence & separate workspaces

       (evil +everywhere)  ; come to the dark side, we have cookies
       file-templates      ; auto-snippets for empty files
       fold                ; (nigh) universal code folding
       multiple-cursors    ; editing in many places at once
       rotate-text         ; cycle region at point between text candidates
       snippets            ; my elves. They type so I don't have to
       word-wrap           ; soft wrapping with language-aware indent

        +icons)            ; making dired pretty [functional]
       electric            ; smarter, keyword-based electric-indent
       ibuffer             ; interactive buffer management
       vc                  ; version-control and Emacs, sitting in a tree
       undo                ; persistent, smarter undo for your inevitable mistakes

       eshell              ; the elisp shell that works everywhere

       syntax              ; tasing you for every semicolon you forget
        +everywhere)       ; tasing you for misspelling misspelling
       grammar             ; tasing grammar mistake every you make

       editorconfig        ; let someone else argue about tabs vs spaces
       (eval +overlay)     ; run code, run (also, repls)
        +docset)           ; navigate your code and its documentation
       magit               ; a git porcelain for Emacs
       (lsp +peek)
       make                ; run make tasks from Emacs
       pdf                 ; pdf enhancements
       gist                ; interacting with github gists

       cc                  ; C/C++/Obj-C madness
       common-lisp         ; if you've seen one lisp, you've seen them all
       crystal             ; ruby at the speed of c
       data                ; config/data formats
       emacs-lisp          ; drown in parentheses
       (latex              ; writing papers in Emacs has never been so fun
       markdown            ; writing docs for people to ignore
       (org                ; de-facto note taking system for emacs
        +roam              ; org-roam support
        +present)          ; organize your plain life in plain text
       (php +lsp)          ; perl's insecure younger brother
       scheme              ; a fully conniving family of lisps
       (sh +lsp)           ; she sells {ba,z,fi}sh shells on the C xor
       (web +lsp)          ; the tubes
       (yaml +lsp)         ; yaml (yml) support for emacs

       (default +bindings +smartparens)