██████╗ █████╗ ██╗ ██╗███████╗███╗ ██╗ Antonin Fischer (raven2cz) ██╔══██╗██╔══██╗██║ ██║██╔════╝████╗ ██║ https://fishlive.org/ ██████╔╝███████║██║ ██║█████╗ ██╔██╗ ██║ https://arch-linux.cz/ ██╔══██╗██╔══██║╚██╗ ██╔╝██╔══╝ ██║╚██╗██║ https://github.com/raven2cz ██║ ██║██║ ██║ ╚████╔╝ ███████╗██║ ╚████║ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═══╝
- ABOUT THIS CONFIG
- Project Inheritance
- Installation Steps
- BOOKMARKS AND BUFFERS
- CALENDAR
- CENTAUR-TABS
- DASHBOARD
- DOOM THEME
- EMOJIS
- ELFEED
- EVALUATE ELISP EXPRESSIONS
- FONTS
- IVY
- LINE SETTINGS
- MARKDOWN
- MINIMAP
- MODELINE
- MOUSE SUPPORT
- MAIN ACCOUNT
- OPEN SPECIFIC FILES
- ORG MODE
- ORG ROAM
- NEOTREE
- PASSWORD STORE
- REGISTERS
- REMOTE CONNECTIONS
- SHELLS
- SPLITS
- WINNER MODE
- ZZ
This is my personal Doom Emacs config. Doom Emacs is a distribution of Emacs that uses the “evil” keybindings (Vim keybindings) and includes a number of nice extensions and a bit of configuration out of the box. I am maintaining this config not just for myself, but also for those that want to explore some of what is possible with Emacs 🐧.
The Doom Emacs Config Project is inherited from Derek Taylor Emacs Configuration https://gitlab.com/dwt1/dotfiles/-/tree/master/.config/doom. The MIT License is attached to the project LICENSE-DT
.
Doom Emacs installation please read Github hlissner/doom-emacs. There is very raw (but fully all steps) for installation of emacs and my settings for arch system.
paru -S emacs
git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.emacs.d
$HOME/.emacs.d/bin/doom install
add to /etc/profile files appendpath '$HOME/.emacs.d/bin'
- lang cc:
paru -S rtags, Run from emacs: M-x irony-install-server
- common-lisp:
paru -S sbcl
- json:
paru -S jq
- kotlin:
paru -S ktlint
- python:
paru -S python-pipenv python-nose python-pytest
- sh:
paru -S shellcheck
- web:
paru -S tidy stylelint js-beautify
- synch your private org and org-roam repos from git
- link large file resources and images from cloud providers
ln -s $HOME/OneCloud/linux/pictures/org ~/org/images
Doom Emacs uses ‘SPC b’ for keybindings related to bookmarks and buffers. Bookmarks are somewhat like registers in that they record positions you can jump to. Unlike registers, they have long names, and they persist automatically from one Emacs session to the next. The prototypical use of bookmarks is to record where you were reading in various files. Regarding buffers, the text you are editing in Emacs resides in an object called a buffer. Each time you visit a file, a buffer is used to hold the file’s text. Each time you invoke Dired, a buffer is used to hold the directory listing.
Bookmarks are somewhat like registers in that they record positions you can jump to. Unlike registers, they have long names, and they persist automatically from one Emacs session to the next. The prototypical use of bookmarks is to record where you were reading in various files.
(map! :leader
(:prefix ("b". "buffer")
:desc "List bookmarks" "L" #'list-bookmarks
:desc "Save current bookmarks to bookmark file" "w" #'bookmark-save))
To use tabs in Doom Emacs, be sure to uncomment “tabs” in Doom’s init.el. Displays tabs at the top of the window similar to tabbed web browsers such as Firefox. I don’t actually use tabs in Emacs. I placed this in my config to help others who may want tabs. In the default configuration of Doom Emacs, ‘SPC t’ is used for “toggle” keybindings, so I choose ‘SPC t c’ to toggle centaur-tabs. The “g” prefix for keybindings is used for a bunch of evil keybindings in Doom, but “g” plus the arrow keys were not used, so I thought I would bind those for tab navigation. But I did leave the default “g t” and “g T” intact if you prefer to use those for centaur-tabs-forward/backward.
COMMAND | DESCRIPTION | KEYBINDING |
---|---|---|
centaur-tabs-mode | Toggle tabs globally | SPC t c |
centaur-tabs-local-mode | Toggle tabs local display | SPC t C |
centaur-tabs-forward | Next tab | g <right> or g t |
centaur-tabs-backward | Previous tab | g <left> or g T |
centaur-tabs-forward-group | Next tab group | g <down> |
centaur-tabs-backward-group | Previous tab group | g <up> |
(setq centaur-tabs-set-bar 'over
centaur-tabs-set-icons t
centaur-tabs-gray-out-icons 'buffer
centaur-tabs-height 24
centaur-tabs-set-modified-marker t
centaur-tabs-style "bar"
centaur-tabs-modified-marker "•")
(map! :leader
:desc "Toggle tabs globally" "t c" #'centaur-tabs-mode
:desc "Toggle tabs local display" "t C" #'centaur-tabs-local-mode)
(evil-define-key 'normal centaur-tabs-mode-map (kbd "g <right>") 'centaur-tabs-forward ; default Doom binding is 'g t'
(kbd "g <left>") 'centaur-tabs-backward ; default Doom binding is 'g T'
(kbd "g <down>") 'centaur-tabs-forward-group
(kbd "g <up>") 'centaur-tabs-backward-group)
Emacs Dashboard is an extensible startup screen showing you recent files, bookmarks, agenda items and an Emacs banner.
(seq-random-elt [1 2])
(use-package dashboard
:init ;; tweak dashboard config before loading it
(setq dashboard-set-heading-icons t)
(setq dashboard-set-file-icons t)
(setq dashboard-banner-logo-title "Emacs Is More Than A Text Editor!")
;;(setq dashboard-startup-banner 'logo) ;; use standard emacs logo as banner
(setq dashboard-startup-banner (seq-random-elt [
"~/.config/doom/doom.png"
"~/.config/doom/emacs-line-t.png"
"~/.config/doom/org-roam.png"
"~/.config/doom/meditate.png"
"~/.config/doom/emacs-dash.png"
]))
;;(setq dashboard-startup-banner "~/.config/doom/emacs-line-t.png") ;; use custom image as banner
(setq dashboard-center-content nil) ;; set to 't' for centered content
(setq dashboard-items '((recents . 5)
(agenda . 5 )
(bookmarks . 5)
(projects . 5)
(registers . 5)))
:config
(dashboard-setup-startup-hook)
(dashboard-modify-heading-icons '((recents . "file-text")
(bookmarks . "book"))))
This setting ensures that emacsclient always opens on dashboard rather than scratch.
(setq doom-fallback-buffer-name "*dashboard*")
Setting the theme to doom-one. To try out new themes, I set a keybinding for counsel-load-theme with ‘SPC h t’.
(map! :leader
:desc "Load new theme" "h t" #'counsel-load-theme)
;; There are two ways to load a theme. Both assume the theme is installed and
;; available. You can either set `doom-theme' or manually load a theme with the
;; `load-theme' function. This is the default:
;;(setq doom-theme 'doom-palenight)
;;(setq doom-theme 'doom-one)
(use-package doom-themes
:config
;; Global settings (defaults)
(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-one t)
;; Enable flashing mode-line on errors
(doom-themes-visual-bell-config)
;; Enable custom neotree theme (all-the-icons must be installed!)
(doom-themes-neotree-config)
;; or for treemacs users
(doom-themes-treemacs-config)
;; Corrects (and improves) org-mode's native fontification.
(doom-themes-org-config))
(setq doom-themes-treemacs-theme "doom-colors")
Emojify is an Emacs extension to display emojis. It can display github style emojis like 😄 or plain ascii ones like :).
(use-package emojify
:hook (after-init . global-emojify-mode))
An RSS newsfeed reader for Emacs.
(use-package! elfeed-goodies)
(elfeed-goodies/setup)
(setq elfeed-goodies/entry-pane-size 0.5)
(add-hook 'elfeed-show-mode-hook 'visual-line-mode)
(evil-define-key 'normal elfeed-show-mode-map
(kbd "J") 'elfeed-goodies/split-show-next
(kbd "K") 'elfeed-goodies/split-show-prev)
(evil-define-key 'normal elfeed-search-mode-map
(kbd "J") 'elfeed-goodies/split-show-next
(kbd "K") 'elfeed-goodies/split-show-prev)
(setq elfeed-feeds (quote
(("https://www.reddit.com/r/linux.rss" reddit linux)
("https://www.reddit.com/r/commandline.rss" reddit commandline)
("https://www.reddit.com/r/distrotube.rss" reddit distrotube)
("https://www.reddit.com/r/emacs.rss" reddit emacs)
("https://www.gamingonlinux.com/article_rss.php" gaming linux)
("https://hackaday.com/blog/feed/" hackaday linux)
("https://opensource.com/feed" opensource linux)
("https://linux.softpedia.com/backend.xml" softpedia linux)
("https://itsfoss.com/feed/" itsfoss linux)
("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux)
("https://www.phoronix.com/rss.php" phoronix linux)
("http://feeds.feedburner.com/d0od" omgubuntu linux)
("https://www.computerworld.com/index.rss" computerworld linux)
("https://www.networkworld.com/category/linux/index.rss" networkworld linux)
("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux)
("https://betanews.com/feed" betanews linux)
("http://lxer.com/module/newswire/headlines.rss" lxer linux)
("https://distrowatch.com/news/dwd.xml" distrowatch linux))))
Changing some keybindings from their defaults to better fit with Doom Emacs, and to avoid conflicts with my window managers which sometimes use the control key in their keybindings. By default, Doom Emacs does not use ‘SPC e’ for anything, so I choose to use the format ‘SPC e’ plus ‘key’ for these (I also use ‘SPC e’ for ‘eww’ keybindings).
COMMAND | DESCRIPTION | KEYBINDING |
---|---|---|
eval-buffer | Evaluate elisp in buffer | SPC e b |
eval-defun | Evaluate the defun containing or after point | SPC e d |
eval-expression | Evaluate an elisp expression | SPC e e |
eval-last-sexp | Evaluate elisp expression before point | SPC e l |
eval-region | Evaluate elisp in region | SPC e r |
(map! :leader
(:prefix ("e". "evaluate/ERC/EWW")
:desc "Evaluate elisp in buffer" "b" #'eval-buffer
:desc "Evaluate defun" "d" #'eval-defun
:desc "Evaluate elisp expression" "e" #'eval-expression
:desc "Evaluate last sexpression" "l" #'eval-last-sexp
:desc "Evaluate elisp in region" "r" #'eval-region))
Settings related to fonts within Doom Emacs:
- ‘doom-font’ – standard monospace font that is used for most things in Emacs.
- ‘doom-variable-pitch-font’ – variable font which is useful in some Emacs plugins.
- ‘doom-big-font’ – used in doom-big-font-mode; useful for presentations.
- ‘font-lock-comment-face’ – for comments.
- ‘font-lock-keyword-face’ – for keywords with special significance like ‘setq’ in elisp.
- ‘global-prettify-symbols-mode’ – change certain keywords to symbols, such as lambda!
(setq doom-font (font-spec :family "UbuntuMono Nerd Font" :size 19)
doom-variable-pitch-font (font-spec :family "UbuntuMono Nerd Font" :size 19))
(after! doom-themes
(setq doom-themes-enable-bold t
doom-themes-enable-italic t))
(custom-set-faces!
'(font-lock-comment-face :slant italic)
'(font-lock-keyword-face :slant italic))
Ivy is a generic completion mechanism for Emacs.
Ivy-posframe is an ivy extension, which lets ivy use posframe to show its candidate menu. Some of the settings below involve:
- ivy-posframe-display-functions-alist – sets the display position for specific programs
- ivy-posframe-height-alist – sets the height of the list displayed for specific programs
Available functions (positions) for ‘ivy-posframe-display-functions-alist’
- ivy-posframe-display-at-frame-center
- ivy-posframe-display-at-window-center
- ivy-posframe-display-at-frame-bottom-left
- ivy-posframe-display-at-window-bottom-left
- ivy-posframe-display-at-frame-bottom-window-center
- ivy-posframe-display-at-point
- ivy-posframe-display-at-frame-top-center
NOTE:
If the setting for ‘ivy-posframe-display’ is set to ‘nil’ (false), anything that is set to ‘ivy-display-function-fallback’ will just default to their normal position in Doom Emacs (usually a bottom split). However, if this is set to ‘t’ (true), then the fallback position will be centered in the window.
(setq ivy-posframe-display-functions-alist
'((swiper . ivy-posframe-display-at-point)
(complete-symbol . ivy-posframe-display-at-point)
(counsel-M-x . ivy-display-function-fallback)
(counsel-esh-history . ivy-posframe-display-at-window-center)
(counsel-describe-function . ivy-display-function-fallback)
(counsel-describe-variable . ivy-display-function-fallback)
(counsel-find-file . ivy-display-function-fallback)
(counsel-recentf . ivy-display-function-fallback)
(counsel-register . ivy-posframe-display-at-frame-bottom-window-center)
(dmenu . ivy-posframe-display-at-frame-top-center)
(nil . ivy-posframe-display))
ivy-posframe-height-alist
'((swiper . 20)
(dmenu . 20)
(t . 10)))
(ivy-posframe-mode 1) ; 1 enables posframe-mode, 0 disables it.
By default, Doom Emacs does not use ‘SPC v’, so the format I use for these bindings is ‘SPC v’ plus ‘key’.
(map! :leader
(:prefix ("v" . "Ivy")
:desc "Ivy push view" "v p" #'ivy-push-view
:desc "Ivy switch view" "v s" #'ivy-switch-view))
I set comment-line to ‘SPC TAB TAB’ which is a rather comfortable keybinding for me on my ZSA Moonlander keyboard. The standard Emacs keybinding for comment-line is ‘C-x C-;’. The other keybindings are for commands that toggle on/off various line-related settings. Doom Emacs uses ‘SPC t’ for “toggle” commands, so I choose ‘SPC t’ plus ‘key’ for those bindings.
COMMAND | DESCRIPTION | KEYBINDING |
---|---|---|
comment-line | Comment or uncomment lines | SPC TAB TAB |
hl-line-mode | Toggle line highlighting in current frame | SPC t h |
global-hl-line-mode | Toggle line highlighting globally | SPC t H |
doom/toggle-line-numbers | Toggle line numbers | SPC t l |
toggle-truncate-lines | Toggle truncate lines | SPC t t |
(setq display-line-numbers-type t)
(map! :leader
:desc "Comment or uncomment lines" "TAB TAB" #'comment-line
(:prefix ("t" . "toggle")
:desc "Toggle line numbers" "l" #'doom/toggle-line-numbers
:desc "Toggle line highlight in frame" "h" #'hl-line-mode
:desc "Toggle line highlight globally" "H" #'global-hl-line-mode
:desc "Toggle truncate lines" "t" #'toggle-truncate-lines))
Adding mouse support in the terminal version of Emacs.
(xterm-mouse-mode 1)
Some functionality uses this to identify you, e.g. GPG configuration, email clients, file templates and snippets.
(setq user-full-name "Antonin Fischer"
user-mail-address "tonda.fischer@gmail.com")
Keybindings to open files that I work with all the time using the find-file command, which is the interactive file search that opens with ‘C-x C-f’ in GNU Emacs or ‘SPC f f’ in Doom Emacs. These keybindings use find-file non-interactively since we specify exactly what file to open. The format I use for these bindings is ‘SPC -’ plus ‘key’ since Doom Emacs does not use these keybindings.
PATH TO FILE | DESCRIPTION | KEYBINDING |
---|---|---|
~/org/agenda.org | Edit agenda file | SPC - a |
~/.config/doom/config.org” | Edit doom config.org | SPC - c |
~/.config/doom/eshell/aliases” | Edit eshell aliases | SPC - e a |
~/.config/doom/eshell/profile” | Edit eshell profile | SPC - e p |
~/.config/doom/init.el” | Edit doom init.el | SPC - i |
~/.config/doom/packages.el” | Edit doom packages.el | SPC - p |
(map! :leader
(:prefix ("-" . "open file")
:desc "Edit agenda file" "a" #'(lambda () (interactive) (find-file "~/org/agenda.org"))
:desc "Edit doom config.org" "c" #'(lambda () (interactive) (find-file "~/.config/doom/config.org"))
:desc "Edit eshell aliases" "e a" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases"))
:desc "Edit eshell aliases" "e p" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/profile"))
:desc "Edit doom init.el" "i" #'(lambda () (interactive) (find-file "~/.config/doom/init.el"))
:desc "Edit doom packages.el" "p" #'(lambda () (interactive) (find-file "~/.config/doom/packages.el"))))
A GNU Emacs major mode for convenient plain text markup — and much more.
Org mode is for keeping notes, maintaining to-do lists, planning projects, authoring documents, computational notebooks, literate programming and more — in a fast and effective plain text system.
;; If you use `org' and don't want your org files in the default location below,
;; change `org-directory'. It must be set before org loads!
(setq org-directory "~/org/")
(after! org
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))
;; This determines the style of line numbers in effect. If set to `nil', line
;; numbers are disabled. For relative line numbers, set this to `relative'.
(setq display-line-numbers-type t)
Org Mode is known to be a great tool not just for writing and personal notes but also TODO lists, project planning, time tracking, and more. Once you start to become really invested in Org Mode you’ll eventually have to come up with a system for managing your Org files so that it’s easy to store and find the information you need.
Org Roam is an extension to Org Mode which solves a couple of the biggest problems that I’ve personally had when using Org for personal notes:
- How many Org files do I need?
- How do I decide where to put things in my Org files?
Org Roam solves these problems by making it easy to create topic-focused Org Files and link them together so that you can treat the information as nodes in a network rather than as hierarchical documents. You can think of it like a personal wiki!
It’s inspired by a program called Roam and a note-taking strategy called Zettelkasten where the goal is to create many individual single-topic notes that are linked together to create a “networked” knowledge base.
Many people consider this like creating a “second brain” because it can easily handle a huge amount of knowledge and remind you of connections between topics very effectively.
The major advantage of Org Roam over other similar note taking tools is that you get to use all of the other great features of Org Mode in a new way!
(use-package org-roam
:custom
(org-roam-directory "~/org/roam")
:bind (("C-c n l" . org-roam-buffer-toggle)
("C-c n f" . org-roam-node-find)
("C-c n i" . org-roam-node-insert))
:config
(org-roam-setup))
Neotree is a file tree viewer. When you open neotree, it jumps to the current file thanks to neo-smart-open. The neo-window-fixed-size setting makes the neotree width be adjustable. Doom Emacs had no keybindings set for neotree. Since Doom Emacs uses ‘SPC t’ for ‘toggle’ keybindings, I used ‘SPC t n’ for toggle-neotree.
COMMAND | DESCRIPTION | KEYBINDING |
---|---|---|
neotree-toggle | Toggle neotree | SPC t n |
neotree- dir | Open directory in neotree | SPC d n |
(after! neotree
(setq neo-smart-open t
neo-window-fixed-size nil))
(after! doom-themes
(setq doom-neotree-enable-variable-pitch t))
(map! :leader
:desc "Toggle neotree file viewer" "t n" #'neotree-toggle
:desc "Open directory in neotree" "d n" #'neotree-dir)
Uses the standard Unix password store “pass”.
(use-package! password-store)
Emacs registers are compartments where you can save text, rectangles and positions for later use. Once you save text or a rectangle in a register, you can copy it into the buffer once or many times; once you save a position in a register, you can jump back to that position once or many times. The default GNU Emacs keybindings for these commands (with the exception of counsel-register) involves ‘C-x r’ followed by one or more other keys. I wanted to make this a little more user friendly, and since I am using Doom Emacs, I choose to replace the ‘C-x r’ part of the key chords with ‘SPC r’.
COMMAND | DESCRIPTION | KEYBINDING |
---|---|---|
copy-to-register | Copy to register | SPC r c |
frameset-to-register | Frameset to register | SPC r f |
insert-register | Insert contents of register | SPC r i |
jump-to-register | Jump to register | SPC r j |
list-registers | List registers | SPC r l |
number-to-register | Number to register | SPC r n |
counsel-register | Interactively choose a register | SPC r r |
view-register | View a register | SPC r v |
window-configuration-to-register | Window configuration to register | SPC r w |
increment-register | Increment register | SPC r + |
point-to-register | Point to register | SPC r SPC |
(map! :leader
(:prefix ("r" . "registers")
:desc "Copy to register" "c" #'copy-to-register
:desc "Frameset to register" "f" #'frameset-to-register
:desc "Insert contents of register" "i" #'insert-register
:desc "Jump to register" "j" #'jump-to-register
:desc "List registers" "l" #'list-registers
:desc "Number to register" "n" #'number-to-register
:desc "Interactively choose a register" "r" #'counsel-register
:desc "View a register" "v" #'view-register
:desc "Window configuration to register" "w" #'window-configuration-to-register
:desc "Increment register" "+" #'increment-register
:desc "Point to register" "SPC" #'point-to-register))
Keybindings for ssh’ing into remote machines. By default, Doom Emacs does not use ‘SPC ', so the format I use for these bindings is ‘SPC ' plus ‘key’.
DESCRIPTION | KEYBINDING |
---|---|
Ssh into distrotube.com | SPC \ d |
Ssh into my nextcloud | SPC \ n |
(map! :leader
(:prefix ("\\" . "ssh")
:desc "Ssh into fishlive.org" "\\ d" #'(lambda () (interactive) (find-file "/scp:pi@fishlive.org"))
:desc "Ssh into Ubuntu Server" "\\ n" #'(lambda () (interactive) (find-file "/scp:box@192.168.88.100"))))
Settings for the various shells and terminal emulators within Emacs.
- ‘shell-file-name’ – sets the shell to be used in M-x shell, M-x term, M-x ansi-term and M-x vterm.
- ‘eshell-aliases-file’ – sets an aliases file for the eshell.
(setq shell-file-name "/bin/fish"
vterm-max-scrollback 5000)
(setq eshell-rc-script "~/.config/doom/eshell/profile"
eshell-aliases-file "~/.config/doom/eshell/aliases"
eshell-history-size 5000
eshell-buffer-maximum-lines 5000
eshell-hist-ignoredups t
eshell-scroll-to-bottom-on-input t
eshell-destroy-buffer-when-process-dies t
eshell-visual-commands'("bash" "fish" "htop" "ssh" "top" "zsh"))
(map! :leader
:desc "Eshell" "e s" #'eshell
:desc "Eshell popup toggle" "e t" #'+eshell/toggle
:desc "Counsel eshell history" "e h" #'counsel-esh-history
:desc "Vterm popup toggle" "v t" #'+vterm/toggle)
I set splits to default to opening on the right using ‘prefer-horizontal-split’. I set a keybinding for ‘clone-indirect-buffer-other-window’ for when I want to have the same document in two splits. The text of the indirect buffer is always identical to the text of its base buffer; changes made by editing either one are visible immediately in the other. But in all other respects, the indirect buffer and its base buffer are completely separate. For example, I can fold one split but other will be unfolded.
(defun prefer-horizontal-split ()
(set-variable 'split-height-threshold nil t)
(set-variable 'split-width-threshold 40 t)) ; make this as low as needed
(add-hook 'markdown-mode-hook 'prefer-horizontal-split)
(map! :leader
:desc "Clone indirect buffer other window" "b c" #'clone-indirect-buffer-other-window)
Winner mode has been included with GNU Emacs since version 20. This is a global minor mode and, when activated, it allows you to “undo” (and “redo”) changes in the window configuration with the key commands ‘SCP w <left>’ and ‘SPC w <right>’.
(map! :leader
(:prefix ("w" . "window")
:desc "Winner redo" "<right>" #'winner-redo
:desc "Winner undo" "<left>" #'winner-undo))
;; If you use `org' and don't want your org files in the default location below,
;; these are the defaults (before I changed them)
;;(setq company-idle-delay 0.2
;; company-minimum-prefix-length 3)
;;(setq projectile-project-search-path '("~/git/"))
;; Here are some additional functions/macros that could help you configure Doom:
;;
;; - `load!' for loading external *.el files relative to this one
;; - `use-package!' for configuring packages
;; - `after!' for running code after a package has loaded
;; - `add-load-path!' for adding directories to the `load-path', relative to
;; this file. Emacs searches the `load-path' when you load packages with
;; `require' or `use-package'.
;; - `map!' for binding new keys
;;
;; To get information about any of these functions/macros, move the cursor over
;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k').
;; This will open documentation for it, including demos of how they are used.
;;
;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how
;; they are implemented.