about summary refs log tree commit diff
path: root/users/grfn/emacs.d
diff options
context:
space:
mode:
Diffstat (limited to 'users/grfn/emacs.d')
-rw-r--r--users/grfn/emacs.d/+bindings.el1439
-rw-r--r--users/grfn/emacs.d/+commands.el149
-rw-r--r--users/grfn/emacs.d/+private.el.gpgbin1115 -> 0 bytes
-rw-r--r--users/grfn/emacs.d/.gitignore2
-rw-r--r--users/grfn/emacs.d/autoload/evil.el37
-rw-r--r--users/grfn/emacs.d/autoload/hlissner.el53
-rw-r--r--users/grfn/emacs.d/clocked-in-elt.el17
-rw-r--r--users/grfn/emacs.d/clojure.el53
-rw-r--r--users/grfn/emacs.d/company-sql.el299
-rw-r--r--users/grfn/emacs.d/config.el1139
-rw-r--r--users/grfn/emacs.d/cpp.el39
-rw-r--r--users/grfn/emacs.d/email.el53
-rw-r--r--users/grfn/emacs.d/github-org.el99
-rw-r--r--users/grfn/emacs.d/google-c-style.el151
-rw-r--r--users/grfn/emacs.d/grid.el128
-rw-r--r--users/grfn/emacs.d/init.el175
-rw-r--r--users/grfn/emacs.d/irc.el131
-rw-r--r--users/grfn/emacs.d/lisp.el38
-rwxr-xr-xusers/grfn/emacs.d/nix-clangd.sh7
-rw-r--r--users/grfn/emacs.d/nix.el30
-rw-r--r--users/grfn/emacs.d/org-alerts.el188
-rw-r--r--users/grfn/emacs.d/org-config.el191
-rw-r--r--users/grfn/emacs.d/org-gcal.el181
-rw-r--r--users/grfn/emacs.d/org-query.el143
-rw-r--r--users/grfn/emacs.d/packages.el154
-rw-r--r--users/grfn/emacs.d/rust.el42
-rw-r--r--users/grfn/emacs.d/show-matching-paren.el61
-rw-r--r--users/grfn/emacs.d/slack-snippets.el227
-rw-r--r--users/grfn/emacs.d/slack.el24
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/annotation5
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/benchmark-module26
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/header5
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/hedgehog-generator8
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/hedgehog-property9
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/hlint8
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/import-i4
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/inl6
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/inline5
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/language pragma6
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/lens.field7
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/module32
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/shut up, hlint6
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/test-group9
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/test-module27
-rw-r--r--users/grfn/emacs.d/snippets/haskell-mode/undefined6
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/action-type4
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/before7
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/context7
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/describe6
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/expect5
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/function6
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/header6
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/it7
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/it-pending5
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/module12
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/record7
-rw-r--r--users/grfn/emacs.d/snippets/js2-mode/test7
-rw-r--r--users/grfn/emacs.d/snippets/nix-mode/fetchFromGitHub12
-rw-r--r--users/grfn/emacs.d/snippets/nix-mode/pythonPackage16
-rw-r--r--users/grfn/emacs.d/snippets/nix-mode/sha2567
-rw-r--r--users/grfn/emacs.d/snippets/org-mode/SQL source block6
-rw-r--r--users/grfn/emacs.d/snippets/org-mode/combat13
-rw-r--r--users/grfn/emacs.d/snippets/org-mode/date5
-rw-r--r--users/grfn/emacs.d/snippets/org-mode/date-time5
-rw-r--r--users/grfn/emacs.d/snippets/org-mode/description7
-rw-r--r--users/grfn/emacs.d/snippets/org-mode/nologdone5
-rw-r--r--users/grfn/emacs.d/snippets/org-mode/python source block6
-rw-r--r--users/grfn/emacs.d/snippets/org-mode/reveal6
-rw-r--r--users/grfn/emacs.d/snippets/org-mode/transaction7
-rw-r--r--users/grfn/emacs.d/snippets/prolog-mode/use-module7
-rw-r--r--users/grfn/emacs.d/snippets/python-mode/add_column5
-rw-r--r--users/grfn/emacs.d/snippets/python-mode/decorate15
-rw-r--r--users/grfn/emacs.d/snippets/python-mode/dunder7
-rw-r--r--users/grfn/emacs.d/snippets/python-mode/name7
-rw-r--r--users/grfn/emacs.d/snippets/python-mode/op.get_bind.execute7
-rw-r--r--users/grfn/emacs.d/snippets/python-mode/pdb7
-rw-r--r--users/grfn/emacs.d/snippets/rust-mode/#[macro_use]5
-rw-r--r--users/grfn/emacs.d/snippets/rust-mode/async test10
-rw-r--r--users/grfn/emacs.d/snippets/rust-mode/benchmark10
-rw-r--r--users/grfn/emacs.d/snippets/rust-mode/proptest10
-rw-r--r--users/grfn/emacs.d/snippets/rust-mode/test-module11
-rw-r--r--users/grfn/emacs.d/snippets/rust-mode/tests9
-rw-r--r--users/grfn/emacs.d/snippets/snippet-mode/indent5
-rw-r--r--users/grfn/emacs.d/snippets/sql-mode/count(*) group by5
-rw-r--r--users/grfn/emacs.d/snippets/terraform-mode/variable11
-rw-r--r--users/grfn/emacs.d/snippets/text-mode/date5
-rw-r--r--users/grfn/emacs.d/splitjoin.el192
-rw-r--r--users/grfn/emacs.d/sql-strings.el75
-rw-r--r--users/grfn/emacs.d/terraform.el31
-rw-r--r--users/grfn/emacs.d/tests/splitjoin_test.el68
-rw-r--r--users/grfn/emacs.d/themes/grfn-solarized-light-theme.el115
-rw-r--r--users/grfn/emacs.d/utils.el114
-rw-r--r--users/grfn/emacs.d/vterm.el24
93 files changed, 0 insertions, 6348 deletions
diff --git a/users/grfn/emacs.d/+bindings.el b/users/grfn/emacs.d/+bindings.el
deleted file mode 100644
index 0bcc92263571..000000000000
--- a/users/grfn/emacs.d/+bindings.el
+++ /dev/null
@@ -1,1439 +0,0 @@
-;; -*- lexical-binding: t; -*-
-
-(load! "utils")
-(require 'f)
-(require 'predd)
-
-(undefine-key! :keymaps 'doom-leader-map "/")
-
-(defmacro find-file-in! (path &optional project-p)
-  "Returns an interactive function for searching files."
-  `(lambda () (interactive)
-     (let ((default-directory ,path))
-       (call-interactively
-        ',(command-remapping
-           (if project-p
-               #'projectile-find-file
-             #'find-file))))))
-
-(defun dired-mode-p () (eq 'dired-mode major-mode))
-
-(defun grfn/dired-minus ()
-  (interactive)
-  (if (dired-mode-p)
-      (dired-up-directory)
-    (when buffer-file-name
-      (-> (buffer-file-name)
-          (f-dirname)
-          (dired)))))
-
-(defmacro define-move-and-insert
-    (name &rest body)
-  `(defun ,name (count &optional vcount skip-empty-lines)
-     ;; Following interactive form taken from the source for `evil-insert'
-     (interactive
-      (list (prefix-numeric-value current-prefix-arg)
-            (and (evil-visual-state-p)
-                 (memq (evil-visual-type) '(line block))
-                 (save-excursion
-                   (let ((m (mark)))
-                     ;; go to upper-left corner temporarily so
-                     ;; `count-lines' yields accurate results
-                     (evil-visual-rotate 'upper-left)
-                     (prog1 (count-lines evil-visual-beginning evil-visual-end)
-                       (set-mark m)))))
-            (evil-visual-state-p)))
-     (atomic-change-group
-       ,@body
-       (evil-insert count vcount skip-empty-lines))))
-
-(define-move-and-insert grfn/insert-at-sexp-end
-  (when (not (equal (get-char) "("))
-    (backward-up-list))
-  (forward-sexp)
-  (backward-char))
-
-(define-move-and-insert grfn/insert-at-sexp-start
-  (backward-up-list)
-  (forward-char))
-
-(define-move-and-insert grfn/insert-at-form-start
-  (backward-sexp)
-  (backward-char)
-  (insert " "))
-
-(define-move-and-insert grfn/insert-at-form-end
-  (forward-sexp)
-  (insert " "))
-
-(load! "splitjoin")
-
-(defun +hlissner/install-snippets ()
-  "Install my snippets from https://github.com/hlissner/emacs-snippets into
-private/hlissner/snippets."
-  (interactive)
-  (doom-fetch :github "hlissner/emacs-snippets"
-              (expand-file-name "snippets" (doom-module-path :private 'hlissner))))
-
-(defun +hlissner/yank-buffer-filename ()
-  "Copy the current buffer's path to the kill ring."
-  (interactive)
-  (if-let* ((filename (or buffer-file-name (bound-and-true-p list-buffers-directory))))
-      (message (kill-new (abbreviate-file-name filename)))
-    (error "Couldn't find filename in current buffer")))
-
-(defmacro +def-finder! (name dir)
-  "Define a pair of find-file and browse functions."
-  `(progn
-     (defun ,(intern (format "+find-in-%s" name)) ()
-       (interactive)
-       (let ((default-directory ,dir)
-             projectile-project-name
-             projectile-require-project-root
-             projectile-cached-buffer-file-name
-             projectile-cached-project-root)
-         (call-interactively #'projectile-find-file)))
-     (defun ,(intern (format "+hlissner/browse-%s" name)) ()
-       (interactive)
-       (let ((default-directory ,dir))
-         (call-interactively (command-remapping #'find-file))))))
-
-(+def-finder! templates +file-templates-dir)
-(+def-finder! snippets +grfn-snippets-dir)
-(+def-finder! dotfiles (expand-file-name ".dotfiles" "~"))
-(+def-finder! doomd (expand-file-name ".doom.d" "~"))
-(+def-finder! notes +org-dir)
-(+def-finder! home-config (expand-file-name "code/system/home" "~"))
-(+def-finder! system-config (expand-file-name "code/system/system" "~"))
-
-(defun +grfn/paxedit-kill (&optional n)
-  (interactive "p")
-  (or (paxedit-comment-kill)
-      (when (paxedit-symbol-cursor-within?)
-        (paxedit-symbol-kill))
-      (paxedit-implicit-sexp-kill n)
-      (paxedit-sexp-kill n)
-      (message paxedit-message-kill)))
-
-;;;
-
-(evil-set-command-property 'flycheck-next-error :repeat nil)
-(evil-set-command-property 'flycheck-prev-error :repeat nil)
-(evil-set-command-property 'flycheck-previous-error :repeat nil)
-(evil-set-command-property 'smerge-next :repeat nil)
-(evil-set-command-property 'smerge-prev :repeat nil)
-
-;;;
-
-(map!
- [remap evil-jump-to-tag] #'projectile-find-tag
- [remap find-tag]         #'projectile-find-tag
- ;; ensure there are no conflicts
- :nmvo doom-leader-key nil
- :nmvo doom-localleader-key nil)
-
-(undefine-key! :keymaps 'doom-leader-map "/")
-
-(map!
- ;; --- Global keybindings ---------------------------
- ;; Make M-x available everywhere
- :gnvime "M-x" #'execute-extended-command
- :gnvime "A-x" #'execute-extended-command
- ;; Emacs debug utilities
- :gnvime "M-;" #'eval-expression
- :gnvime "M-:" #'doom/open-scratch-buffer
- ;; Text-scaling
- "M-+"       (λ! (text-scale-set 0))
- "M-="       #'text-scale-increase
- "M--"       #'text-scale-decrease
- ;; Simple window navigation/manipulation
- "C-`"       #'doom/popup-toggle
- "C-~"       #'doom/popup-raise
- "M-t"       #'+workspace/new
- "M-T"       #'+workspace/display
- "M-w"       #'delete-window
- "M-W"       #'+workspace/close-workspace-or-frame
- "M-n"       #'evil-buffer-new
- "M-N"       #'make-frame
- "M-1"       (λ! (+workspace/switch-to 0))
- "M-2"       (λ! (+workspace/switch-to 1))
- "M-3"       (λ! (+workspace/switch-to 2))
- "M-4"       (λ! (+workspace/switch-to 3))
- "M-5"       (λ! (+workspace/switch-to 4))
- "M-6"       (λ! (+workspace/switch-to 5))
- "M-7"       (λ! (+workspace/switch-to 6))
- "M-8"       (λ! (+workspace/switch-to 7))
- "M-9"       (λ! (+workspace/switch-to 8))
- "M-0"       #'+workspace/switch-to-last
- ;; Other sensible, textmate-esque global bindings
- :ne "M-r"   #'+eval/buffer
- :ne "M-R"   #'+eval/region-and-replace
- :ne "M-b"   #'+eval/build
- :ne "M-a"   #'mark-whole-buffer
- :ne "M-c"   #'evil-yank
- :ne "M-q"   (if (daemonp) #'delete-frame #'save-buffers-kill-emacs)
- :ne "M-f"   #'swiper
- :ne "C-M-f" #'doom/toggle-fullscreen
- :n  "M-s"   #'save-buffer
- :m  "A-j"   #'+hlissner:multi-next-line
- :m  "A-k"   #'+hlissner:multi-previous-line
- :nv "C-SPC" #'+evil:fold-toggle
- :gnvimer "M-v" #'clipboard-yank
- ;; Easier window navigation
- :en "C-h"   #'evil-window-left
- :en "C-j"   #'evil-window-down
- :en "C-k"   #'evil-window-up
- :en "C-l"   #'evil-window-right
- :n "U" #'undo-tree-visualize
-
- "C-x p"     #'doom/other-popup
-
- :n "K" #'+lookup/documentation
- :n "g d" #'+lookup/definition
-
-
- ;; --- <leader> -------------------------------------
- (:leader
-   :desc "Ex command"              :nv ";"  #'evil-ex
-   :desc "M-x"                     :nv ":"  #'execute-extended-command
-   :desc "Pop up scratch buffer"   :nv "x"  #'doom/open-scratch-buffer
-   :desc "Org Capture"             :nv "X"  #'org-capture
-   :desc "Org Capture"             :nv "a"  #'org-capture
-
-   ;; Most commonly used
-   :desc "Find file in project"    :n "SPC" #'projectile-find-file
-   :desc "Switch workspace buffer" :n ","   #'persp-switch-to-buffer
-   :desc "Switch buffer"           :n "<"   #'switch-to-buffer
-   :desc "Browse files"            :n "."   #'find-file
-   :desc "Toggle last popup"       :n "~"   #'doom/popup-toggle
-   :desc "Eval expression"         :n "`"   #'eval-expression
-   :desc "Blink cursor line"       :n "DEL" #'+doom/blink-cursor
-   :desc "Jump to bookmark"        :n "RET" #'bookmark-jump
-
-   ;; C-u is used by evil
-   :desc "Universal argument"      :n "u"  #'universal-argument
-   :desc "window"                  :n "w"  evil-window-map
-
-   (:desc "previous..." :prefix "["
-     :desc "Text size"             :nv "[" #'text-scale-decrease
-     :desc "Buffer"                :nv "b" #'doom/previous-buffer
-     :desc "Diff Hunk"             :nv "d" #'git-gutter:previous-hunk
-     :desc "Todo"                  :nv "t" #'hl-todo-previous
-     :desc "Error"                 :nv "e" #'flycheck-previous-error
-     :desc "Workspace"             :nv "w" #'+workspace/switch-left
-     :desc "Smart jump"            :nv "h" #'smart-backward
-     :desc "Spelling error"        :nv "s" #'evil-prev-flyspell-error
-     :desc "Spelling correction"   :n  "S" #'flyspell-correct-previous-word-generic
-     :desc "Git conflict"          :n  "n" #'smerge-prev)
-
-   (:desc "next..." :prefix "]"
-     :desc "Text size"             :nv "]" #'text-scale-increase
-     :desc "Buffer"                :nv "b" #'doom/next-buffer
-     :desc "Diff Hunk"             :nv "d" #'git-gutter:next-hunk
-     :desc "Todo"                  :nv "t" #'hl-todo-next
-     :desc "Error"                 :nv "e" #'flycheck-next-error
-     :desc "Workspace"             :nv "w" #'+workspace/switch-right
-     :desc "Smart jump"            :nv "l" #'smart-forward
-     :desc "Spelling error"        :nv "s" #'evil-next-flyspell-error
-     :desc "Spelling correction"   :n  "S" #'flyspell-correct-word-generic
-     :desc "Git conflict"          :n  "n" #'smerge-next)
-
-   (:desc "search" :prefix "/"
-     :desc "Swiper"                :nv "/" #'swiper
-     :desc "Imenu"                 :nv "i" #'imenu
-     :desc "Imenu across buffers"  :nv "I" #'imenu-anywhere
-     :desc "Online providers"      :nv "o" #'+lookup/online-select)
-
-   (:desc "workspace" :prefix "TAB"
-     :desc "Display tab bar"          :n "TAB" #'+workspace/display
-     :desc "New workspace"            :n "n"   #'+workspace/new
-     :desc "Load workspace from file" :n "l"   #'+workspace/load
-     :desc "Load last session"        :n "L"   (λ! (+workspace/load-session))
-     :desc "Save workspace to file"   :n "s"   #'+workspace/save
-     :desc "Autosave current session" :n "S"   #'+workspace/save-session
-     :desc "Switch workspace"         :n "."   #'+workspace/switch-to
-     :desc "Kill all buffers"         :n "x"   #'doom/kill-all-buffers
-     :desc "Delete session"           :n "X"   #'+workspace/kill-session
-     :desc "Delete this workspace"    :n "d"   #'+workspace/delete
-     :desc "Load session"             :n "L"   #'+workspace/load-session
-     :desc "Next workspace"           :n "]"   #'+workspace/switch-right
-     :desc "Previous workspace"       :n "["   #'+workspace/switch-left
-     :desc "Switch to 1st workspace"  :n "1"   (λ! (+workspace/switch-to 0))
-     :desc "Switch to 2nd workspace"  :n "2"   (λ! (+workspace/switch-to 1))
-     :desc "Switch to 3rd workspace"  :n "3"   (λ! (+workspace/switch-to 2))
-     :desc "Switch to 4th workspace"  :n "4"   (λ! (+workspace/switch-to 3))
-     :desc "Switch to 5th workspace"  :n "5"   (λ! (+workspace/switch-to 4))
-     :desc "Switch to 6th workspace"  :n "6"   (λ! (+workspace/switch-to 5))
-     :desc "Switch to 7th workspace"  :n "7"   (λ! (+workspace/switch-to 6))
-     :desc "Switch to 8th workspace"  :n "8"   (λ! (+workspace/switch-to 7))
-     :desc "Switch to 9th workspace"  :n "9"   (λ! (+workspace/switch-to 8))
-     :desc "Switch to last workspace" :n "0"   #'+workspace/switch-to-last)
-
-   (:desc "buffer" :prefix "b"
-     :desc "New empty buffer"        :n "n" #'evil-buffer-new
-     :desc "Switch workspace buffer" :n "b" #'switch-to-buffer
-     :desc "Switch buffer"           :n "B" #'switch-to-buffer
-     :desc "Kill buffer"             :n "k" #'doom/kill-this-buffer
-     :desc "Kill other buffers"      :n "o" #'doom/kill-other-buffers
-     :desc "Save buffer"             :n "s" #'save-buffer
-     :desc "Pop scratch buffer"      :n "x" #'doom/open-scratch-buffer
-     :desc "Bury buffer"             :n "z" #'bury-buffer
-     :desc "Next buffer"             :n "]" #'doom/next-buffer
-     :desc "Previous buffer"         :n "[" #'doom/previous-buffer
-     :desc "Sudo edit this file"     :n "S" #'doom/sudo-this-file)
-
-   (:desc "code" :prefix "c"
-     :desc "List errors"               :n  "x" #'flycheck-list-errors
-     :desc "Evaluate buffer/region"    :n  "e" #'+eval/buffer
-                                       :v  "e" #'+eval/region
-     :desc "Evaluate & replace region" :nv "E" #'+eval:replace-region
-     :desc "Build tasks"               :nv "b" #'+eval/build
-     :desc "Jump to definition"        :n  "d" #'+lookup/definition
-     :desc "Jump to references"        :n  "D" #'+lookup/references
-     :desc "Open REPL"                 :n  "r" #'+eval/open-repl
-                                       :v  "r" #'+eval:repl)
-
-   (:desc "file" :prefix "f"
-     :desc "Find file"                  :n "." #'find-file
-     :desc "Sudo find file"             :n ">" #'doom/sudo-find-file
-     :desc "Find file in project"       :n "/" #'projectile-find-file
-     :desc "Find file from here"        :n "?" #'counsel-file-jump
-     :desc "Find other file"            :n "a" #'projectile-find-other-file
-     :desc "Open project editorconfig"  :n "c" #'editorconfig-find-current-editorconfig
-     :desc "Find file in dotfiles"      :n "d" #'+find-in-dotfiles
-     :desc "Find file in system config" :n "s" #'+find-in-system-config
-     :desc "Find file in home config"   :n "h" #'+find-in-home-config
-     :desc "Browse dotfiles"            :n "D" #'+hlissner/browse-dotfiles
-     :desc "Find file in emacs.d"       :n "e" #'+find-in-doomd
-     :desc "Browse emacs.d"             :n "E" #'+hlissner/browse-doomd
-     :desc "Recent files"               :n "r" #'recentf-open-files
-     :desc "Recent project files"       :n "R" #'projectile-recentf
-     :desc "Yank filename"              :n "y" #'+hlissner/yank-buffer-filename)
-
-   (:desc "git" :prefix "g"
-     :desc "Git status"            :n  "S" #'magit-status
-     :desc "Git blame"             :n  "b" #'magit-blame
-     :desc "Git time machine"      :n  "t" #'git-timemachine-toggle
-     :desc "Git stage hunk"        :n  "s" #'git-gutter:stage-hunk
-     :desc "Git revert hunk"       :n  "r" #'git-gutter:revert-hunk
-     :desc "Git revert buffer"     :n  "R" #'vc-revert
-     ;; :desc "List gists"            :n  "g" #'+gist:list
-     :desc "Git grep"              :n  "g" #'counsel-projectile-rg
-     :desc "Checkout Branch"       :n  "c" #'counsel-git-checkout
-     :desc "Next hunk"             :nv "]" #'git-gutter:next-hunk
-     :desc "Previous hunk"         :nv "[" #'git-gutter:previous-hunk
-
-     (:desc "smerge" :prefix "m"
-       :desc "Keep Current" :n "SPC" #'smerge-keep-current
-       :desc "Keep All"     :n "a" #'smerge-keep-all
-       :desc "Keep Upper"   :n "u" #'smerge-keep-upper
-       :desc "Keep Lower"   :n "l" #'smerge-keep-lower))
-
-   (:desc "help" :prefix "h"
-     :n "h" help-map
-     :desc "Apropos"               :n  "a" #'apropos
-     :desc "Reload theme"          :n  "R" #'doom//reload-theme
-     :desc "Find library"          :n  "l" #'find-library
-     :desc "Toggle Emacs log"      :n  "m" #'doom/popup-toggle-messages
-     :desc "Command log"           :n  "L" #'global-command-log-mode
-     :desc "Describe function"     :n  "f" #'describe-function
-     :desc "Describe key"          :n  "k" #'describe-key
-     :desc "Describe char"         :n  "c" #'describe-char
-     :desc "Describe mode"         :n  "M" #'describe-mode
-     :desc "Describe variable"     :n  "v" #'describe-variable
-     :desc "Describe face"         :n  "F" #'describe-face
-     :desc "Describe DOOM setting" :n  "s" #'doom/describe-setting
-     :desc "Describe DOOM module"  :n  "d" #'doom/describe-module
-     :desc "Find definition"       :n  "." #'+lookup/definition
-     :desc "Find references"       :n  "/" #'+lookup/references
-     :desc "Find documentation"    :n  "h" #'+lookup/documentation
-     :desc "What face"             :n  "'" #'doom/what-face
-     :desc "What minor modes"      :n  ";" #'doom/what-minor-mode
-     :desc "Info"                  :n  "i" #'info
-     :desc "Toggle profiler"       :n  "p" #'doom/toggle-profiler)
-
-   (:desc "insert" :prefix "i"
-     :desc "From kill-ring"        :nv "y" #'counsel-yank-pop
-     :desc "From snippet"          :nv "s" #'yas-insert-snippet)
-
-   (:desc "notes" :prefix "n"
-     :desc "Agenda"                 :n  "a" #'org-agenda
-     :desc "Find file in notes"     :n  "n" #'+find-in-notes
-     :desc "Store link"             :n  "l" #'org-store-link
-     :desc "Browse notes"           :n  "N" #'+hlissner/browse-notes
-     :desc "Org capture"            :n  "x" #'+org-capture/open
-     :desc "Create clubhouse story" :n  "c" #'org-tracker-create-issue
-     :desc "Archive subtree"        :n  "k" #'org-archive-subtree
-     :desc "Goto clocked-in note"   :n  "g" #'org-clock-goto
-     :desc "Clock Out"              :n  "o" #'org-clock-out)
-
-
-   (:desc "open" :prefix "o"
-     :desc "Default browser"       :n  "b" #'browse-url-of-file
-     :desc "Debugger"              :n  "d" #'+debug/open
-     :desc "Terminal in project"   :n  "T" #'+term/open-popup-in-project
-
-     :desc "Slack IM"              :n  "i" #'slack-im-select
-     :desc "Slack Channel"         :n  "c" #'slack-channel-select
-     :desc "Slack Group"           :n  "g" #'slack-group-select
-     :desc "Slack Unreads"         :n  "u" #'slack-select-unread-rooms
-     :desc "Slack Threads"         :n  "r" #'slack-all-threads
-
-     :desc "Email"                 :n "m" #'notmuch-jump-search
-
-     (:desc "ERC" :prefix "e"
-       :desc "Channel" :n "c" #'erc-switch-to-buffer)
-
-     ;; applications
-     :desc "APP: elfeed"           :n "E" #'=rss
-     :desc "APP: twitter"          :n "T" #'=twitter
-
-     (:desc "spotify" :prefix "s"
-       :desc "Search track"  :n "t" #'counsel-spotify-search-track
-       :desc "Search album"  :n "a" #'counsel-spotify-search-album
-       :desc "Search artist" :n "A" #'counsel-spotify-search-artist)
-
-     ;; macos
-     (:when IS-MAC
-       :desc "Reveal in Finder"          :n "o" #'+macos/reveal-in-finder
-       :desc "Reveal project in Finder"  :n "O" #'+macos/reveal-project-in-finder
-       :desc "Send to Transmit"          :n "u" #'+macos/send-to-transmit
-       :desc "Send project to Transmit"  :n "U" #'+macos/send-project-to-transmit
-       :desc "Send to Launchbar"         :n "l" #'+macos/send-to-launchbar
-       :desc "Send project to Launchbar" :n "L" #'+macos/send-project-to-launchbar))
-
-   (:desc "Email" :prefix "M"
-     :desc "Compose" :n "m" #'+notmuch/compose)
-
-   (:desc "project" :prefix "p"
-     :desc "Browse project"          :n  "." (find-file-in! (doom-project-root))
-     :desc "Find file in project"    :n  "/" #'projectile-find-file
-     :desc "Run cmd in project root" :nv "!" #'projectile-run-shell-command-in-root
-     :desc "Switch project"          :n  "p" #'projectile-switch-project
-     :desc "Recent project files"    :n  "r" #'projectile-recentf
-     :desc "List project tasks"      :n  "t" #'+ivy/tasks
-     :desc "Pop term in project"     :n  "o" #'+term/open-popup-in-project
-     :desc "Invalidate cache"        :n  "x" #'projectile-invalidate-cache)
-
-   (:desc "quit" :prefix "q"
-     :desc "Quit"                   :n "q" #'evil-save-and-quit
-     :desc "Quit (forget session)"  :n "Q" #'+workspace/kill-session-and-quit)
-
-   (:desc "remote" :prefix "r"
-     :desc "Upload local"           :n "u" #'+upload/local
-     :desc "Upload local (force)"   :n "U" (λ! (+upload/local t))
-     :desc "Download remote"        :n "d" #'+upload/remote-download
-     :desc "Diff local & remote"    :n "D" #'+upload/diff
-     :desc "Browse remote files"    :n "." #'+upload/browse
-     :desc "Detect remote changes"  :n ">" #'+upload/check-remote)
-
-   (:desc "snippets" :prefix "s"
-     :desc "New snippet"            :n  "n" #'yas-new-snippet
-     :desc "Insert snippet"         :nv "i" #'yas-insert-snippet
-     :desc "Find snippet for mode"  :n  "s" #'yas-visit-snippet-file
-     :desc "Find snippet"           :n  "S" #'+find-in-snippets)
-
-   (:desc "toggle" :prefix "t"
-     :desc "Flyspell"               :n "s" #'flyspell-mode
-     :desc "Flycheck"               :n "f" #'flycheck-mode
-     :desc "Line numbers"           :n "l" #'doom/toggle-line-numbers
-     :desc "Fullscreen"             :n "f" #'doom/toggle-fullscreen
-     :desc "Indent guides"          :n "i" #'highlight-indentation-mode
-     :desc "Indent guides (column)" :n "I" #'highlight-indentation-current-column-mode
-     :desc "Impatient mode"         :n "h" #'+impatient-mode/toggle
-     :desc "Big mode"               :n "b" #'doom-big-font-mode
-     :desc "Evil goggles"           :n "g" #'+evil-goggles/toggle))
-
-
- ;; --- vim-vinegar
- :n "-" #'grfn/dired-minus
- (:after dired-mode
-         (:map dired-mode-map
-        "-" #'grfn/dired-minus))
-
- (:map smartparens-mode-map
-   :n "g o" #'sp-raise-sexp)
-
- ;; --- vim-sexp-mappings-for-regular-people
- (:after paxedit
-   (:map paxedit-mode-map
-     :i ";"                          #'paxedit-insert-semicolon
-     :i "("                          #'paxedit-open-round
-     :i "["                          #'paxedit-open-bracket
-     :i "{"                          #'paxedit-open-curly
-     :n [remap evil-yank-line]       #'paxedit-copy
-     :n [remap evil-delete-line]     #'+grfn/paxedit-kill
-     :n "g o"                        #'paxedit-sexp-raise
-     :n [remap evil-join-whitespace] #'paxedit-compress
-     :n "g S"                        #'paxedit-format-1
-     :n "g k"                        #'paxedit-backward-up
-     :n "g j"                        #'paxedit-backward-end))
-
- ;; --- vim-splitjoin
- :n [remap evil-join-whitespace] #'+splitjoin/join
- :n "gS"                         #'+splitjoin/split
-
- ;; --- Personal vim-esque bindings ------------------
- :n  "zx" #'doom/kill-this-buffer
- :n  "ZX" #'bury-buffer
- :n  "]b" #'doom/next-buffer
- :n  "[b" #'doom/previous-buffer
- :n  "]w" #'+workspace/switch-right
- :n  "[w" #'+workspace/switch-left
- :m  "gt" #'+workspace/switch-right
- :m  "gT" #'+workspace/switch-left
- :m  "gd" #'+lookup/definition
- :m  "gD" #'+lookup/references
- :m  "K" #'+lookup/documentation
- :n  "gp" #'+evil/reselect-paste
- :n  "gr" #'+eval:region
- :n  "gR" #'+eval/buffer
- :v  "gR" #'+eval:replace-region
- :v  "@"  #'+evil:macro-on-all-lines
- :n  "g@" #'+evil:macro-on-all-lines
- ;; repeat in visual mode (FIXME buggy)
- :v  "."  #'evil-repeat
- ;; don't leave visual mode after shifting
- ;; :v  "<"  #'+evil/visual-dedent  ; vnoremap < <gv
- ;; :v  ">"  #'+evil/visual-indent  ; vnoremap > >gv
- ;; paste from recent yank register (which isn't overwritten)
- :v  "C-p" "\"0p"
-
- (:map evil-window-map ; prefix "C-w"
-   ;; Navigation
-   "C-h"     #'evil-window-left
-   "C-j"     #'evil-window-down
-   "C-k"     #'evil-window-up
-   "C-l"     #'evil-window-right
-   "C-w"     #'ace-window
-   ;; Swapping windows
-   "H"       #'+evil/window-move-left
-   "J"       #'+evil/window-move-down
-   "K"       #'+evil/window-move-up
-   "L"       #'+evil/window-move-right
-   "C-S-w"   #'ace-swap-window
-   ;; Window undo/redo
-   "u"       #'winner-undo
-   "C-u"     #'winner-undo
-   "C-r"     #'winner-redo
-   "o"       #'doom/window-enlargen
-   ;; Delete window
-   "c"       #'+workspace/close-window-or-workspace
-   "C-C"     #'ace-delete-window
-   ;; Popups
-   "p"       #'doom/popup-toggle
-   "m"       #'doom/popup-toggle-messages
-   "P"       #'doom/popup-close-all)
-
-
- ;; --- Plugin bindings ------------------------------
- ;; auto-yasnippet
- :i  [C-tab] #'aya-expand
- :nv [C-tab] #'aya-create
-
- ;; company-mode (vim-like omnicompletion)
- :i "C-SPC"  #'+company/complete
- (:prefix "C-x"
-   :i "C-l"   #'+company/whole-lines
-   :i "C-k"   #'+company/dict-or-keywords
-   :i "C-f"   #'company-files
-   :i "C-]"   #'company-etags
-   :i "s"     #'company-ispell
-   :i "C-s"   #'company-yasnippet
-   :i "C-o"   #'company-capf
-   :i "C-n"   #'company-dabbrev-code
-   :i "C-p"   #'+company/dabbrev-code-previous)
- (:after company
-   (:map company-active-map
-     ;; Don't interfere with `evil-delete-backward-word' in insert mode
-     "C-w"        nil
-     "C-o"        #'company-search-kill-others
-     "C-n"        #'company-select-next
-     "C-p"        #'company-select-previous
-     "C-h"        #'company-quickhelp-manual-begin
-     "C-S-h"      #'company-show-doc-buffer
-     "C-S-s"      #'company-search-candidates
-     "C-s"        #'company-filter-candidates
-     "C-SPC"      #'company-complete-common
-     "C-h"        #'company-quickhelp-manual-begin
-     [tab]        #'company-complete-common-or-cycle
-     [backtab]    #'company-select-previous
-     [escape]     (λ! (company-abort) (evil-normal-state 1)))
-   ;; Automatically applies to `company-filter-map'
-   (:map company-search-map
-     "C-n"        #'company-search-repeat-forward
-     "C-p"        #'company-search-repeat-backward
-     "C-s"        (λ! (company-search-abort) (company-filter-candidates))
-     [escape]     #'company-search-abort))
-
- ;; counsel
-;  (:after counsel
-;    (:map counsel-ag-map
-;      [backtab]  #'+ivy/wgrep-occur      ; search/replace on results
-;      "C-SPC"    #'ivy-call-and-recenter ; preview))
-
- ;; evil-commentary
- ;; :n  "gc"  #'evil-commentary
-
- ;; evil-exchange
- :n  "gx"  #'evil-exchange
-
- ;; evil-magit
- (:after evil-magit
-   :map (magit-status-mode-map magit-revision-mode-map)
-   :n "C-j" nil
-   :n "C-k" nil)
-
- ;; Smerge
- :n "]n" #'smerge-next
- :n "[n" #'smerge-prev
-
- ;; evil-mc
- (:prefix "gz"
-   :nv "m" #'evil-mc-make-all-cursors
-   :nv "u" #'evil-mc-undo-all-cursors
-   :nv "z" #'+evil/mc-make-cursor-here
-   :nv "t" #'+evil/mc-toggle-cursors
-   :nv "n" #'evil-mc-make-and-goto-next-cursor
-   :nv "p" #'evil-mc-make-and-goto-prev-cursor
-   :nv "N" #'evil-mc-make-and-goto-last-cursor
-   :nv "P" #'evil-mc-make-and-goto-first-cursor
-   :nv "d" #'evil-mc-make-and-goto-next-match
-   :nv "D" #'evil-mc-make-and-goto-prev-match)
- (:after evil-mc
-   :map evil-mc-key-map
-   :nv "C-n" #'evil-mc-make-and-goto-next-cursor
-   :nv "C-N" #'evil-mc-make-and-goto-last-cursor
-   :nv "C-p" #'evil-mc-make-and-goto-prev-cursor
-   :nv "C-P" #'evil-mc-make-and-goto-first-cursor)
-
- ;; evil-multiedit
- :v  "R"     #'evil-multiedit-match-all
- :n  "M-d"   #'evil-multiedit-match-symbol-and-next
- :n  "M-D"   #'evil-multiedit-match-symbol-and-prev
- :v  "M-d"   #'evil-multiedit-match-and-next
- :v  "M-D"   #'evil-multiedit-match-and-prev
- :nv "C-M-d" #'evil-multiedit-restore
- (:after evil-multiedit
-   (:map evil-multiedit-state-map
-     "M-d" #'evil-multiedit-match-and-next
-     "M-D" #'evil-multiedit-match-and-prev
-     "RET" #'evil-multiedit-toggle-or-restrict-region)
-   (:map (evil-multiedit-state-map evil-multiedit-insert-state-map)
-     "C-n" #'evil-multiedit-next
-     "C-p" #'evil-multiedit-prev))
-
- ;; evil-snipe
- (:after evil-snipe
-   ;; Binding to switch to evil-easymotion/avy after a snipe
-   :map evil-snipe-parent-transient-map
-   "C-;" (λ! (require 'evil-easymotion)
-             (call-interactively
-              (evilem-create #'evil-snipe-repeat
-                             :bind ((evil-snipe-scope 'whole-buffer)
-                                    (evil-snipe-enable-highlight)
-                                    (evil-snipe-enable-incremental-highlight))))))
-
- ;; evil-surround
- :v  "S"  #'evil-surround-region
- :o  "s"  #'evil-surround-edit
- :o  "S"  #'evil-Surround-edit
-
- ;; expand-region
- :v  "v"  #'er/expand-region
- :v  "V"  #'er/contract-region
-
- ;; flycheck
- :m  "]e" #'flycheck-next-error
- :m  "[e" #'flycheck-previous-error
- (:after flycheck
-   :map flycheck-error-list-mode-map
-   :n "C-n" #'flycheck-error-list-next-error
-   :n "C-p" #'flycheck-error-list-previous-error
-   :n "j"   #'flycheck-error-list-next-error
-   :n "k"   #'flycheck-error-list-previous-error
-   :n "RET" #'flycheck-error-list-goto-error)
-
- ;; flyspell
- :m  "]S" #'flyspell-correct-word-generic
- :m  "[S" #'flyspell-correct-previous-word-generic
-
- ;; git-gutter
- :m  "]d" #'git-gutter:next-hunk
- :m  "[d" #'git-gutter:previous-hunk
-
- ;; git-timemachine
- (:after git-timemachine
-   (:map git-timemachine-mode-map
-     :n "C-p" #'git-timemachine-show-previous-revision
-     :n "C-n" #'git-timemachine-show-next-revision
-     :n "[["  #'git-timemachine-show-previous-revision
-     :n "]]"  #'git-timemachine-show-next-revision
-     :n "q"   #'git-timemachine-quit
-     :n "gb"  #'git-timemachine-blame))
-
- ;; gist
- (:after gist
-   :map gist-list-menu-mode-map
-   :n "RET" #'+gist/open-current
-   :n "b"   #'gist-browse-current-url
-   :n "c"   #'gist-add-buffer
-   :n "d"   #'gist-kill-current
-   :n "f"   #'gist-fork
-   :n "q"   #'quit-window
-   :n "r"   #'gist-list-reload
-   :n "s"   #'gist-star
-   :n "S"   #'gist-unstar
-   :n "y"   #'gist-print-current-url)
-
- ;; helm
- (:after helm
-   (:map helm-map
-     "ESC"        nil
-     "C-S-n"      #'helm-next-source
-     "C-S-p"      #'helm-previous-source
-     "C-u"        #'helm-delete-minibuffer-contents
-     "C-w"        #'backward-kill-word
-     "C-r"        #'evil-paste-from-register ; Evil registers in helm! Glorious!
-     "C-b"        #'backward-word
-     [left]       #'backward-char
-     [right]      #'forward-char
-     [escape]     #'helm-keyboard-quit
-     [tab]        #'helm-execute-persistent-action)
-
-   (:after helm-files
-     (:map helm-generic-files-map
-       :e "ESC"     #'helm-keyboard-quit)
-     (:map helm-find-files-map
-       "C-w" #'helm-find-files-up-one-level
-       "TAB" #'helm-execute-persistent-action))
-
-   (:after helm-ag
-     (:map helm-ag-map
-       "<backtab>"  #'helm-ag-edit)))
-
- ;; hl-todo
- :m  "]t" #'hl-todo-next
- :m  "[t" #'hl-todo-previous
-
- ;; ivy
- (:after ivy
-   :map ivy-minibuffer-map
-   [escape] #'keyboard-escape-quit
-   "C-SPC" #'ivy-call-and-recenter
-   "TAB" #'ivy-partial
-   "M-v" #'yank
-   "M-z" #'undo
-   "C-r" #'evil-paste-from-register
-   "C-k" #'ivy-previous-line
-   "C-j" #'ivy-next-line
-   "C-l" #'ivy-alt-done
-   "C-w" #'ivy-backward-kill-word
-   "C-u" #'ivy-kill-line
-   "C-b" #'backward-word
-   "C-f" #'forward-word)
-
- ;; neotree
- (:after neotree
-   :map neotree-mode-map
-   :n "g"         nil
-   :n [tab]       #'neotree-quick-look
-   :n "RET"       #'neotree-enter
-   :n [backspace] #'evil-window-prev
-   :n "c"         #'neotree-create-node
-   :n "r"         #'neotree-rename-node
-   :n "d"         #'neotree-delete-node
-   :n "j"         #'neotree-next-line
-   :n "k"         #'neotree-previous-line
-   :n "n"         #'neotree-next-line
-   :n "p"         #'neotree-previous-line
-   :n "h"         #'+neotree/collapse-or-up
-   :n "l"         #'+neotree/expand-or-open
-   :n "J"         #'neotree-select-next-sibling-node
-   :n "K"         #'neotree-select-previous-sibling-node
-   :n "H"         #'neotree-select-up-node
-   :n "L"         #'neotree-select-down-node
-   :n "G"         #'evil-goto-line
-   :n "gg"        #'evil-goto-first-line
-   :n "v"         #'neotree-enter-vertical-split
-   :n "s"         #'neotree-enter-horizontal-split
-   :n "q"         #'neotree-hide
-   :n "R"         #'neotree-refresh)
-
- ;; realgud
- (:after realgud
-   :map realgud:shortkey-mode-map
-   :n "j" #'evil-next-line
-   :n "k" #'evil-previous-line
-   :n "h" #'evil-backward-char
-   :n "l" #'evil-forward-char
-   :m "n" #'realgud:cmd-next
-   :m "b" #'realgud:cmd-break
-   :m "B" #'realgud:cmd-clear
-   :n "c" #'realgud:cmd-continue)
-
- ;; rotate-text
- :n  "gs"  #'rotate-text
-
- ;; smart-forward
- :m  "g]" #'smart-forward
- :m  "g[" #'smart-backward
-
- ;; undo-tree -- undo/redo for visual regions
- :v "C-u" #'undo-tree-undo
- :v "C-r" #'undo-tree-redo
-
- ;; yasnippet
- (:after yasnippet
-   (:map yas-keymap
-     "C-e"           #'+snippets/goto-end-of-field
-     "C-a"           #'+snippets/goto-start-of-field
-     "<M-right>"     #'+snippets/goto-end-of-field
-     "<M-left>"      #'+snippets/goto-start-of-field
-     "<M-backspace>" #'+snippets/delete-to-start-of-field
-     [escape]        #'evil-normal-state
-     [backspace]     #'+snippets/delete-backward-char
-     [delete]        #'+snippets/delete-forward-char-or-field)
-   (:map yas-minor-mode-map
-     :i "<tab>" yas-maybe-expand
-     :v "<tab>" #'+snippets/expand-on-region))
-
-
- ;; --- Major mode bindings --------------------------
-
- ;; Markdown
- (:after markdown-mode
-   (:map markdown-mode-map
-     ;; fix conflicts with private bindings
-     "<backspace>" nil
-     "<M-left>"    nil
-     "<M-right>"   nil))
-
- ;; Rust
- (:after rust
-   (:map rust-mode-map
-     "g RET" #'cargo-process-test))
-
- ;; Elixir
- (:after alchemist
-   (:map elixir-mode-map
-     :n "K"     #'alchemist-help-search-at-point
-     :n "g RET" #'alchemist-project-run-tests-for-current-file
-     :n "g \\"  #'alchemist-mix-test-at-point
-     :n "g SPC" #'alchemist-mix-compile))
-
- ;; Haskell
- (:after haskell-mode
-   (:map haskell-mode-map
-     ;; :n "K"     #'intero-info
-     :n "K"     #'lsp-describe-thing-at-point
-     ;; :n "g d"   #'lsp-ui-peek-find-definitions
-     :n "g d"   #'lsp-ui-peek-find-definitions
-     :n "g R"   #'lsp-find-references
-     ;; :n "g SPC" #'intero-repl-load
-     ;; :n "g y"   #'lsp-ui-
-     ))
-
- ;; Javascript
- ;; (:after rjsx-mode
- ;;   (:map rjsx-mode-map
- ;;     :n "g d" #'flow-minor-jump-to-definition
- ;;     :n "K"   #'flow-minor-type-at-pos))
-
- (:after js2-mode
-   (:map js2-mode-map
-     :n "g d" #'flow-minor-jump-to-definition
-     :n "K"   #'flow-minor-type-at-pos))
-
- ;; Elisp
- (:map emacs-lisp-mode-map
-   :n "g SPC" #'eval-buffer
-   :n "g RET" (λ! () (ert t)))
-
-
- ;; --- Custom evil text-objects ---------------------
- :textobj "a" #'evil-inner-arg                    #'evil-outer-arg
- :textobj "B" #'evil-textobj-anyblock-inner-block #'evil-textobj-anyblock-a-block
- :textobj "i" #'evil-indent-plus-i-indent         #'evil-indent-plus-a-indent
- :textobj "I" #'evil-indent-plus-i-indent-up      #'evil-indent-plus-a-indent-up
- :textobj "J" #'evil-indent-plus-i-indent-up-down #'evil-indent-plus-a-indent-up-down
-
-
- ;; --- Built-in plugins -----------------------------
- (:after comint
-   ;; TAB auto-completion in term buffers
-   :map comint-mode-map [tab] #'company-complete)
-
- (:after debug
-   ;; For elisp debugging
-   :map debugger-mode-map
-   :n "RET" #'debug-help-follow
-   :n "e"   #'debugger-eval-expression
-   :n "n"   #'debugger-step-through
-   :n "c"   #'debugger-continue)
-
- (:map help-mode-map
-   :n "[["  #'help-go-back
-   :n "]]"  #'help-go-forward
-   :n "o"   #'ace-link-help
-   :n "q"   #'quit-window
-   :n "Q"   #'+ivy-quit-and-resume)
-
- (:after vc-annotate
-   :map vc-annotate-mode-map
-   :n "q"   #'kill-this-buffer
-   :n "d"   #'vc-annotate-show-diff-revision-at-line
-   :n "D"   #'vc-annotate-show-changeset-diff-revision-at-line
-   :n "SPC" #'vc-annotate-show-log-revision-at-line
-   :n "]]"  #'vc-annotate-next-revision
-   :n "[["  #'vc-annotate-prev-revision
-   :n "TAB" #'vc-annotate-toggle-annotation-visibility
-   :n "RET" #'vc-annotate-find-revision-at-line))
-
-;; evil-easymotion
-(after! evil-easymotion
-  (let ((prefix (concat doom-leader-key " /")))
-    ;; NOTE `evilem-default-keybinds' unsets all other keys on the prefix (in
-    ;; motion state)
-    (evilem-default-keybindings prefix)
-    (evilem-define (kbd (concat prefix " n")) #'evil-ex-search-next)
-    (evilem-define (kbd (concat prefix " N")) #'evil-ex-search-previous)
-    (evilem-define (kbd (concat prefix " s")) #'evil-snipe-repeat
-                   :pre-hook (save-excursion (call-interactively #'evil-snipe-s))
-                   :bind ((evil-snipe-scope 'buffer)
-                          (evil-snipe-enable-highlight)
-                          (evil-snipe-enable-incremental-highlight)))
-    (evilem-define (kbd (concat prefix " S")) #'evil-snipe-repeat-reverse
-                   :pre-hook (save-excursion (call-interactively #'evil-snipe-s))
-                   :bind ((evil-snipe-scope 'buffer)
-                          (evil-snipe-enable-highlight)
-                          (evil-snipe-enable-incremental-highlight)))))
-
-
-;;
-;; Keybinding fixes
-;;
-
-;; This section is dedicated to "fixing" certain keys so that they behave
-;; properly, more like vim, or how I like it.
-
-(map! (:map input-decode-map
-        [S-iso-lefttab] [backtab]
-        (:unless window-system "TAB" [tab])) ; Fix TAB in terminal
-
-      ;; I want C-a and C-e to be a little smarter. C-a will jump to
-      ;; indentation. Pressing it again will send you to the true bol. Same goes
-      ;; for C-e, except it will ignore comments and trailing whitespace before
-      ;; jumping to eol.
-      :i "C-a" #'doom/backward-to-bol-or-indent
-      :i "C-e" #'doom/forward-to-last-non-comment-or-eol
-      :i "C-u" #'doom/backward-kill-to-bol-and-indent
-
-      ;; Emacsien motions for insert mode
-      :i "C-b" #'backward-word
-      :i "C-f" #'forward-word
-
-      ;; Highjacks space/backspace to:
-      ;;   a) balance spaces inside brackets/parentheses ( | ) -> (|)
-      ;;   b) delete space-indented blocks intelligently
-      ;;   c) do none of this when inside a string
-      ;; :i "SPC"                          #'doom/inflate-space-maybe
-      ;; :i [remap delete-backward-char]   #'doom/deflate-space-maybe
-      ;; :i [remap newline]                #'doom/newline-and-indent
-
-      (:map org-mode-map
-       :i [remap doom/inflate-space-maybe] #'org-self-insert-command
-       "C-c C-x C-i" #'org-clock-in
-       "C-c C-x <C-i>" #'org-clock-in)
-
-      (:map org-agenda-mode-map
-       "C-c C-x C-i" #'org-agenda-clock-in
-       "C-c C-x <C-i>" #'org-agenda-clock-in)
-
-      ;; Restore common editing keys (and ESC) in minibuffer
-      (:map (minibuffer-local-map
-             minibuffer-local-ns-map
-             minibuffer-local-completion-map
-             minibuffer-local-must-match-map
-             minibuffer-local-isearch-map
-             evil-ex-completion-map
-             evil-ex-search-keymap
-             read-expression-map)
-        ;; [escape] #'abort-recursive-edit
-        "C-r" #'evil-paste-from-register
-        "C-a" #'move-beginning-of-line
-        "C-w" #'doom/minibuffer-kill-word
-        "C-u" #'doom/minibuffer-kill-line
-        "C-b" #'backward-word
-        "C-f" #'forward-word
-        "M-z" #'doom/minibuffer-undo)
-
-      (:map messages-buffer-mode-map
-        "M-;" #'eval-expression
-        "A-;" #'eval-expression)
-
-      (:map tabulated-list-mode-map
-        [remap evil-record-macro] #'doom/popup-close-maybe)
-
-      (:after view
-        (:map view-mode-map "<escape>" #'View-quit-all)))
-
-(defun +sexp-transpose ()
-  (interactive)
-  (case evil-this-operator
-    ('evil-shift-right (paxedit-transpose-forward))
-    ('evil-shift-left  (paxedit-transpose-backward))))
-
-;; (defun nmap (&rest keys-and-ops)
-;;   (->>
-;;    (seq-partition keys-and-ops 2)
-;;    (seq-map
-;;     (lambda (k-op)
-;;       (let* ((k (car k-op))
-;;              (op (cadr k-op))
-;;              (prefix (substring k 0 1))
-;;              (prefix-sym (lookup-key evil-normal-state-map prefix))
-;;              (keyseq (substring k 1)))
-;;         (list keyseq prefix-sym op))))
-;;    (seq-group-by #'car)
-;;    (seq-map
-;;     (lambda (k-ops)
-;;       (let* ((keyseq           (car k-ops))
-;;              (ops              (cdr k-ops))
-;;              (existing-binding (lookup-key evil-operator-state-map keyseq))
-;;              (handler (λ! ()
-;;                           (if-let
-;;                               ((oplist
-;;                                 (seq-find (lambda (op)
-;;                                             (equal (nth 1 op)
-;;                                                    evil-this-operator))
-;;                                           ops)))
-;;                               (message "calling oplist")
-;;                               (->> oplist (nth 2) funcall)
-;;                             (when existing-binding
-;;                               (funcall existing-binding))))))
-;;         (if existing-binding
-;;             (progn
-;;               (define-key evil-operator-state-map
-;;                 (vector 'remap existing-binding)
-;;                 handler)
-;;               (define-key evil-motion-state-map
-;;                 (vector 'remap existing-binding)
-;;                 handler))
-;;           (define-key evil-operator-state-map keyseq handler)))))))
-
-;; (nmap
-;;  ">e" #'paxedit-transpose-forward
-;;  "<e" #'paxedit-transpose-backward)
-
-(require 'paxedit)
-(require 'general)
-(general-evil-setup t)
-
-(nmap
-  ">" (general-key-dispatch 'evil-shift-right
-        "e" 'paxedit-transpose-forward
-        ")" 'sp-forward-slurp-sexp
-        "(" 'sp-backward-barf-sexp
-        "I" 'grfn/insert-at-sexp-end
-        ;; "a" 'grfn/insert-at-form-end
-        ))
-
-(nmap
-  "<" (general-key-dispatch 'evil-shift-left
-        "e" 'paxedit-transpose-backward
-        ")" 'sp-forward-barf-sexp
-        "(" 'sp-backward-slurp-sexp
-        "I" 'grfn/insert-at-sexp-start
-        ;; "a" 'grfn/insert-at-form-start
-        ))
-
-
-(defmacro saving-excursion (&rest body)
-  `(λ! () (save-excursion ,@body)))
-
-(nmap "c" (general-key-dispatch 'evil-change
-            "r c" (saving-excursion (string-inflection-lower-camelcase))
-            "r C" (saving-excursion (string-inflection-camelcase))
-            "r m" (saving-excursion (string-inflection-camelcase))
-            "r s" (saving-excursion (string-inflection-underscore))
-            "r u" (saving-excursion (string-inflection-upcase))
-            "r -" (saving-excursion (string-inflection-kebab-case))
-            "r k" (saving-excursion (string-inflection-kebab-case))
-            ;; "r ." (saving-excursion (string-inflection-dot-case))
-            ;; "r ." (saving-excursion (string-inflection-space-case))
-            ;; "r ." (saving-excursion (string-inflection-title-case))
-            ))
-
-
-(predd-defmulti eval-sexp (lambda (form) major-mode))
-
-(predd-defmethod eval-sexp 'clojure-mode (form)
-  (cider-interactive-eval form))
-
-(predd-defmethod eval-sexp 'emacs-lisp-mode (form)
-  (pp-eval-expression form))
-
-(predd-defmulti eval-sexp-region (lambda (_beg _end) major-mode))
-
-(predd-defmethod eval-sexp-region 'clojure-mode (beg end)
-  (cider-interactive-eval nil nil (list beg end)))
-
-(predd-defmethod eval-sexp-region 'emacs-lisp-mode (beg end)
-  (pp-eval-expression (read (buffer-substring beg end))))
-
-(predd-defmulti eval-sexp-region-context (lambda (_beg _end _context) major-mode))
-
-(predd-defmethod eval-sexp-region-context 'clojure-mode (beg end context)
-  (cider--eval-in-context (buffer-substring beg end)))
-
-(defun pp-eval-context-region (beg end context)
-  (interactive "r\nxContext: ")
-  (let* ((inner-expr (read (buffer-substring beg end)))
-         (full-expr (list 'let* context inner-expr)))
-    (pp-eval-expression full-expr)))
-
-(predd-defmethod eval-sexp-region-context 'emacs-lisp-mode (beg end context)
-  (pp-eval-context-region beg end context))
-
-(predd-defmulti preceding-sexp (lambda () major-mode))
-
-(predd-defmethod preceding-sexp 'clojure-mode ()
-  (cider-last-sexp))
-
-(predd-defmethod preceding-sexp 'emacs-lisp-mode ()
-  (elisp--preceding-sexp))
-
-(defun eval-sexp-at-point ()
-  (interactive)
-  (let ((bounds (bounds-of-thing-at-point 'sexp)))
-    (eval-sexp-region (car bounds)
-                      (cdr bounds))))
-
-(defun eval-last-sexp (_)
-  (interactive)
-  (eval-sexp (preceding-sexp)))
-
-;;;
-
-(defun cider-insert-current-sexp-in-repl (&optional arg)
-  "Insert the expression at point in the REPL buffer.
-If invoked with a prefix ARG eval the expression after inserting it"
-  (interactive "P")
-  (cider-insert-in-repl (cider-sexp-at-point) arg))
-
-(evil-define-operator fireplace-send (beg end)
-  (cider-insert-current-sexp-in-repl nil nil (list beg end)))
-
-(defun +clojure-pprint-expr (form)
-  (format "(with-out-str (clojure.pprint/pprint %s))"
-          form))
-
-(defun cider-eval-read-and-print-handler (&optional buffer)
-  "Make a handler for evaluating and reading then printing result in BUFFER."
-  (nrepl-make-response-handler
-   (or buffer (current-buffer))
-   (lambda (buffer value)
-     (let ((value* (read value)))
-       (with-current-buffer buffer
-         (insert
-          (if (derived-mode-p 'cider-clojure-interaction-mode)
-              (format "\n%s\n" value*)
-            value*)))))
-   (lambda (_buffer out) (cider-emit-interactive-eval-output out))
-   (lambda (_buffer err) (cider-emit-interactive-eval-err-output err))
-   '()))
-
-(defun cider-eval-and-replace (beg end)
-  "Evaluate the expression in region and replace it with its result"
-  (interactive "r")
-  (let ((form (buffer-substring beg end)))
-    (cider-nrepl-sync-request:eval form)
-    (kill-region beg end)
-    (cider-interactive-eval
-     (+clojure-pprint-expr form)
-     (cider-eval-read-and-print-handler))))
-
-(defun cider-eval-current-sexp-and-replace ()
-  "Evaluate the expression at point and replace it with its result"
-  (interactive)
-  (apply #'cider-eval-and-replace (cider-sexp-at-point 'bounds)))
-
-;;;
-
-(evil-define-operator fireplace-eval (beg end)
-  (eval-sexp-region beg end))
-
-(evil-define-operator fireplace-replace (beg end)
-  (cider-eval-and-replace beg end))
-
-(evil-define-operator fireplace-eval-context (beg end)
-  (eval-sexp-region-context beg end))
-
-;;; fireplace-esque eval binding
-(nmap :keymaps 'cider-mode-map
-  "c" (general-key-dispatch 'evil-change
-        "p" (general-key-dispatch 'fireplace-eval
-              "p" 'cider-eval-sexp-at-point
-              "c" 'cider-eval-last-sexp
-              "d" 'cider-eval-defun-at-point
-              "r" 'cider-test-run-test)
-        "q" (general-key-dispatch 'fireplace-send
-              "q" 'cider-insert-current-sexp-in-repl
-              "c" 'cider-insert-last-sexp-in-repl)
-        "x" (general-key-dispatch 'fireplace-eval-context
-              "x" 'cider-eval-sexp-at-point-in-context
-              "c" 'cider-eval-last-sexp-in-context)
-        "!" (general-key-dispatch 'fireplace-replace
-              "!" 'cider-eval-current-sexp-and-replace
-              "c" 'cider-eval-last-sexp-and-replace)
-        "y" 'cider-copy-last-result))
-
-;;;
-
-(nmap :keymaps 'emacs-lisp-mode-map
-  "c" (general-key-dispatch 'evil-change
-        "p" (general-key-dispatch 'fireplace-eval
-              "p" 'eval-sexp-at-point
-              "c" 'eval-last-sexp
-              "d" 'eval-defun
-              "r" 'cider-test-run-test)
-        "x" (general-key-dispatch 'fireplace-eval-context
-              "x" 'cider-eval-sexp-at-point-in-context
-              "c" 'cider-eval-last-sexp-in-context)
-        "!" (general-key-dispatch 'fireplace-replace
-              "!" 'cider-eval-current-sexp-and-replace
-              "c" 'cider-eval-last-sexp-and-replace)
-        "y" 'cider-copy-last-result))
-
-(nmap :keymaps 'sly-mode-map
-  "c" (general-key-dispatch 'evil-change
-        "p" (general-key-dispatch 'sly-eval
-              ;; "p" 'eval-sexp-at-point
-              "c" 'sly-eval-last-expression
-              "d" 'sly-eval-defun
-              ;; "r" 'cider-test-run-test
-              )
-        ;; "x" (general-key-dispatch 'fireplace-eval-context
-        ;;       "x" 'cider-eval-sexp-at-point-in-context
-        ;;       "c" 'cider-eval-last-sexp-in-context
-        ;;       )
-        ;; "!" (general-key-dispatch 'fireplace-replace
-        ;;       "!" 'cider-eval-current-sexp-and-replace
-        ;;       "c" 'cider-eval-last-sexp-and-replace)
-        ;; "y" 'cider-copy-last-result
-        ))
-
-
-;; >) ; slurp forward
-;; <) ; barf forward
-;; <( ; slurp backward
-;; >( ; slurp backward
-
-;; (require 'doom-themes)
-(defun grfn/haskell-test-file-p ()
-  (string-match-p (rx (and "Spec.hs" eol))
-                  (buffer-file-name)))
-
-(require 'haskell)
-
-(defun grfn/intero-run-main ()
-  (interactive)
-  (intero-repl-load)
-  (intero-with-repl-buffer nil
-    (comint-simple-send
-     (get-buffer-process (current-buffer))
-     "main")))
-
-(defun grfn/run-clj-or-cljs-test ()
-  (interactive)
-  (message "Running tests...")
-  (cl-case (cider-repl-type-for-buffer)
-    ('cljs
-     (cider-interactive-eval
-      "(with-out-str (cljs.test/run-tests))"
-      (nrepl-make-response-handler
-       (current-buffer)
-       (lambda (_ value)
-         (with-output-to-temp-buffer "*cljs-test-results*"
-           (print
-            (->> value
-                 (s-replace "\"" "")
-                 (s-replace "\\n" "\n")))))
-       nil nil nil)))
-    (('clj 'multi)
-     (funcall-interactively
-      #'cider-test-run-ns-tests
-      nil))))
-
-(defun cider-copy-last-result ()
-  (interactive)
-  (cider-interactive-eval
-   "*1"
-   (nrepl-make-response-handler
-    (current-buffer)
-    (lambda (_ value)
-      (kill-new value)
-      (message "Copied last result (%s) to clipboard"
-               (if (= (length value) 1) "1 char"
-                 (format "%d chars" (length value)))))
-    nil nil nil)))
-
-
-(defun grfn/insert-new-src-block ()
-  (interactive)
-  (let* ((current-src-block (org-element-at-point))
-         (src-block-head (save-excursion
-                           (goto-char (org-element-property
-                                       :begin current-src-block))
-                           (let ((line (thing-at-point 'line t)))
-                             (if (not (s-starts-with? "#+NAME:" (s-trim line)))
-                                 line
-                               (forward-line)
-                               (thing-at-point 'line t)))))
-         (point-to-insert
-          (if-let (results-loc (org-babel-where-is-src-block-result))
-              (save-excursion
-                (goto-char results-loc)
-                (org-element-property
-                 :end
-                 (org-element-at-point)))
-            (org-element-property :end (org-element-at-point)))))
-    (goto-char point-to-insert)
-    (insert "\n")
-    (insert src-block-head)
-    (let ((contents (point-marker)))
-      (insert "\n#+END_SRC\n")
-      (goto-char contents))))
-
-(defun grfn/+org-insert-item (orig direction)
-  (interactive)
-  (if (and (org-in-src-block-p)
-           (equal direction 'below))
-    (grfn/insert-new-src-block)
-    (funcall orig direction)))
-
-(advice-add #'+org--insert-item :around #'grfn/+org-insert-item)
-;; (advice-add #'+org/insert-item-below :around
-;;             (lambda (orig) (grfn/+org-insert-item orig 'below)))
-
-(defun set-pdb-trace ()
-  (interactive)
-  (end-of-line)
-  (insert (format "\n%simport pdb;pdb.set_trace()"
-                  (make-string (python-indent-calculate-indentation)
-                               ?\s)))
-  (evil-indent (line-beginning-position)
-               (line-end-position)))
-
-(map!
-
- (:map magit-mode-map
-   :n "#" 'forge-dispatch)
-
- (:map haskell-mode-map
-   :n "K"     'lsp-info-under-point
-   :n "g d"   'lsp-ui-peek-find-definitions
-   :n "g r"   'lsp-ui-peek-find-references
-   :n "g \\"  '+haskell/repl
-   ;; :n "K"     'intero-info
-   ;; :n "g d"   'intero-goto-definition
-   ;; :n "g SPC" 'intero-repl-load
-   ;; :n "g \\"  'intero-repl
-   ;; :n "g y"   'intero-type-at
-   ;; :n "g RET" 'grfn/run-sputnik-test-for-file
-
-   (:localleader
-     :desc "Apply action"  :n "e" 'intero-repl-eval-region
-     :desc "Rename symbol" :n "r" 'intero-apply-suggestions))
-
- (:map python-mode-map
-   :n "K" #'anaconda-mode-show-doc
-   :n "g SPC" #'+eval/buffer
-   :n "g RET" #'python-pytest-file
-   :n "g \\" #'+python/open-ipython-repl
-   [remap evil-commentary-yank] #'set-pdb-trace)
-
- (:after agda2-mode
-   (:map agda2-mode-map
-     :n "g SPC" 'agda2-load
-     :n "g d"   'agda2-goto-definition-keyboard
-     :n "] g"   'agda2-next-goal
-     :n "[ g"   'agda2-previous-goal
-
-     (:localleader
-       :desc "Give"                               :n "SPC" 'agda2-give
-       :desc "Case Split"                         :n "c"   'agda2-make-case
-       :desc "Make Helper"                        :n "h"   'agda2-helper-function-type
-       :desc "Refine"                             :n "r"   'agda2-refine
-       :desc "Auto"                               :n "a"   'agda2-auto-maybe-all
-       :desc "Goal type and context"              :n "t"   'agda2-goal-and-context
-       :desc "Goal type and context and inferred" :n ";"   'agda2-goal-and-context-and-inferred)))
-
- (:after clojure-mode
-   (:map clojure-mode-map
-     :n "] f" 'forward-sexp
-     :n "[ f" 'backward-sexp))
-
- (:after cider-mode
-   (:map cider-mode-map
-     :n "g SPC" 'cider-eval-buffer
-     :n "g \\"  'cider-switch-to-repl-buffer
-     :n "K"     'cider-doc
-     :n "g K"   'cider-apropos
-     :n "g d"   'cider-find-dwim
-     :n "C-w ]" 'cider-find-dwim-other-window
-     ;; :n "g RET" 'cider-test-run-ns-tests
-     :n "g RET" 'grfn/run-clj-or-cljs-test
-     :n "g r" #'cljr-rename-symbol
-
-     "C-c C-r r" 'cljr-add-require-to-ns
-     "C-c C-r i" 'cljr-add-import-to-ns
-
-     (:localleader
-       ;; :desc "Inspect last result" :n "i" 'cider-inspect-last-result
-       ;; :desc "Search for documentation" :n "h s" 'cider-apropos-doc
-       :desc "Add require to ns" :n "n r" 'cljr-add-require-to-ns
-       :desc "Add import to ns" :n "n i" 'cljr-add-import-to-ns))
-   (:map cider-repl-mode-map
-     :n "g \\" 'cider-switch-to-last-clojure-buffer))
-
- (:after w3m
-   (:map w3m-mode-map
-     "/" #'evil-search-forward
-     "?" #'evil-search-backward
-     "r" #'w3m-reload-this-page))
-
- (:after slack
-   (:map slack-message-buffer-mode-map
-     :i "<up>" #'slack-message-edit))
-
- (:after org
-   :n "C-c C-x C-o" #'org-clock-out
-   (:map org-mode-map
-     [remap counsel-imenu] #'counsel-org-goto
-     "M-k" #'org-move-subtree-up
-     "M-j" #'org-move-subtree-down
-     (:localleader
-       :n "g" #'counsel-org-goto))
-
-   (:map org-capture-mode-map
-     :n "g RET" #'org-capture-finalize
-     :n "g \\"  #'org-captue-refile))
-
- (:map lsp-mode-map
-   :n "K"   #'lsp-describe-thing-at-point
-   :n "g r" #'lsp-rename
-   (:localleader
-    :n "a" #'lsp-execute-code-action))
-
- (:map prolog-mode-map
-  :n "g SPC" #'prolog-compile-buffer
-  :n "g \\" #'run-prolog)
-
- (:map tuareg-mode-map
-  :n "g RET" (λ! () (compile "dune build @@runtest"))
-  :n "g SPC" #'dune-promote
-  :n "g \\" #'utop
-  :n "g y" #'merlin-locate-type
-  "C-c C-f" (λ! () (compile "dune fmt"))))
diff --git a/users/grfn/emacs.d/+commands.el b/users/grfn/emacs.d/+commands.el
deleted file mode 100644
index 518f185cb9c2..000000000000
--- a/users/grfn/emacs.d/+commands.el
+++ /dev/null
@@ -1,149 +0,0 @@
-;; -*- lexical-binding: t; -*-
-
-(defalias 'ex! 'evil-ex-define-cmd)
-
-(defun delete-file-and-buffer ()
-  "Kill the current buffer and deletes the file it is visiting."
-  (interactive)
-  (let ((filename (buffer-file-name)))
-    (when filename
-      (if (vc-backend filename)
-          (vc-delete-file filename)
-        (progn
-          (delete-file filename)
-          (message "Deleted file %s" filename)
-          (kill-buffer))))))
-
-;;; Commands defined elsewhere
-;;(ex! "al[ign]"      #'+evil:align)
-;;(ex! "g[lobal]"     #'+evil:global)
-
-;;; Custom commands
-;; Editing
-(ex! "@"            #'+evil:macro-on-all-lines)   ; TODO Test me
-(ex! "al[ign]"      #'+evil:align)
-(ex! "enhtml"       #'+web:encode-html-entities)
-(ex! "dehtml"       #'+web:decode-html-entities)
-(ex! "mc"           #'+evil:mc)
-(ex! "iedit"        #'evil-multiedit-ex-match)
-(ex! "na[rrow]"     #'+evil:narrow-buffer)
-(ex! "retab"        #'+evil:retab)
-
-(ex! "glog" #'magit-log-buffer-file)
-
-;; External resources
-;; TODO (ex! "db"          #'doom:db)
-;; TODO (ex! "dbu[se]"     #'doom:db-select)
-;; TODO (ex! "go[ogle]"    #'doom:google-search)
-(ex! "lo[okup]"    #'+jump:online)
-(ex! "dash"        #'+lookup:dash)
-(ex! "dd"          #'+lookup:devdocs)
-(ex! "http"        #'httpd-start)            ; start http server
-(ex! "repl"        #'+eval:repl)             ; invoke or send to repl
-;; TODO (ex! "rx"          'doom:regex)             ; open re-builder
-(ex! "sh[ell]"     #'+eshell:run)
-(ex! "t[mux]"      #'+tmux:run)              ; send to tmux
-(ex! "tcd"         #'+tmux:cd-here)          ; cd to default-directory in tmux
-(ex! "x"           #'doom/open-project-scratch-buffer)
-
-;; GIT
-(ex! "gist"        #'+gist:send)  ; send current buffer/region to gist
-(ex! "gistl"       #'+gist:list)  ; list gists by user
-(ex! "gbrowse"     #'+vcs/git-browse)        ; show file in github/gitlab
-(ex! "gissues"     #'+vcs/git-browse-issues) ; show github issues
-(ex! "git"         #'magit-status)           ; open magit status window
-(ex! "gstage"      #'magit-stage)
-(ex! "gunstage"    #'magit-unstage)
-(ex! "gblame"      #'magit-blame)
-(ex! "grevert"     #'git-gutter:revert-hunk)
-
-;; Dealing with buffers
-(ex! "clean[up]"   #'doom/cleanup-buffers)
-(ex! "k[ill]"      #'doom/kill-this-buffer)
-(ex! "k[ill]all"   #'+hlissner:kill-all-buffers)
-(ex! "k[ill]m"     #'+hlissner:kill-matching-buffers)
-(ex! "k[ill]o"     #'doom/kill-other-buffers)
-(ex! "l[ast]"      #'doom/popup-restore)
-(ex! "m[sg]"       #'view-echo-area-messages)
-(ex! "pop[up]"     #'doom/popup-this-buffer)
-
-;; Project navigation
-(ex! "a"           #'projectile-toggle-between-implementation-and-test)
-(ex! "as"          #'projectile-find-implementation-or-test-other-window)
-(ex! "av"          #'projectile-find-implementation-or-test-other-window)
-(ex! "cd"          #'+hlissner:cd)
-(cond ((featurep! :completion ivy)
-       (ex! "ag"       #'+ivy:ag)
-       (ex! "agc[wd]"  #'+ivy:ag-cwd)
-       (ex! "rg"       #'+ivy:rg)
-       (ex! "rgc[wd]"  #'+ivy:rg-cwd)
-       (ex! "sw[iper]" #'+ivy:swiper)
-       (ex! "todo"     #'+ivy:todo))
-      ((featurep! :completion helm)
-       (ex! "ag"       #'+helm:ag)
-       (ex! "agc[wd]"  #'+helm:ag-cwd)
-       (ex! "rg"       #'+helm:rg)
-       (ex! "rgc[wd]"  #'+helm:rg-cwd)
-       (ex! "sw[oop]"  #'+helm:swoop)
-       (ex! "todo"     #'+helm:todo)))
-
-;; Project tools
-(ex! "build"       #'+eval/build)
-(ex! "debug"       #'+debug/run)
-(ex! "er[rors]"    #'flycheck-list-errors)
-
-;; File operations
-(ex! "cp"          #'+evil:copy-this-file)
-(ex! "mv"          #'+evil:move-this-file)
-(ex! "rm"          #'+evil:delete-this-file)
-
-;; Sessions/tabs
-(ex! "sclear"      #'+workspace/kill-session)
-(ex! "sl[oad]"     #'+workspace:load-session)
-(ex! "ss[ave]"     #'+workspace:save-session)
-(ex! "tabcl[ose]"  #'+workspace:delete)
-(ex! "tabclear"    #'doom/kill-all-buffers)
-(ex! "tabl[ast]"   #'+workspace/switch-to-last)
-(ex! "tabload"     #'+workspace:load)
-(ex! "tabn[ew]"    #'+workspace:new)
-(ex! "tabn[ext]"   #'+workspace:switch-next)
-(ex! "tabp[rev]"   #'+workspace:switch-previous)
-(ex! "tabr[ename]" #'+workspace:rename)
-(ex! "tabs"        #'+workspace/display)
-(ex! "tabsave"     #'+workspace:save)
-
-(ex! "scr[atch]" #'cider-scratch)
-
-;; Org-mode
-(ex! "cap"         #'+org-capture/dwim)
-
-(evil-define-command evil-alembic-revision (args)
-  (interactive "<a>")
-  (apply
-   #'generate-alembic-migration
-   (read-string "Message: ")
-   (s-split "\\s+" (or args ""))))
-(ex! "arev[ision]" #'evil-alembic-revision)
-
-(evil-define-command evil-alembic-upgrade (&optional revision)
-  (interactive "<a>")
-  (alembic-upgrade (or revision "head")))
-
-(ex! "aup[grade]" #'evil-alembic-upgrade)
-
-(evil-define-command evil-alembic-downgrade (&optional revision)
-  (interactive "<a>")
-  (alembic-downgrade revision))
-
-(ex! "adown[grade]" #'evil-alembic-downgrade)
-
-(evil-define-command evil-alembic (args)
-  (interactive "<a>")
-  (run-alembic args))
-
-(ex! "alemb[ic]" #'evil-alembic)
-
-;; Elixir
-(add-hook! elixir-mode
-  (ex! "AV" #'alchemist-project-toggle-file-and-tests-other-window)
-  (ex! "A" #'alchemist-project-toggle-file-and-tests))
diff --git a/users/grfn/emacs.d/+private.el.gpg b/users/grfn/emacs.d/+private.el.gpg
deleted file mode 100644
index 6273c67d6ecd..000000000000
--- a/users/grfn/emacs.d/+private.el.gpg
+++ /dev/null
Binary files differdiff --git a/users/grfn/emacs.d/.gitignore b/users/grfn/emacs.d/.gitignore
deleted file mode 100644
index 1fd0e3988771..000000000000
--- a/users/grfn/emacs.d/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-.authinfo.gpg
-+private.el
diff --git a/users/grfn/emacs.d/autoload/evil.el b/users/grfn/emacs.d/autoload/evil.el
deleted file mode 100644
index 319c93c05e47..000000000000
--- a/users/grfn/emacs.d/autoload/evil.el
+++ /dev/null
@@ -1,37 +0,0 @@
-;;; /autoload/evil.el -*- lexical-binding: t; -*-
-;;;###if (featurep! :feature evil)
-
-;;;###autoload (autoload '+hlissner:multi-next-line "/autoload/evil" nil t)
-(evil-define-motion +hlissner:multi-next-line (count)
-  "Move down 6 lines."
-  :type line
-  (let ((line-move-visual (or visual-line-mode (derived-mode-p 'text-mode))))
-    (evil-line-move (* 6 (or count 1)))))
-
-;;;###autoload (autoload '+hlissner:multi-previous-line "/autoload/evil" nil t)
-(evil-define-motion +hlissner:multi-previous-line (count)
-  "Move up 6 lines."
-  :type line
-  (let ((line-move-visual (or visual-line-mode (derived-mode-p 'text-mode))))
-    (evil-line-move (- (* 6 (or count 1))))))
-
-;;;###autoload (autoload '+hlissner:cd "/autoload/evil" nil t)
-(evil-define-command +hlissner:cd ()
-  "Change `default-directory' with `cd'."
-  (interactive "<f>")
-  (cd input))
-
-;;;###autoload (autoload '+hlissner:kill-all-buffers "/autoload/evil" nil t)
-(evil-define-command +hlissner:kill-all-buffers (&optional bang)
-  "Kill all buffers. If BANG, kill current session too."
-  (interactive "<!>")
-  (if bang
-      (+workspace/kill-session)
-    (doom/kill-all-buffers)))
-
-;;;###autoload (autoload '+hlissner:kill-matching-buffers "/autoload/evil" nil t)
-(evil-define-command +hlissner:kill-matching-buffers (&optional bang pattern)
-  "Kill all buffers matching PATTERN regexp. If BANG, only match project
-buffers."
-  (interactive "<a>")
-  (doom/kill-matching-buffers pattern bang))
diff --git a/users/grfn/emacs.d/autoload/hlissner.el b/users/grfn/emacs.d/autoload/hlissner.el
deleted file mode 100644
index 87b2236d12c7..000000000000
--- a/users/grfn/emacs.d/autoload/hlissner.el
+++ /dev/null
@@ -1,53 +0,0 @@
-;;; autoload/hlissner.el -*- lexical-binding: t; -*-
-
-;;;###autoload
-(defun +hlissner/install-snippets ()
-  "Install my snippets from https://github.com/hlissner/emacs-snippets into
-private/hlissner/snippets."
-  (interactive)
-  (doom-fetch :github "hlissner/emacs-snippets"
-              (expand-file-name "snippets" (doom-module-path :private 'hlissner))))
-
-;;;###autoload
-(defun +hlissner/yank-buffer-filename ()
-  "Copy the current buffer's path to the kill ring."
-  (interactive)
-  (if-let* ((filename (or buffer-file-name (bound-and-true-p list-buffers-directory))))
-      (message (kill-new (abbreviate-file-name filename)))
-    (error "Couldn't find filename in current buffer")))
-
-(defmacro +hlissner-def-finder! (name dir)
-  "Define a pair of find-file and browse functions."
-  `(progn
-     (defun ,(intern (format "+hlissner/find-in-%s" name)) ()
-       (interactive)
-       (let ((default-directory ,dir)
-             projectile-project-name
-             projectile-require-project-root
-             projectile-cached-buffer-file-name
-             projectile-cached-project-root)
-         (call-interactively (command-remapping #'projectile-find-file))))
-     (defun ,(intern (format "+hlissner/browse-%s" name)) ()
-       (interactive)
-       (let ((default-directory ,dir))
-         (call-interactively (command-remapping #'find-file))))))
-
-;;;###autoload (autoload '+hlissner/find-in-templates "autoload/hlissner" nil t)
-;;;###autoload (autoload '+hlissner/browse-templates "autoload/hlissner" nil t)
-(+hlissner-def-finder! templates +file-templates-dir)
-
-;;;###autoload (autoload '+hlissner/find-in-snippets "autoload/hlissner" nil t)
-;;;###autoload (autoload '+hlissner/browse-snippets "autoload/hlissner" nil t)
-(+hlissner-def-finder! snippets +hlissner-snippets-dir)
-
-;;;###autoload (autoload '+hlissner/find-in-dotfiles "autoload/hlissner" nil t)
-;;;###autoload (autoload '+hlissner/browse-dotfiles "autoload/hlissner" nil t)
-(+hlissner-def-finder! dotfiles (expand-file-name ".dotfiles" "~"))
-
-;;;###autoload (autoload '+hlissner/find-in-emacsd "autoload/hlissner" nil t)
-;;;###autoload (autoload '+hlissner/browse-emacsd "autoload/hlissner" nil t)
-(+hlissner-def-finder! emacsd doom-emacs-dir)
-
-;;;###autoload (autoload '+hlissner/find-in-notes "autoload/hlissner" nil t)
-;;;###autoload (autoload '+hlissner/browse-notes "autoload/hlissner" nil t)
-(+hlissner-def-finder! notes +org-dir)
diff --git a/users/grfn/emacs.d/clocked-in-elt.el b/users/grfn/emacs.d/clocked-in-elt.el
deleted file mode 100644
index be4161441dce..000000000000
--- a/users/grfn/emacs.d/clocked-in-elt.el
+++ /dev/null
@@ -1,17 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-(load (expand-file-name "init" (or (getenv "EMACSDIR")
-               (expand-file-name
-                "../.emacs.d"
-                (file-name-directory (file-truename load-file-name))))))
-
-(require 'org-clock)
-(require 'org-element)
-
-(let ((item (or org-clock-marker
-                (car org-clock-history))))
-  (when item
-    (with-current-buffer (marker-buffer item)
-      (goto-char (marker-position item))
-      (let ((element (org-element-at-point)))
-        (when (eq 'headline (car element))
-          (message "%s" (plist-get (cadr element) :raw-value)))))))
diff --git a/users/grfn/emacs.d/clojure.el b/users/grfn/emacs.d/clojure.el
deleted file mode 100644
index f001a3e12b68..000000000000
--- a/users/grfn/emacs.d/clojure.el
+++ /dev/null
@@ -1,53 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(defun clojure-thing-at-point-setup ()
-  (interactive)
-  ;; Used by cider-find-dwim to parse the symbol at point
-  (setq-local
-   thing-at-point-file-name-chars
-   (concat thing-at-point-file-name-chars
-           "><!?")))
-
-(defun +grfn/clojure-setup ()
-  ;; (flycheck-select-checker 'clj-kondo)
-  (require 'flycheck)
-  (push 'clojure-cider-kibit flycheck-disabled-checkers)
-  (push 'clojure-cider-eastwood flycheck-disabled-checkers)
-  (push 'clojure-cider-typed flycheck-disabled-checkers)
-  )
-
-(after! clojure-mode
-  (define-clojure-indent
-    (PUT 2)
-    (POST 2)
-    (GET 2)
-    (PATCH 2)
-    (DELETE 2)
-    (context 2)
-    (checking 3)
-    (match 1)
-    (domonad 0)
-    (describe 1)
-    (before 1)
-    (it 2))
-
-  (add-hook 'clojure-mode-hook #'clojure-thing-at-point-setup)
-  (add-hook 'clojure-mode-hook #'+grfn/clojure-setup))
-
-(use-package! flycheck-clojure
-  ;; :disabled t
-  :after (flycheck cider)
-  :config
-  (flycheck-clojure-setup))
-
-(after! clj-refactor
-  (setq cljr-magic-requires :prompt
-        cljr-clojure-test-declaration "[clojure.test :refer :all]"
-        cljr-cljc-clojure-test-declaration"#?(:clj [clojure.test :refer :all]
-:cljs [cljs.test :refer-macros [deftest is testing]])"
-        )
-  (add-to-list
-   'cljr-magic-require-namespaces
-   '("s" . "clojure.spec.alpha")))
-
-(set-popup-rule! "^\\*cider-test-report" :size 0.4)
diff --git a/users/grfn/emacs.d/company-sql.el b/users/grfn/emacs.d/company-sql.el
deleted file mode 100644
index e623aa2de131..000000000000
--- a/users/grfn/emacs.d/company-sql.el
+++ /dev/null
@@ -1,299 +0,0 @@
-;;; Commentary:
-;;; TODO
-
-;;; Code:
-
-(require 'emacsql)
-(require 'emacsql-psql)
-(require 'dash)
-(require 's)
-(require 'cl-lib)
-
-;;; Config
-
-(defvar-local company-sql-db-host "localhost"
-  "Host of the postgresql database to query for autocomplete information")
-
-(defvar-local company-sql-db-port 5432
-  "Port of the postgresql database to query for autocomplete information")
-
-(defvar-local company-sql-db-user "postgres"
-  "Username of the postgresql database to query for autocomplete information")
-
-(defvar-local company-sql-db-name nil
-  "PostgreSQL database name to query for autocomplete information")
-
-;;; DB Connection
-
-(defvar-local company-sql/connection nil)
-
-(defun company-sql/connect ()
-  (unless company-sql/connection
-    (setq-local company-sql/connection
-                (emacsql-psql company-sql-db-name
-                              :hostname company-sql-db-host
-                              :username company-sql-db-user
-                              :port (number-to-string company-sql-db-port))))
-  company-sql/connection)
-
-;;; Utils
-
-(defmacro comment (&rest _))
-
-(defun ->string (x)
-  (cond
-   ((stringp x) x)
-   ((symbolp x) (symbol-name x))))
-
-(defun alist-get-equal (key alist)
-  "Like `alist-get', but uses `equal' instead of `eq' for comparing keys"
-  (->> alist
-       (-find (lambda (pair) (equal key (car pair))))
-       (cdr)))
-
-;;; Listing relations
-
-(cl-defun company-sql/list-tables (conn)
-  (with-timeout (3)
-    (-map (-compose 'symbol-name 'car)
-          (emacsql conn
-                   [:select [tablename]
-                            :from pg_catalog:pg_tables
-                            :where (and (!= schemaname '"information_schema")
-                                        (!= schemaname '"pg_catalog"))]))))
-
-(cl-defun company-sql/list-columns (conn)
-  (with-timeout (3)
-    (-map
-     (lambda (row)
-       (propertize (symbol-name (nth 0 row))
-                   'table-name (nth 1 row)
-                   'data-type  (nth 2 row)))
-     (emacsql conn
-              [:select [column_name
-                        table_name
-                        data_type]
-                       :from information_schema:columns]))))
-
-;;; Keywords
-
-(defvar company-postgresql/keywords
-  (list
-"a" "abort" "abs" "absent" "absolute" "access" "according" "action" "ada" "add"
-"admin" "after" "aggregate" "all" "allocate" "also" "alter" "always" "analyse"
-"analyze" "and" "any" "are" "array" "array_agg" "array_max_cardinality" "as"
-"asc" "asensitive" "assertion" "assignment" "asymmetric" "at" "atomic" "attach"
-"attribute" "attributes" "authorization" "avg" "backward" "base64" "before"
-"begin" "begin_frame" "begin_partition" "bernoulli" "between" "bigint" "binary"
-"bit" "bit_length" "blob" "blocked" "bom" "boolean" "both" "breadth" "by" "c"
-"cache" "call" "called" "cardinality" "cascade" "cascaded" "case" "cast"
-"catalog" "catalog_name" "ceil" "ceiling" "chain" "char" "character"
-"characteristics" "characters" "character_length" "character_set_catalog"
-"character_set_name" "character_set_schema" "char_length" "check" "checkpoint"
-"class" "class_origin" "clob" "close" "cluster" "coalesce" "cobol" "collate"
-"collation" "collation_catalog" "collation_name" "collation_schema" "collect"
-"column" "columns" "column_name" "command_function" "command_function_code"
-"comment" "comments" "commit" "committed" "concurrently" "condition"
-"condition_number" "configuration" "conflict" "connect" "connection"
-"connection_name" "constraint" "constraints" "constraint_catalog"
-"constraint_name" "constraint_schema" "constructor" "contains" "content"
-"continue" "control" "conversion" "convert" "copy" "corr" "corresponding" "cost"
-"count" "covar_pop" "covar_samp" "create" "cross" "csv" "cube" "cume_dist"
-"current" "current_catalog" "current_date" "current_default_transform_group"
-"current_path" "current_role" "current_row" "current_schema" "current_time"
-"current_timestamp" "current_transform_group_for_type" "current_user" "cursor"
-"cursor_name" "cycle" "data" "database" "datalink" "date"
-"datetime_interval_code" "datetime_interval_precision" "day" "db" "deallocate"
-"dec" "decimal" "declare" "default" "defaults" "deferrable" "deferred" "defined"
-"definer" "degree" "delete" "delimiter" "delimiters" "dense_rank" "depends"
-"depth" "deref" "derived" "desc" "describe" "descriptor" "detach"
-"deterministic" "diagnostics" "dictionary" "disable" "discard" "disconnect"
-"dispatch" "distinct" "dlnewcopy" "dlpreviouscopy" "dlurlcomplete"
-"dlurlcompleteonly" "dlurlcompletewrite" "dlurlpath" "dlurlpathonly"
-"dlurlpathwrite" "dlurlscheme" "dlurlserver" "dlvalue" "do" "document" "domain"
-"double" "drop" "dynamic" "dynamic_function" "dynamic_function_code" "each"
-"element" "else" "empty" "enable" "encoding" "encrypted" "end" "end-exec"
-"end_frame" "end_partition" "enforced" "enum" "equals" "escape" "event" "every"
-"except" "exception" "exclude" "excluding" "exclusive" "exec" "execute" "exists"
-"exp" "explain" "expression" "extension" "external" "extract" "false" "family"
-"fetch" "file" "filter" "final" "first" "first_value" "flag" "float" "floor"
-"following" "for" "force" "foreign" "fortran" "forward" "found" "frame_row"
-"free" "freeze" "from" "fs" "full" "function" "functions" "fusion" "g" "general"
-"generated" "get" "global" "go" "goto" "grant" "granted" "greatest" "group"
-"grouping" "groups" "handler" "having" "header" "hex" "hierarchy" "hold" "hour"
-"id" "identity" "if" "ignore" "ilike" "immediate" "immediately" "immutable"
-"implementation" "implicit" "import" "in" "include" "including" "increment"
-"indent" "index" "indexes" "indicator" "inherit" "inherits" "initially" "inline"
-"inner" "inout" "input" "insensitive" "insert" "instance" "instantiable"
-"instead" "int" "integer" "integrity" "intersect" "intersection" "interval"
-"into" "invoker" "is" "isnull" "isolation" "join" "k" "key" "key_member"
-"key_type" "label" "lag" "language" "large" "last" "last_value" "lateral" "lead"
-"leading" "leakproof" "least" "left" "length" "level" "library" "like"
-"like_regex" "limit" "link" "listen" "ln" "load" "local" "localtime"
-"localtimestamp" "location" "locator" "lock" "locked" "logged" "lower" "m" "map"
-"mapping" "match" "matched" "materialized" "max" "maxvalue" "max_cardinality"
-"member" "merge" "message_length" "message_octet_length" "message_text" "method"
-"min" "minute" "minvalue" "mod" "mode" "modifies" "module" "month" "more" "move"
-"multiset" "mumps" "name" "names" "namespace" "national" "natural" "nchar"
-"nclob" "nesting" "new" "next" "nfc" "nfd" "nfkc" "nfkd" "nil" "no" "none"
-"normalize" "normalized" "not" "nothing" "notify" "notnull" "nowait" "nth_value"
-"ntile" "null" "nullable" "nullif" "nulls" "number" "numeric" "object"
-"occurrences_regex" "octets" "octet_length" "of" "off" "offset" "oids" "old"
-"on" "only" "open" "operator" "option" "options" "or" "order" "ordering"
-"ordinality" "others" "out" "outer" "output" "over" "overlaps" "overlay"
-"overriding" "owned" "owner" "p" "pad" "parallel" "parameter" "parameter_mode"
-"parameter_name" "parameter_ordinal_position" "parameter_specific_catalog"
-"parameter_specific_name" "parameter_specific_schema" "parser" "partial"
-"partition" "pascal" "passing" "passthrough" "password" "path" "percent"
-"percentile_cont" "percentile_disc" "percent_rank" "period" "permission"
-"placing" "plans" "pli" "policy" "portion" "position" "position_regex" "power"
-"precedes" "preceding" "precision" "prepare" "prepared" "preserve" "primary"
-"prior" "privileges" "procedural" "procedure" "procedures" "program" "public"
-"publication" "quote" "range" "rank" "read" "reads" "real" "reassign" "recheck"
-"recovery" "recursive" "ref" "references" "referencing" "refresh" "regr_avgx"
-"regr_avgy" "regr_count" "regr_intercept" "regr_r2" "regr_slope" "regr_sxx"
-"regr_sxy" "regr_syy" "reindex" "relative" "release" "rename" "repeatable"
-"replace" "replica" "requiring" "reset" "respect" "restart" "restore" "restrict"
-"result" "return" "returned_cardinality" "returned_length"
-"returned_octet_length" "returned_sqlstate" "returning" "returns" "revoke"
-"right" "role" "rollback" "rollup" "routine" "routines" "routine_catalog"
-"routine_name" "routine_schema" "row" "rows" "row_count" "row_number" "rule"
-"savepoint" "scale" "schema" "schemas" "schema_name" "scope" "scope_catalog"
-"scope_name" "scope_schema" "scroll" "search" "second" "section" "security"
-"select" "selective" "self" "sensitive" "sequence" "sequences" "serializable"
-"server" "server_name" "session" "session_user" "set" "setof" "sets" "share"
-"show" "similar" "simple" "size" "skip" "smallint" "snapshot" "some" "source"
-"space" "specific" "specifictype" "specific_name" "sql" "sqlcode" "sqlerror"
-"sqlexception" "sqlstate" "sqlwarning" "sqrt" "stable" "standalone" "start"
-"state" "statement" "static" "statistics" "stddev_pop" "stddev_samp" "stdin"
-"stdout" "storage" "strict" "strip" "structure" "style" "subclass_origin"
-"submultiset" "subscription" "substring" "substring_regex" "succeeds" "sum"
-"symmetric" "sysid" "system" "system_time" "system_user" "t" "table" "tables"
-"tablesample" "tablespace" "table_name" "temp" "template" "temporary" "text"
-"then" "ties" "time" "timestamp" "timezone_hour" "timezone_minute" "to" "token"
-"top_level_count" "trailing" "transaction" "transactions_committed"
-"transactions_rolled_back" "transaction_active" "transform" "transforms"
-"translate" "translate_regex" "translation" "treat" "trigger" "trigger_catalog"
-"trigger_name" "trigger_schema" "trim" "trim_array" "true" "truncate" "trusted"
-"type" "types" "uescape" "unbounded" "uncommitted" "under" "unencrypted" "union"
-"unique" "unknown" "unlink" "unlisten" "unlogged" "unnamed" "unnest" "until"
-"untyped" "update" "upper" "uri" "usage" "user" "user_defined_type_catalog"
-"user_defined_type_code" "user_defined_type_name" "user_defined_type_schema"
-"using" "vacuum" "valid" "validate" "validator" "value" "values" "value_of"
-"varbinary" "varchar" "variadic" "varying" "var_pop" "var_samp" "verbose"
-"version" "versioning" "view" "views" "volatile" "when" "whenever" "where"
-"whitespace" "width_bucket" "window" "with" "within" "without" "work" "wrapper"
-"write" "xml" "xmlagg" "xmlattributes" "xmlbinary" "xmlcast" "xmlcomment"
-"xmlconcat" "xmldeclaration" "xmldocument" "xmlelement" "xmlexists" "xmlforest"
-"xmliterate" "xmlnamespaces" "xmlparse" "xmlpi" "xmlquery" "xmlroot" "xmlschema"
-"xmlserialize" "xmltable" "xmltext" "xmlvalidate" "year" "yes" "zone"))
-
-;;; Company backend
-
-(cl-defun company-postgresql/candidates (prefix conn)
-  (-filter
-   (apply-partially #'s-starts-with? prefix)
-   (append (-map (lambda (s)
-                   (propertize s 'company-postgresql-annotation "table"))
-
-           (-map (lambda (s)
-                   (propertize s 'company-postgresql-annotation
-                               (format "%s.%s %s"
-                                       (get-text-property 0 'table-name s)
-                                       s
-                                       (->
-                                        (get-text-property 0 'data-type s)
-                                        (->string)
-                                        (upcase)))))
-                 (company-sql/list-columns conn))
-           (-map (lambda (s)
-                   (propertize s 'company-postgresql-annotation "keyword"))
-                 company-postgresql/keywords)))))
-
-(defun company-postgresql (command &optional arg &rest _)
-  (interactive (list 'interactive))
-  (cl-case command
-    (interactive (company-begin-backend 'company-postgresql))
-    (init (company-sql/connect))
-    (prefix (company-grab-symbol))
-    (annotation
-     (get-text-property 0 'company-postgresql-annotation arg))
-    (candidates (company-postgresql/candidates
-                 arg
-                 (company-sql/connect)))
-    (duplicates t)
-    (ignore-case t)))
-
-;;; org-babel company sql
-
-(defvar-local org-company-sql/connections
-  ())
-
-(defun org-company-sql/connect (conn-params)
-  (or (alist-get-equal conn-params org-company-sql/connections)
-      (let ((conn (apply 'emacsql-psql conn-params)))
-        (add-to-list 'org-company-sql/connections (cons conn-params conn))
-        conn)))
-
-(defun org-company-sql/in-sql-source-block-p ()
-  (let ((org-elt (org-element-at-point)))
-    (and (eq 'src-block (car org-elt))
-         (equal "sql" (plist-get (cadr org-elt)
-                                 :language)))))
-
-(defun org-company-sql/parse-cmdline (cmdline)
-  (let* ((lexed (s-split (rx (one-or-more blank)) cmdline))
-         (go (lambda (state tokens)
-               (if (null tokens) ()
-                 (let ((token (car tokens))
-                       (tokens (cdr tokens)))
-                   (if (null state)
-                       (if (s-starts-with? "-" token)
-                           (funcall go token tokens)
-                         (cons token (funcall go state tokens)))
-                     (cons (cons state token)  ; ("-h" . "localhost")
-                           (funcall go nil tokens)))))))
-         (opts (funcall go nil lexed)))
-    opts))
-
-(defun org-company-sql/source-block-conn-params ()
-  (let* ((block-info (org-babel-get-src-block-info))
-         (params (caddr block-info))
-         (cmdline (alist-get :cmdline params))
-         (parsed (org-company-sql/parse-cmdline cmdline))
-         (opts (-filter #'listp parsed))
-         (positional (-filter #'stringp parsed))
-         (host (alist-get-equal "-h" opts))
-         (port (or (alist-get-equal "-p" opts)
-                   "5432"))
-         (dbname (or (alist-get-equal "-d" opts)
-                     (car positional)))
-         (username (or (alist-get-equal "-U" opts)
-                       (cadr positional))))
-    (list dbname
-          :hostname host
-          :username username
-          :port port)))
-
-(defun org-company-sql/connection-for-source-block ()
-  (org-company-sql/connect
-   (org-company-sql/source-block-conn-params)))
-
-
-(defun company-ob-postgresql (command &optional arg &rest _)
-  (interactive (list 'interactive))
-  (cl-case command
-    (interactive (company-begin-backend 'company-ob-postgresql))
-    (prefix (and (org-company-sql/in-sql-source-block-p)
-                 (company-grab-symbol)))
-    (annotation (get-text-property 0 'company-postgresql-annotation arg))
-    (candidates
-     (company-postgresql/candidates
-      arg
-      (org-company-sql/connection-for-source-block)))
-    (duplicates t)
-    (ignore-case t)))
-
-;;;
-
-(provide 'company-sql)
diff --git a/users/grfn/emacs.d/config.el b/users/grfn/emacs.d/config.el
deleted file mode 100644
index 6398feace8cb..000000000000
--- a/users/grfn/emacs.d/config.el
+++ /dev/null
@@ -1,1139 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-;; I've swapped these keys on my keyboard
-(setq x-super-keysym 'alt
-      x-alt-keysym   'meta)
-
-(setq user-mail-address "root@gws.fyi"
-      user-full-name    "Griffin Smith")
-
-(let ((font-family (pcase system-type
-                     ('darwin "MesloLGSDZ NF")
-                     ('gnu/linux "Meslo LGSDZ Nerd Font"))))
-  (setq doom-font (font-spec :family font-family :size 14)
-        doom-big-font (font-spec :family font-family :size 24)
-        doom-big-font-increment 5
-        doom-variable-pitch-font (font-spec :family font-family)
-        doom-unicode-font (font-spec :family font-family)))
-
-(require 's)
-
-(undefine-key! :keymaps 'doom-leader-map "/")
-
-(load! "utils")
-(load! "company-sql")
-(load! "show-matching-paren")
-(load! "irc")
-(load! "github-org")
-(load! "org-gcal")
-(load! "grid")
-(load! "nix")
-(load! "email")
-(load! "cpp")
-(load! "lisp")
-(load! "clojure")
-(load! "rust")
-(load! "terraform")
-
-(require 'tvl)
-
-(add-hook! elixir-mode
-  (require 'flycheck-credo)
-  (setq flycheck-elixir-credo-strict t)
-  (flycheck-credo-setup)
-
-  (require 'flycheck-mix) (flycheck-mix-setup)
-
-  (require 'flycheck-dialyxir) (flycheck-dialyxir-setup)
-
-  (flycheck-mode))
-
-(setq +solarized-s-base03    "#002b36"
-      +solarized-s-base02    "#073642"
-      ;; emphasized content
-      +solarized-s-base01    "#586e75"
-      ;; primary content
-      +solarized-s-base00    "#657b83"
-      +solarized-s-base0     "#839496"
-      ;; comments
-      +solarized-s-base1     "#93a1a1"
-      ;; background highlight light
-      +solarized-s-base2     "#eee8d5"
-      ;; background light
-      +solarized-s-base3     "#fdf6e3"
-
-      ;; Solarized accented colors
-      +solarized-yellow    "#b58900"
-      +solarized-orange    "#cb4b16"
-      +solarized-red       "#dc322f"
-      +solarized-magenta   "#d33682"
-      +solarized-violet    "#6c71c4"
-      +solarized-blue      "#268bd2"
-      +solarized-cyan      "#2aa198"
-      +solarized-green     "#859900"
-
-      ;; Darker and lighter accented colors
-      ;; Only use these in exceptional circumstances!
-      +solarized-yellow-d  "#7B6000"
-      +solarized-yellow-l  "#DEB542"
-      +solarized-orange-d  "#8B2C02"
-      +solarized-orange-l  "#F2804F"
-      +solarized-red-d     "#990A1B"
-      +solarized-red-l     "#FF6E64"
-      +solarized-magenta-d "#93115C"
-      +solarized-magenta-l "#F771AC"
-      +solarized-violet-d  "#3F4D91"
-      +solarized-violet-l  "#9EA0E5"
-      +solarized-blue-d    "#00629D"
-      +solarized-blue-l    "#69B7F0"
-      +solarized-cyan-d    "#00736F"
-      +solarized-cyan-l    "#69CABF"
-      +solarized-green-d   "#546E00"
-      +solarized-green-l "#B4C342")
-
-(defcustom theme-overrides nil
-  "Association list of override faces to set for different custom themes.")
-
-(defadvice load-theme (after theme-set-overrides activate)
-  (dolist (theme-settings theme-overrides)
-    (let ((theme (car theme-settings))
-          (faces (cadr theme-settings)))
-      (if (member theme custom-enabled-themes)
-          (progn
-            (dolist (face faces)
-              (custom-theme-set-faces theme face)))))))
-
-(defun alist-set (alist-symbol key value)
-  "Set VALUE of a KEY in ALIST-SYMBOL."
-  (set alist-symbol (cons (list key value) (assq-delete-all key (eval alist-symbol)))))
-
-(comment
- (custom-theme-set-faces 'grfn-solarized-light
-                         `(font-lock-doc-face
-                           ((t (:foreground ,+solarized-s-base1)))))
-
-+solarized-s-base1
-(custom-theme-)
- (custom-face-get-current-spec 'font-lock-doc-face)
-
- )
-
-(alist-set 'theme-overrides 'grfn-solarized-light
-           `((font-lock-doc-face ((t (:foreground ,+solarized-s-base1))))
-             (font-lock-preprocessor-face ((t (:foreground ,+solarized-red))))
-             (font-lock-keyword-face ((t (:foreground ,+solarized-green :bold nil))))
-             (font-lock-builtin-face ((t (:foreground ,+solarized-s-base01
-                                                      :bold t))))
-
-             (elixir-attribute-face ((t (:foreground ,+solarized-blue))))
-             (elixir-atom-face ((t (:foreground ,+solarized-cyan))))
-             (linum ((t (:background ,+solarized-s-base2 :foreground ,+solarized-s-base1))))
-             (line-number ((t (:background ,+solarized-s-base2 :foreground ,+solarized-s-base1))))
-             (line-number-current-line ((t (:background ,+solarized-s-base2 :foreground ,+solarized-s-base1))))
-
-             (haskell-operator-face ((t (:foreground ,+solarized-green))))
-             (haskell-keyword-face ((t (:foreground ,+solarized-cyan))))
-
-             (org-drawer ((t (:foreground ,+solarized-s-base1
-                              :bold t))))))
-
-(setq solarized-use-variable-pitch nil
-      solarized-scale-org-headlines nil
-      solarized-use-less-bold t)
-
-(add-to-list 'custom-theme-load-path "~/.doom.d/themes")
-(load-theme 'grfn-solarized-light t)
-
-(defface haskell-import-face `((t (:foreground ,+solarized-magenta))) "")
-
-(setq doom-theme 'grfn-solarized-light)
-; (setq doom-theme 'doom-solarized-light)
-
-(add-hook! doom-post-init
-  (set-face-attribute 'bold nil :weight 'ultra-light)
-  (set-face-bold 'bold nil)
-  (enable-theme 'grfn-solarized-light))
-
-(defun rx-words (&rest words)
-  (rx-to-string
-   `(and symbol-start (group (or ,@words)) symbol-end)))
-
-(font-lock-add-keywords
- 'elixir-mode
- `((,(rx-words "def"
-               "defp"
-               "test"
-               "describe"
-               "property"
-               "defrecord"
-               "defmodule"
-               "defstruct"
-               "defdelegate"
-               "defprotocol"
-               "defimpl"
-               "use"
-               "import"
-               "alias"
-               "require"
-               "assert"
-               "refute"
-               "assert_raise")
-    .
-    'font-lock-preprocessor-face)))
-
-(font-lock-add-keywords
- 'elixir-mode
- `((,(rx-words "def"
-               "defp"
-               "test"
-               "describe"
-               "property"
-               "defrecord"
-               "defmodule"
-               "defstruct"
-               "defdelegate"
-               "use"
-               "import"
-               "alias"
-               "require"
-               "assert"
-               "refute"
-               "assert_raise")
-    .
-    'font-lock-preprocessor-face)))
-
-(font-lock-add-keywords
- 'haskell-mode
- `((,(rx-words "import") . 'haskell-import-face)))
-
-;; (font-lock-add-keywords
-;;  'haskell-mode
-;;  `((,(rx "-- |") . 'haskell-keyword-face)))
-
-
-;; (load-file (let ((coding-system-for-read 'utf-8))
-;;                 (shell-command-to-string "agda-mode locate")))
-
-(defvar +grfn-dir (file-name-directory load-file-name))
-(defvar +grfn-snippets-dir (expand-file-name "snippets/" +grfn-dir))
-
-;;
-(load! "+bindings")
-(load! "+commands")
-(load! "cpp")
-
-
-(add-to-list 'load-path "/home/grfn/code/org-tracker")
-(require 'org-tracker)
-(use-package! org-tracker
-  :hook (org-mode . org-tracker-mode)
-  :config
-  (setq org-tracker-state-alist '(("INBOX" . "Triage")
-                                  ("BACKLOG" . "Backlog")
-                                  ("TODO" . "Todo")
-                                  ("ACTIVE" . "In Progress")
-                                  ("PR" . "Code Review")
-                                  ("DONE" . "Done")
-                                  ("CANCELLED" . "Canceled"))
-        org-tracker-username "griffin@readyset.io"
-        org-tracker-claim-ticket-on-status-update '("ACTIVE" "PR" "DONE")
-        org-tracker-create-stories-with-labels 'existing)
-
-  (defun org-tracker-headlines-from-assigned-to-me (level)
-    (interactive "*nLevel: ")
-    (funcall-interactively
-     #'org-tracker-headlines-from-search
-     level
-     "assignee = currentUser() and statusCategory = 2")))
-
-(load! "+private")
-
-(require 'dash)
-
-(use-package! predd)
-
-
-;;
-;; Global config
-;;
-
-(setq doom-modeline-buffer-file-name-style 'relative-to-project
-      doom-modeline-modal-icon nil
-      doom-modeline-github t)
-
-;;
-;; Modules
-;;
-
-(after! smartparens
-  ;; Auto-close more conservatively and expand braces on RET
-  (let ((unless-list '(sp-point-before-word-p
-                       sp-point-after-word-p
-                       sp-point-before-same-p)))
-    (sp-pair "'"  nil :unless unless-list)
-    (sp-pair "\"" nil :unless unless-list))
-  (sp-pair "{" nil :post-handlers '(("||\n[i]" "RET") ("| " " "))
-           :unless '(sp-point-before-word-p sp-point-before-same-p))
-  (sp-pair "(" nil :post-handlers '(("||\n[i]" "RET") ("| " " "))
-           :unless '(sp-point-before-word-p sp-point-before-same-p))
-  (sp-pair "[" nil :post-handlers '(("| " " "))
-           :unless '(sp-point-before-word-p sp-point-before-same-p)))
-
-;; feature/snippets
-(after! yasnippet
-  ;; Don't use default snippets, use mine.
-  (setq yas-snippet-dirs
-        (append (list '+grfn-snippets-dir)
-                (delq 'yas-installed-snippets-dir yas-snippet-dirs))))
-
-(after! company
-  (setq company-idle-delay 0.2
-        company-minimum-prefix-length 1))
-
-(setq doom-modeline-height 12)
-
-
-
-;; Should really figure out which of these is correct, eventually
-
-(setq +solarized-s-base03    "#002b36"
-      +solarized-s-base02    "#073642"
-      ;; emphasized content
-      +solarized-s-base01    "#586e75"
-      ;; primary content
-      +solarized-s-base00    "#657b83"
-      +solarized-s-base0     "#839496"
-      ;; comments
-      +solarized-s-base1     "#93a1a1"
-      ;; background highlight light
-      +solarized-s-base2     "#eee8d5"
-      ;; background light
-      +solarized-s-base3     "#fdf6e3"
-
-      ;; Solarized accented colors
-      +solarized-yellow    "#b58900"
-      +solarized-orange    "#cb4b16"
-      +solarized-red       "#dc322f"
-      +solarized-magenta   "#d33682"
-      +solarized-violet    "#6c71c4"
-      +solarized-blue      "#268bd2"
-      +solarized-cyan      "#2aa198"
-      +solarized-green     "#859900"
-
-      ;; Darker and lighter accented colors
-      ;; Only use these in exceptional circumstances!
-      +solarized-yellow-d  "#7B6000"
-      +solarized-yellow-l  "#DEB542"
-      +solarized-orange-d  "#8B2C02"
-      +solarized-orange-l  "#F2804F"
-      +solarized-red-d     "#990A1B"
-      +solarized-red-l     "#FF6E64"
-      +solarized-magenta-d "#93115C"
-      +solarized-magenta-l "#F771AC"
-      +solarized-violet-d  "#3F4D91"
-      +solarized-violet-l  "#9EA0E5"
-      +solarized-blue-d    "#00629D"
-      +solarized-blue-l    "#69B7F0"
-      +solarized-cyan-d    "#00736F"
-      +solarized-cyan-l    "#69CABF"
-      +solarized-green-d   "#546E00"
-      +solarized-green-l "#B4C342")
-
-(set-cursor-color +solarized-s-base02)
-
-(after! doom-theme
-  (set-face-foreground 'font-lock-doc-face +solarized-s-base1)
-  (set-face-foreground 'org-block +solarized-s-base00)
-  (set-face-foreground 'slack-message-output-header +solarized-s-base01)
-  (set-face-attribute 'slack-message-output-header nil :underline nil)
-  (set-face-attribute 'slack-message-output-text nil :height 1.0)
-  (set-face-attribute 'caml-types-expr-face
-                      nil
-                      :background +solarized-s-base2))
-
-(after! solarized-theme
-  (set-face-foreground 'font-lock-doc-face +solarized-s-base1)
-  (set-face-foreground 'org-block +solarized-s-base00)
-
-  (set-face-foreground 'slack-message-output-header +solarized-s-base01)
-  (set-face-attribute 'slack-message-output-header nil :underline nil)
-  (set-face-attribute 'slack-message-output-text nil :height 1.0)
-  )
-
-(after! evil
-  (setq evil-shift-width 2))
-
-(after! org
-  (load! "org-query")
-  (load! "org-config"))
-
-(after! magit
-  (setq git-commit-summary-max-length 50))
-
-(after! ivy
-  ;; (setq ivy-re-builders-alist
-  ;;       '((t . ivy--regex-fuzzy)))
-  )
-
-(add-hook 'before-save-hook 'delete-trailing-whitespace)
-
-(after! paxedit
-  (add-hook! emacs-lisp-mode #'paxedit-mode)
-  (add-hook! clojure-mode #'paxedit-mode)
-  (add-hook! common-lisp-mode #'paxedit-mode))
-
-(require 'haskell)
-
-(let ((m-symbols
-      '(("`mappend`" . "⊕")
-        ("<>"        . "⊕")
-        ("`elem`"   . "∈")
-        ("`notElem`" . "∉"))))
-  (dolist (item m-symbols) (add-to-list 'haskell-font-lock-symbols-alist item)))
-
-(setq haskell-font-lock-symbols t)
-
-
-(add-hook! haskell-mode
-  ;; (intero-mode)
-  (lsp-mode)
-  ;; (flycheck-add-next-checker
-  ;;  'intero
-  ;;  'haskell-hlint)
-  (set-fill-column 80)
-  (setq evil-shift-width 2))
-
-(auth-source-pass-enable)
-
-(require 'fill-column-indicator)
-;;; * Column Marker
-(defun sanityinc/fci-enabled-p () (symbol-value 'fci-mode))
-
-(defvar sanityinc/fci-mode-suppressed nil)
-(make-variable-buffer-local 'sanityinc/fci-mode-suppressed)
-
-(defadvice popup-create (before suppress-fci-mode activate)
-  "Suspend fci-mode while popups are visible"
-  (let ((fci-enabled (sanityinc/fci-enabled-p)))
-    (when fci-enabled
-      (setq sanityinc/fci-mode-suppressed fci-enabled)
-      (turn-off-fci-mode))))
-
-(defadvice popup-delete (after restore-fci-mode activate)
-  "Restore fci-mode when all popups have closed"
-  (when (and sanityinc/fci-mode-suppressed
-             (null popup-instances))
-    (setq sanityinc/fci-mode-suppressed nil)
-    (turn-on-fci-mode)))
-
-
-;;; Javascript
-
-(require 'smartparens)
-
-(setq js-indent-level 2)
-
-(require 'prettier-js)
-(after! prettier-js
-  (add-hook! rjsx-mode #'prettier-js-mode)
-  (add-hook! js2-mode  #'prettier-js-mode)
-  (add-hook! json-mode #'prettier-js-mode)
-  (add-hook! css-mode  #'prettier-js-mode))
-
-(remove-hook 'js2-mode-hook 'tide-setup t)
-
-;; Set this to the mode you use, I use rjsx-mode
-(add-hook 'rjsx-mode-hook #'flow/set-flow-executable t)
-
-
-;; Auto-format Haskell on save, with a combination of hindent + brittany
-
-; (define-minor-mode brittany-haskell-mode
-;   :init-value nil
-;   :group 'haskell
-;   :lighter "Brittany-Haskell"
-;   :keymap '()
-;   )
-
-
-(require 'alert)
-(setq alert-default-style 'libnotify)
-
-;; (setq slack-buffer-function #'switch-to-buffer)
-
-(setq projectile-test-suffix-function
-      (lambda (project-type)
-        (case project-type
-          ('haskell-stack "Test")
-          ('npm ".test")
-          (otherwise (projectile-test-suffix project-type)))))
-
-(setq projectile-create-missing-test-files 't)
-
-(setq grfn/tracker-refs-re
-      (rx line-start
-          (or "Refs" "Fixes")
-          ": "
-          (one-or-more graph)
-          line-end))
-
-(defun grfn/add-tracker-reference-to-commit-message ()
-  (interactive)
-  (when-let* ((ticket-id (grfn/org-clocked-in-ticket-id)))
-    (save-excursion
-      (save-match-data
-        (goto-char (point-min))
-        ;; Don't add one if we've already got one
-        (unless (search-forward-regexp grfn/tracker-refs-re nil t)
-          (or
-           (and
-            (search-forward-regexp (rx line-start "Change-Id:") nil t)
-            (forward-line -1))
-           (and
-            (search-forward-regexp (rx line-start "# Please enter") nil t)
-            (forward-line -2)))
-          (insert (format "\nRefs: %s" ticket-id)))))))
-
-(defun grfn/switch-tracker-refs-fixes ()
-  (interactive)
-  (save-excursion
-    (save-match-data
-      (if (not (search-forward-regexp grfn/tracker-refs-re nil t))
-          (message "Could not find reference to ticket")
-        (goto-char (point-at-bol))
-        (save-restriction
-          (narrow-to-region (point-at-bol)
-                            (point-at-eol))
-          (or
-           (and (search-forward "Refs" nil t)
-                (replace-match "Fixes"))
-           (and (search-forward "Fixes" nil t)
-                (replace-match "Refs"))))))))
-
-(after! magit
-  (map! :map magit-mode-map
-        ;; :n "] ]" #'magit-section-forward
-        ;; :n "[ [" #'magit-section-backward
-        )
-
-  (transient-define-suffix magit-commit-wip ()
-    (interactive)
-    (magit-commit-create '("-m" "wip")))
-
-  (transient-append-suffix
-    #'magit-commit
-    ["c"]
-    (list "W" "Commit WIP" #'magit-commit-wip))
-
-  (transient-define-suffix magit-reset-head-back ()
-    (interactive)
-    (magit-reset-mixed "HEAD~"))
-
-  (transient-define-suffix magit-reset-head-previous ()
-    (interactive)
-    (magit-reset-mixed "HEAD@{1}"))
-
-  (transient-append-suffix
-    #'magit-reset
-    ["f"]
-    (list "b" "Reset HEAD~"    #'magit-reset-head-back))
-  (transient-append-suffix
-    #'magit-reset
-    ["f"]
-    (list "o" "Reset HEAD@{1}" #'magit-reset-head-previous))
-
-  (defun magit-read-org-tracker-branch-name ()
-    (when-let ((issue-id (org-tracker-clocked-in-issue-id)))
-      (let ((desc
-             (magit-read-string-ns
-              (format "Issue description (to go after gs/%s/)"
-                      issue-id))))
-        (format "gs/%s/%s" issue-id desc))))
-
-  (defun magit-read-org-tracker-branch-args ()
-    (if-let ((issue-id (org-tracker-clocked-in-issue-id)))
-        (let ((start-point (magit-read-starting-point
-                            "Create and checkout branch for Tracker issue"
-                            nil
-                            "origin/master")))
-          (if (magit-rev-verify start-point)
-              (when-let ((desc (magit-read-org-tracker-branch-name)))
-                (list desc start-point))
-            (user-error "Not a valid starting point: %s" choice)))
-      (user-error "No currently clocked-in tracker issue")))
-
-  (transient-define-suffix magit-checkout-org-tracker-branch (branch start-point)
-    (interactive (magit-read-org-tracker-branch-args))
-    (magit-branch-and-checkout branch start-point))
-
-  (transient-define-suffix magit-rename-org-tracker-branch (old new)
-    (interactive
-     (let ((branch (magit-read-local-branch "Rename branch")))
-       (list branch (magit-read-org-tracker-branch-name))))
-    (when (and old new)
-      (magit-branch-rename old new)))
-
-  (transient-append-suffix
-    #'magit-branch
-    ["c"]
-    (list "C" "Checkout Tracker branch" #'magit-checkout-org-tracker-branch))
-  (transient-append-suffix
-    #'magit-branch
-    ["c"]
-    (list "M" "Rename branch to Tracker ticket" #'magit-rename-org-tracker-branch))
-
-  )
-
-(add-hook 'git-commit-setup-hook #'grfn/add-tracker-reference-to-commit-message)
-(map! (:map git-commit-mode-map
-       "C-c C-f" #'grfn/switch-tracker-refs-fixes))
-
-;; (defun grfn/split-window-more-sensibly (&optional window)
-;;   (let ((window (or window (selected-window))))
-;;     (or (and (window-splittable-p window)
-;;              ;; Split window vertically.
-;;              (with-selected-window window
-;;                (split-window-right)))
-;;         (and (window-splittable-p window t)
-;;              ;; Split window horizontally.
-;;              (with-selected-window window
-;;                (split-window-right)))
-;;         (and (eq window (frame-root-window (window-frame window)))
-;;              (not (window-minibuffer-p window))
-;;              ;; If WINDOW is the only window on its frame and is not the
-;;              ;; minibuffer window, try to split it vertically disregarding
-;;              ;; the value of `split-height-threshold'.
-;;              (let ((split-height-threshold 0))
-;;                (when (window-splittable-p window)
-;;                  (with-selected-window window
-;;                    (split-window-below))))))))
-
-(use-package! lsp-mode
-  :after (:any haskell-mode)
-  :config
-  (setq lsp-response-timeout 60)
-  :hook
-  (haskell-mode . lsp-mode))
-
-(use-package! lsp-ui
-  :after lsp-mode
-  :config
-  (defun +grfn/lsp-ui-doc-frame-hook (frame window)
-    (set-frame-font (if doom-big-font-mode doom-big-font doom-font)
-                    nil (list frame)))
-  (setq lsp-ui-flycheck-enable t
-        lsp-ui-doc-header nil
-        lsp-ui-doc-position 'top
-        lsp-ui-doc-alignment 'window
-        lsp-ui-doc-frame-hook '+grfn/lsp-ui-doc-frame-hook
-        lsp-ui-doc-max-width 150
-        lsp-ui-doc-max-height 13)
-  (setq imenu-auto-rescan t)
-  (set-face-background 'lsp-ui-doc-background +solarized-s-base2)
-  (set-face-background 'lsp-face-highlight-read +solarized-s-base2)
-  (set-face-background 'lsp-face-highlight-write +solarized-s-base2)
-  :hook
-  (lsp-mode . lsp-ui-mode)
-  (lsp-ui-mode . flycheck-mode))
-
-(use-package! company-lsp
-  :after (lsp-mode lsp-ui)
-  :config
-  (add-to-list #'company-backends #'company-lsp)
-  (setq company-lsp-async t))
-
-(defun +grfn/haskell-mode-setup ()
-  (interactive)
-  (flymake-mode -1)
-  (add-to-list 'flycheck-disabled-checkers 'haskell-ghc)
-
-  (flycheck-remove-next-checker 'lsp 'haskell-ghc)
-  (flycheck-add-next-checker 'lsp '(warning . haskell-hlint))
-
-  ;; If there’s a 'hie.sh' defined locally by a project
-  ;; (e.g. to run HIE in a nix-shell), use it…
-  (when-let ((project-dir (locate-dominating-file default-directory "hie.sh")))
-    (cl-flet
-        ((which (cmd)
-                (s-trim
-                 (shell-command-to-string
-                  (concat
-                   "nix-shell "
-                   (expand-file-name "shell.nix" project-dir)
-                   " --run \"which " cmd "\" 2>/dev/null")))))
-      (setq-local
-       lsp-haskell-process-path-hie (expand-file-name "hie.sh" project-dir)
-       haskell-hoogle-command (which "hoogle"))))
-  ;; … and only then setup the LSP.
-  (lsp))
-
-(defun never-flymake-mode (orig &rest args)
-  (when (and (bound-and-true-p flymake-mode))
-    (funcall orig 0)
-    (message "disabled flymake-mode")))
-(advice-add #'flymake-mode :around #'never-flymake-mode)
-
-(defun +grfn/wrap-lsp-haskell-process (argv)
-  (let* ((project-dir (locate-dominating-file
-                       (buffer-file-name)
-                       "hie.yaml"))
-         (shell-dot-nix (expand-file-name "shell.nix" project-dir)))
-    ;; (when (string-equal default-directory "/home/grfn/code/depot")
-    ;;   (debug))
-    (message "%s %s %s %s"
-             (buffer-file-name)
-             default-directory
-             project-dir
-             shell-dot-nix)
-    (if (file-exists-p shell-dot-nix)
-        `("bash" "-c"
-          ,(format "cd %s && nix-shell %s --run '%s'"
-                   project-dir
-                   shell-dot-nix
-                   (s-join " " argv)))
-      argv)))
-
-(use-package! lsp-haskell
-  :after (lsp-mode lsp-ui haskell-mode)
-  ;; :hook
-  ;; (haskell-mode . lsp-haskell-enable)
-  :config
-  (setq lsp-haskell-process-path-hie "haskell-language-server-wrapper"
-        lsp-haskell-process-args-hie
-        '("-d" "-l" "/tmp/hie.log" "+RTS" "-M4G" "-H1G" "-K4G" "-A16M" "-RTS")
-        lsp-haskell-process-wrapper-function
-        #'+grfn/wrap-lsp-haskell-process)
-  (add-hook 'haskell-mode-hook #'+grfn/haskell-mode-setup 't))
-
-(use-package! lsp-imenu
-  :after (lsp-mode lsp-ui)
-  :hook
-  (lsp-after-open . lsp-enable-imenu))
-
-;; (use-package! counsel-etags
-;;   :ensure t
-;;   :init
-;;   (add-hook 'haskell-mode-hook
-;;             (lambda ()
-;;               (add-hook 'after-save-hook
-;;                         'counsel-etags-virtual-update-tags 'append 'local)))
-;;   :config
-;;   (setq counsel-etags-update-interval 60)
-;;   ;; (push "build" counsel-etags-ignore-directories)
-;;   )
-
-;; (use-package! evil-magit
-;;   :after (magit))
-
-(use-package! writeroom-mode)
-
-(use-package! graphql-mode)
-
-
-(require 'whitespace)
-(setq whitespace-style '(face lines-tail))
-(global-whitespace-mode t)
-(add-hook 'org-mode-hook (lambda ()  (whitespace-mode -1)) t)
-
-(set-face-foreground 'whitespace-line +solarized-red)
-(set-face-attribute 'whitespace-line nil :underline 't)
-
-;; (set-face-background 'ivy-posframe +solarized-s-base3)
-;; (set-face-foreground 'ivy-posframe +solarized-s-base01)
-
-(let ((base03    "#002b36")
-      (base02    "#073642")
-      (base01    "#586e75")
-      (base00    "#657b83")
-      (base0     "#839496")
-      (base1     "#93a1a1")
-      (base2     "#eee8d5")
-      (base3     "#fdf6e3")
-      (yellow    "#b58900")
-      (orange    "#cb4b16")
-      (red       "#dc322f")
-      (magenta   "#d33682")
-      (violet    "#6c71c4")
-      (blue      "#268bd2")
-      (cyan      "#2aa198")
-      (green     "#859900"))
-  (custom-set-faces
-   `(agda2-highlight-keyword-face ((t (:foreground ,green))))
-   `(agda2-highlight-string-face ((t (:foreground ,cyan))))
-   `(agda2-highlight-number-face ((t (:foreground ,violet))))
-   `(agda2-highlight-symbol-face ((((background ,base3)) (:foreground ,base01))))
-   `(agda2-highlight-primitive-type-face ((t (:foreground ,blue))))
-   `(agda2-highlight-bound-variable-face ((t nil)))
-   `(agda2-highlight-inductive-constructor-face ((t (:foreground ,green))))
-   `(agda2-highlight-coinductive-constructor-face ((t (:foreground ,yellow))))
-   `(agda2-highlight-datatype-face ((t (:foreground ,blue))))
-   `(agda2-highlight-field-face ((t (:foreground ,red))))
-   `(agda2-highlight-function-face ((t (:foreground ,blue))))
-   `(agda2-highlight-module-face ((t (:foreground ,yellow))))
-   `(agda2-highlight-postulate-face ((t (:foreground ,blue))))
-   `(agda2-highlight-primitive-face ((t (:foreground ,blue))))
-   `(agda2-highlight-record-face ((t (:foreground ,blue))))
-   `(agda2-highlight-dotted-face ((t nil)))
-   `(agda2-highlight-operator-face ((t nil)))
-   `(agda2-highlight-error-face ((t (:foreground ,red :underline t))))
-   `(agda2-highlight-unsolved-meta-face ((t (:background ,base2))))
-   `(agda2-highlight-unsolved-constraint-face ((t (:background ,base2))))
-   `(agda2-highlight-termination-problem-face ((t (:background ,orange :foreground ,base03))))
-   `(agda2-highlight-incomplete-pattern-face ((t (:background ,orange :foreground ,base03))))
-   `(agda2-highlight-typechecks-face ((t (:background ,cyan :foreground ,base03))))))
-
-
-(after! cider
-  (setq cider-prompt-for-symbol nil
-        cider-font-lock-dynamically 't
-        cider-save-file-on-load 't)
-  )
-
-(comment
- (setq elt (+org-clocked-in-element))
-
- (eq 'headline (car elt))
- (plist-get (cadr elt) :raw-value)
- )
-
-(defun +org-headline-title (headline)
-  (when (eq 'headline (car elt))
-    (plist-get (cadr elt) :raw-value)))
-
-;; (setq +ligatures-extra-symbols
-;;       (append +ligatures-extra-symbols
-;;               '(:equal     "≡"
-;;                 :not-equal "≠"
-;;                 :is        "≣"
-;;                 :isnt      "≢"
-;;                 :lte       "≤"
-;;                 :gte       "≥"
-;;                 :subseteq  "⊆"
-;;                 )))
-
-;; (after! python
-;;   (set-pretty-symbols! 'python-mode :merge t
-;;     :equal      "=="
-;;     :not-equal "!="
-;;     :lte "<="
-;;     :gte ">="
-;;     :is  "is"
-;;     :isnt "is not"
-;;     :subseteq "issubset"
-
-;;     ;; doom builtins
-
-;;     ;; Functional
-;;     :def "def"
-;;     :lambda "lambda"
-;;     ;; Types
-;;     :null "None"
-;;     :true "True" :false "False"
-;;     :int "int" :str "str"
-;;     :float "float"
-;;     :bool "bool"
-;;     :tuple "tuple"
-;;     ;; Flow
-;;     :not "not"
-;;     :in "in" :not-in "not in"
-;;     :and "and" :or "or"
-;;     :for "for"
-;;     :return "return" :yield "yield"))
-
-(use-package! sqlup-mode
-  :hook
-  (sql-mode-hook . sqlup-mode)
-  (sql-interactive-mode-hook . sqlup-mode))
-
-(use-package! emacsql)
-(use-package! emacsql-psql
-  :after (emacsql))
-
-(use-package! pyimport
-  :after (python))
-
-(use-package! blacken
-  :after (python)
-  :init
-  (add-hook #'python-mode-hook #'blacken-mode)
-  :config
-  (setq blacken-only-if-project-is-blackened t
-        blacken-allow-py36 t
-        blacken-line-length 100))
-
-(after! python
-  (defun +python-setup ()
-    (setq-local fill-column 100
-                whitespace-line-column 100
-                flycheck-disabled-checkers '(python-flake8)
-                flycheck-checker 'python-pylint))
-
-  (add-hook #'python-mode-hook #'+python-setup)
-  (add-hook #'python-mode-hook #'lsp)
-  (remove-hook #'python-mode-hook #'pipenv-mode))
-
-; (use-package! w3m
-;   :config
-;   (setq browse-url-browser-function
-;         `(("^https://app.clubhouse.io.*" . browse-url-firefox)
-;           ("^https://github.com.*" . browse-url-firefox)
-;           (".*" . browse-url-firefox))))
-
-(use-package! ob-http
-  :config
-  (add-to-list 'org-babel-load-languages '(http . t)))
-
-;; (use-package! ob-ipython
-;;   :after (pyimport)
-;;   :config
-;;   (add-to-list 'org-babel-load-languages '(ipython . t))
-;;   (setq ob-ipython-command
-        ;; "/home/griffin/code/urb/ciml-video-classifier/bin/jupyter"))
-
-(use-package! counsel-spotify)
-
-(after! counsel
-  (map! [remap counsel-org-capture] #'org-capture
-        [remap org-capture] #'org-capture))
-
-(remove-hook 'doom-first-input-hook #'evil-snipe-mode)
-
-(use-package! rainbow-mode)
-
-(use-package! org-alert
-  :disabled t
-  :config
-  (org-alert-enable)
-  (setq alert-default-style 'libnotify
-        org-alert-headline-title "org"))
-
-(use-package! ob-async)
-
-(use-package! org-recent-headings
-  :config
-  (map! :n "SPC n r" #'org-recent-headings-ivy))
-
-(use-package! org-sticky-header
-  :after (org)
-  :hook (org-mode-hook . org-sticky-header-mode)
-  :config
-  (setq-default org-sticky-header-heading-star "●"))
-
-(enable-theme 'grfn-solarized-light)
-
-;;; this needs to be *after the theme*, or else I get no agenda items.
-;;; whuuu??
-(load! "org-config")
-
-
-;;; word-char
-(add-hook! prog-mode
-  (modify-syntax-entry ?_ "w"))
-
-(add-hook! lisp-mode
-  (modify-syntax-entry ?- "w"))
-
-(after! flycheck
-  (put 'flycheck-python-pylint-executable 'safe-local-variable (lambda (_) t))
-  (setq flycheck-error-list-minimum-level 'warn
-        flycheck-navigation-minimum-level 'warn))
-
-(defvar alembic-command "alembic"
-  "Command to execute when running alembic")
-
-(defvar alembic-dir-fun (lambda () default-directory)
-  "Reference to a function whose return value will be used as the directory to
-  run Alembic in")
-
-(put 'alembic-command 'safe-local-variable (lambda (_) t))
-(put 'alembic-dir-fun 'safe-local-variable (lambda (_) t))
-
-(defun make-alembic-command (args)
-  (if (functionp alembic-command)
-      (funcall alembic-command args)
-    (concat alembic-command " " args)))
-
-(defun +grfn/extract-alembic-migration-name (output)
-  (unless (string-match (rx (0+ anything) "Generating "
-                            (group (one-or-more (not (syntax whitespace))))
-                            " ..." (one-or-more (syntax whitespace)) "done"
-                            (0+ anything))
-                        output)
-    (user-error "Error: %s" output))
-  (match-string-no-properties 1 output))
-
-(defun -run-alembic (args)
-  (let* ((default-directory (funcall alembic-dir-fun))
-         (command (make-alembic-command args))
-         ;; (format "nix-shell --run 'alembic %s'" args)
-         ;; (format "%s %s" alembic-command args)
-         (res
-          (with-temp-buffer
-            (cons
-             (shell-command command t)
-             (s-replace-regexp
-              "^.*Nix search path entry.*$" ""
-              (buffer-string)))))
-         (exit-code (car res))
-         (out (cdr res)))
-    ;; (if (= 0 exit-code)
-    ;;     out
-    ;;   (error "Error running %s: %s" command out))
-    out
-    ))
-
-(comment
- --exit-code
- --bs
- )
-
-(defun run-alembic (args)
-  (interactive "sAlembic command: ")
-  (message "%s" (-run-alembic args)))
-
-(defun generate-alembic-migration (msg &rest args)
-  (interactive "sMessage: ")
-  (->
-   (format "revision %s -m \"%s\""
-           (s-join " " args)
-           msg)
-   (-run-alembic)
-   (+grfn/extract-alembic-migration-name)
-   (find-file-other-window)))
-
-(cl-defun alembic-upgrade (&optional revision &key namespace)
-  (interactive "sRevision: ")
-  (let ((default-directory (funcall alembic-dir-fun)))
-    (run-alembic (format "%s upgrade %s"
-                         (if namespace (concat "-n " namespace) "")
-                         (or revision "head")))))
-
-(defun alembic-downgrade (revision)
-  (interactive "sRevision: ")
-  (let ((default-directory (funcall alembic-dir-fun)))
-    (run-alembic (format "downgrade %s" (or revision "head")))))
-
-(use-package! gnuplot)
-(use-package! gnuplot-mode :after gnuplot)
-(use-package! string-inflection)
-
-(after! anaconda-mode
-  ;; (set-company-backend! 'anaconda-mode #'company-yasnippet)
-  )
-
-;; (add-hook! python-mode
-;;   (capf))
-
-(cl-defstruct pull-request url number title author repository)
-
-(defun grfn/num-inbox-items ()
-  (length (org-elements-agenda-match "inbox" t)))
-
-(use-package! dhall-mode
-  :mode "\\.dhall\\'")
-
-(use-package! github-review
-  :after forge)
-
-(after! forge
-  (set-popup-rule!
-    "^\\*forge"
-    :size 0.75))
-
-(defun grfn/org-add-db-connection-params ()
-  (interactive)
-  (ivy-read
-   "DB to connect to: "
-   (-map (lambda (opts)
-           (propertize (symbol-name (car opts))
-                       'header-args (cdr opts)))
-         db-connection-param-options)
-   :require-match t
-   :action
-   (lambda (opt)
-     (let ((header-args (get-text-property 0 'header-args opt)))
-       (org-set-property "header-args" header-args)))))
-
-(use-package! kubernetes
-  :commands (kubernetes-overview))
-
-(use-package! k8s-mode
-  :hook (k8s-mode . yas-minor-mode))
-
-(use-package! sx)
-
-;; (use-package! nix-update
-;;   :config
-;;   (map! (:map nix-mode-map
-;;           (:leader
-;;             :desc "Update fetcher" :nv #'nix-update-fetch))))
-
-
-(after! lsp-haskell
-  (lsp-register-client
-   (make-lsp--client
-    :new-connection (lsp-stdio-connection (lambda () (lsp-haskell--hie-command)))
-    :major-modes '(haskell-mode)
-    :server-id 'hie
-    ;; :multi-root t
-    ;; :initialization-options 'lsp-haskell--make-init-options
-    )
-   )
-  )
-
-(solaire-global-mode -1)
-
-(use-package! wsd-mode)
-
-(use-package! metal-mercury-mode)
-(use-package! flycheck-mercury
-  :after (metal-mercury-mode flycheck-mercury))
-
-(use-package! direnv
-  :config (direnv-mode))
-
-(after! erc
-  ;; (setq erc-autojoin-channels-alist '(("freenode.net" "#nixos" "#haskell" "##tvl")))
-  )
-
-(defun evil-disable-insert-state-bindings ()
-  evil-disable-insert-state-bindings)
-
-;; (use-package! terraform-mode)
-;; (use-package! company-terraform
-;;   :after terraform-mode
-;;   :config (company-terraform-init))
-
-(use-package! znc
-  :config
-  (setq znc-servers
-        '(("znc.gws.fyi" 5000 t
-           ((freenode "glittershark" "Ompquy"))))))
-
-(use-package! jsonnet-mode
-  :config
-  (map!
-   (:map jsonnet-mode-map
-    (:n "g SPC" #'jsonnet-eval-buffer))))
-
-(add-to-list 'safe-local-variable-values
-             '(truncate-lines . t))
-
-(set-popup-rule!
-  "^\\*gud-"
-  :quit nil)
-
-(setq elcord-editor-icon "emacs_icon")
-
-;;; ocaml
-
-(after! merlin-mode
-  (set-face-attribute
-   'caml-types-expr-face
-   nil
-   :background +solarized-s-base2)
-  (add-hook! merlin-mode
-     (setq whitespace-line-column 90)))
-
-(use-package! dune-format
-  :hook (dune-mode . dune-format-on-save-mode))
diff --git a/users/grfn/emacs.d/cpp.el b/users/grfn/emacs.d/cpp.el
deleted file mode 100644
index 5b5dc8ead652..000000000000
--- a/users/grfn/emacs.d/cpp.el
+++ /dev/null
@@ -1,39 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-
-(load! "google-c-style")
-
-(after! flycheck
-  (add-to-list 'flycheck-disabled-checkers 'c/c++-gcc)
-  (add-to-list 'flycheck-disabled-checkers 'c/c++-clang))
-
-(defun +grfn/cpp-setup ()
-  (when (s-starts-with?
-         "/home/grfn/code/depot/third_party/nix"
-         (buffer-file-name))
-    (setq lsp-clients-clangd-executable "/home/grfn/code/depot/users/grfn/emacs.d/nix-clangd.sh"
-          lsp-clients-clangd-args nil)
-    (google-set-c-style)
-    (lsp)
-    (add-to-list 'flycheck-disabled-checkers 'c/c++-gcc)
-    (add-to-list 'flycheck-disabled-checkers 'c/c++-clang)))
-
-(add-hook 'c++-mode-hook #'+grfn/cpp-setup)
-
-(use-package! protobuf-mode)
-
-(use-package! clang-format+
-  :config
-  (add-hook 'c-mode-common-hook #'clang-format+-mode))
-
-(map!
- (:map c++-mode-map
-  :leader
-  (:n "/ i" #'counsel-semantic-or-imenu)))
-
-(comment
- (setq
-  lsp-clients-clangd-executable
-  "/home/grfn/code/depot/third_party/nix/clangd.sh"
-  lsp-clients-clangd-args nil)
- )
diff --git a/users/grfn/emacs.d/email.el b/users/grfn/emacs.d/email.el
deleted file mode 100644
index 70360d00727c..000000000000
--- a/users/grfn/emacs.d/email.el
+++ /dev/null
@@ -1,53 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(after! notmuch
-  (setq notmuch-saved-searches
-        '((:name "inbox" :query "tag:inbox tag:important not tag:trash" :key "i")
-          (:name "flagged" :query "tag:flagged" :key "f")
-          (:name "sent" :query "tag:sent" :key "s")
-          (:name "drafts" :query "tag:draft" :key "d")
-
-          (:name "work" :query "tag:inbox and tag:important and path:work/**"
-                 :key "w")
-          (:name "personal" :query "tag:inbox and tag:important and path:personal/**"
-                 :key "p"))
-        message-send-mail-function 'message-send-mail-with-sendmail
-        message-sendmail-f-is-evil 't
-        message-sendmail-envelope-from 'header
-        message-sendmail-extra-arguments '("--read-envelope-from"))
-
-  (add-hook! notmuch-message-mode-hook #'notmuch-company-setup))
-
-(setq notmuch-saved-searches
-        '((:name "inbox" :query "tag:inbox tag:important not tag:trash" :key "i")
-          (:name "flagged" :query "tag:flagged" :key "f")
-          (:name "sent" :query "tag:sent" :key "s")
-          (:name "drafts" :query "tag:draft" :key "d")
-
-          (:name "work" :query "tag:inbox and tag:important and path:work/**"
-                 :key "w")
-          (:name "personal" :query "tag:inbox and tag:important and path:personal/**"
-                 :key "p"))
-        message-send-mail-function 'message-send-mail-with-sendmail
-        message-sendmail-f-is-evil 't
-        message-sendmail-envelope-from 'header
-        message-sendmail-extra-arguments '("--read-envelope-from"))
-
-(set-popup-rule! "^\\*notmuch-saved-search-"
-  :ignore t)
-
-(set-popup-rule! (lambda (_ action)
-                   (eq (car action)
-                       'display-buffer-same-window))
-  :ignore t)
-
-(defun apply-thread-patchset (repo branch)
-  (interactive "Dgit repo: \nsnew branch name: ")
-  (let ((tid notmuch-show-thread-id)
-        (tmp "/tmp/notmuch-patchset"))
-    (shell-command (format "notmuch-extract-patch %s > %s && ( cd %s && git checkout -b %s && git am %s )"
-                           (shell-quote-argument tid)
-                           (shell-quote-argument tmp)
-                           (shell-quote-argument (expand-file-name repo))
-                           (shell-quote-argument branch)
-                           (shell-quote-argument tmp)))))
diff --git a/users/grfn/emacs.d/github-org.el b/users/grfn/emacs.d/github-org.el
deleted file mode 100644
index f4f9d2e37069..000000000000
--- a/users/grfn/emacs.d/github-org.el
+++ /dev/null
@@ -1,99 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(require 'ghub)
-
-(defun grfn/alist->plist (alist)
-  (->> alist
-       (-mapcat (lambda (pair)
-                  (list (intern (concat ":" (symbol-name (car pair))))
-                        (cdr pair))))))
-
-;;;
-
-(cl-defstruct pull-request url number title author repository)
-
-(defun grfn/query-pulls (query)
-  (let ((resp (ghub-graphql "query reviewRequests($query: String!) {
-    reviewRequests: search(
-      type:ISSUE,
-      query: $query,
-      first: 100
-    ) {
-      issueCount
-      nodes {
-        ... on PullRequest {
-          url
-          number
-          title
-          author {
-            login
-            ... on User { name }
-          }
-          repository {
-            name
-            owner { login }
-          }
-        }
-      }
-    }
-  }" `((query . ,query)))))
-    (->> resp
-         (alist-get 'data)
-         (alist-get 'reviewRequests)
-         (alist-get 'nodes)
-         (-map
-          (lambda (pr)
-            (apply
-             #'make-pull-request
-             (grfn/alist->plist pr)))))))
-
-(defun grfn/requested-changes ())
-
-(defun grfn/pull-request->org-headline (format-string level pr)
-  (check-type format-string string)
-  (check-type level integer)
-  (check-type pr pull-request)
-  (s-format (concat (make-string level ?*) " " format-string)
-            'aget
-            `((author . ,(or (->> pr (pull-request-author) (alist-get 'name))
-                             "no author"))
-              (owner . ,(->> pr (pull-request-repository)
-                             (alist-get 'owner)
-                             (alist-get 'login)))
-              (repo . ,(->> pr (pull-request-repository) (alist-get 'name)))
-              (pr-link . ,(org-make-link-string
-                           (pull-request-url pr)
-                           (pull-request-title pr)))
-              (today . ,(format-time-string "%Y-%m-%d %a")))))
-
-(defun grfn/org-headlines-from-review-requests (level)
-  "Create org-mode headlines at LEVEL from all review-requested PRs on Github"
-  (interactive "*nLevel: ")
-  (let* ((prs (grfn/query-pulls
-               "is:open is:pr review-requested:glittershark archived:false"))
-         (text (mapconcat
-                (apply-partially
-                 #'grfn/pull-request->org-headline
-                 "TODO Review ${author}'s PR on ${owner}/${repo}: ${pr-link} :pr:
-SCHEDULED: <${today}>"
-                 level) prs "\n")))
-    (save-mark-and-excursion
-      (insert text))
-    (org-align-tags 't)))
-
-(defun grfn/org-headlines-from-requested-changes (level)
-  "Create org-mode headlines at LEVEL from all PRs with changes requested
- on Github"
-  (interactive "*nLevel: ")
-  (let* ((prs (grfn/query-pulls
-               (concat "is:pr is:open author:glittershark archived:false "
-                       "sort:updated-desc review:changes-requested")))
-         (text (mapconcat
-                (apply-partially
-                 #'grfn/pull-request->org-headline
-                 "TODO Address review comments on ${pr-link} :pr:
-SCHEDULED: <${today}>"
-                 level) prs "\n")))
-    (save-mark-and-excursion
-      (insert text))
-    (org-align-tags 't)))
diff --git a/users/grfn/emacs.d/google-c-style.el b/users/grfn/emacs.d/google-c-style.el
deleted file mode 100644
index 9bb12c61aae4..000000000000
--- a/users/grfn/emacs.d/google-c-style.el
+++ /dev/null
@@ -1,151 +0,0 @@
-;;; google-c-style.el --- Google's C/C++ style for c-mode
-
-;; Keywords: c, tools
-
-;; google-c-style.el is Copyright (C) 2008 Google Inc. All Rights Reserved.
-;;
-;; It is free software; you can redistribute it and/or modify it under the
-;; terms of either:
-;;
-;; a) the GNU General Public License as published by the Free Software
-;; Foundation; either version 1, or (at your option) any later version, or
-;;
-;; b) the "Artistic License".
-
-;;; Commentary:
-
-;; Provides the google C/C++ coding style. You may wish to add
-;; `google-set-c-style' to your `c-mode-common-hook' after requiring this
-;; file. For example:
-;;
-;;    (add-hook 'c-mode-common-hook 'google-set-c-style)
-;;
-;; If you want the RETURN key to go to the next line and space over
-;; to the right place, add this to your .emacs right after the load-file:
-;;
-;;    (add-hook 'c-mode-common-hook 'google-make-newline-indent)
-
-;;; Code:
-
-;; For some reason 1) c-backward-syntactic-ws is a macro and 2)  under Emacs 22
-;; bytecode cannot call (unexpanded) macros at run time:
-(eval-when-compile (require 'cc-defs))
-
-;; Wrapper function needed for Emacs 21 and XEmacs (Emacs 22 offers the more
-;; elegant solution of composing a list of lineup functions or quantities with
-;; operators such as "add")
-(defun google-c-lineup-expression-plus-4 (langelem)
-  "Indents to the beginning of the current C expression plus 4 spaces.
-
-This implements title \"Function Declarations and Definitions\"
-of the Google C++ Style Guide for the case where the previous
-line ends with an open parenthese.
-
-\"Current C expression\", as per the Google Style Guide and as
-clarified by subsequent discussions, means the whole expression
-regardless of the number of nested parentheses, but excluding
-non-expression material such as \"if(\" and \"for(\" control
-structures.
-
-Suitable for inclusion in `c-offsets-alist'."
-  (save-excursion
-    (back-to-indentation)
-    ;; Go to beginning of *previous* line:
-    (c-backward-syntactic-ws)
-    (back-to-indentation)
-    (cond
-     ;; We are making a reasonable assumption that if there is a control
-     ;; structure to indent past, it has to be at the beginning of the line.
-     ((looking-at "\\(\\(if\\|for\\|while\\)\\s *(\\)")
-      (goto-char (match-end 1)))
-     ;; For constructor initializer lists, the reference point for line-up is
-     ;; the token after the initial colon.
-     ((looking-at ":\\s *")
-      (goto-char (match-end 0))))
-    (vector (+ 4 (current-column)))))
-
-;;;###autoload
-(defconst google-c-style
-  `((c-recognize-knr-p . nil)
-    (c-enable-xemacs-performance-kludge-p . t) ; speed up indentation in XEmacs
-    (c-basic-offset . 2)
-    (indent-tabs-mode . nil)
-    (c-comment-only-line-offset . 0)
-    (c-hanging-braces-alist . ((defun-open after)
-                               (defun-close before after)
-                               (class-open after)
-                               (class-close before after)
-                               (inexpr-class-open after)
-                               (inexpr-class-close before)
-                               (namespace-open after)
-                               (inline-open after)
-                               (inline-close before after)
-                               (block-open after)
-                               (block-close . c-snug-do-while)
-                               (extern-lang-open after)
-                               (extern-lang-close after)
-                               (statement-case-open after)
-                               (substatement-open after)))
-    (c-hanging-colons-alist . ((case-label)
-                               (label after)
-                               (access-label after)
-                               (member-init-intro before)
-                               (inher-intro)))
-    (c-hanging-semi&comma-criteria
-     . (c-semi&comma-no-newlines-for-oneline-inliners
-        c-semi&comma-inside-parenlist
-        c-semi&comma-no-newlines-before-nonblanks))
-    (c-indent-comments-syntactically-p . t)
-    (comment-column . 40)
-    (c-indent-comment-alist . ((other . (space . 2))))
-    (c-cleanup-list . (brace-else-brace
-                       brace-elseif-brace
-                       brace-catch-brace
-                       empty-defun-braces
-                       defun-close-semi
-                       list-close-comma
-                       scope-operator))
-    (c-offsets-alist . ((arglist-intro google-c-lineup-expression-plus-4)
-                        (func-decl-cont . ++)
-                        (member-init-intro . ++)
-                        (inher-intro . ++)
-                        (comment-intro . 0)
-                        (arglist-close . c-lineup-arglist)
-                        (topmost-intro . 0)
-                        (block-open . 0)
-                        (inline-open . 0)
-                        (substatement-open . 0)
-                        (statement-cont
-                         .
-                         (,(when (fboundp 'c-no-indent-after-java-annotations)
-                             'c-no-indent-after-java-annotations)
-                          ,(when (fboundp 'c-lineup-assignments)
-                             'c-lineup-assignments)
-                          ++))
-                        (label . /)
-                        (case-label . +)
-                        (statement-case-open . +)
-                        (statement-case-intro . +) ; case w/o {
-                        (access-label . /)
-                        (innamespace . 0))))
-  "Google C/C++ Programming Style.")
-
-;;;###autoload
-(defun google-set-c-style ()
-  "Set the current buffer's c-style to Google C/C++ Programming
-  Style. Meant to be added to `c-mode-common-hook'."
-  (interactive)
-  (make-local-variable 'c-tab-always-indent)
-  (setq c-tab-always-indent t)
-  (c-add-style "Google" google-c-style t))
-
-;;;###autoload
-(defun google-make-newline-indent ()
-  "Sets up preferred newline behavior. Not set by default. Meant
-  to be added to `c-mode-common-hook'."
-  (interactive)
-  (define-key c-mode-base-map "\C-m" 'newline-and-indent)
-  (define-key c-mode-base-map [ret] 'newline-and-indent))
-
-(provide 'google-c-style)
-;;; google-c-style.el ends here
diff --git a/users/grfn/emacs.d/grid.el b/users/grfn/emacs.d/grid.el
deleted file mode 100644
index 75776a38cd9d..000000000000
--- a/users/grfn/emacs.d/grid.el
+++ /dev/null
@@ -1,128 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(require 's)
-
-(defun grfn/all-match-groups (s)
-  (loop for n from 1
-        for x = (match-string n s)
-        while x
-        collect x))
-
-(defun projectile-grid-ff (path &optional ask)
-  "Call `find-file' function on PATH when it is not nil and the file exists.
-If file does not exist and ASK in not nil it will ask user to proceed."
-  (if (or (and path (file-exists-p path))
-          (and ask (yes-or-no-p
-                    (s-lex-format
-                     "File does not exists. Create a new buffer ${path} ?"))))
-      (find-file path)))
-
-(defun projectile-grid-goto-file (filepath &optional ask)
-  "Find FILEPATH after expanding root.  ASK is passed straight to `projectile-grid-ff'."
-  (projectile-grid-ff (projectile-expand-root filepath) ask))
-
-(defun projectile-grid-choices (ds)
-  "Uses `projectile-dir-files' function to find files in directories.
-The DIRS is list of lists consisting of a directory path and regexp to filter files from that directory.
-Optional third element can be present in the DS list. The third element will be a prefix to be placed before
-the filename in the resulting choice.
-Returns a hash table with keys being short names (choices) and values being relative paths to the files."
-  (loop with hash = (make-hash-table :test 'equal)
-        for (dir re prefix) in ds do
-        (loop for file in (projectile-dir-files (projectile-expand-root dir)) do
-              (when (string-match re file)
-                (puthash
-                 (concat (or prefix "")
-                         (s-join "/" (grfn/all-match-groups file)))
-                 (concat dir file)
-                 hash)))
-        finally return hash))
-
-(defmacro projectile-grid-find-resource (prompt dirs &optional newfile-template)
-  "Presents files from DIRS with PROMPT to the user using `projectile-completing-read'.
-If users chooses a non existant file and NEWFILE-TEMPLATE is not nil
-it will use that variable to interpolate the name for the new file.
-NEWFILE-TEMPLATE will be the argument for `s-lex-format'.
-The bound variable is \"filename\"."
-  `(lexical-let ((choices (projectile-grid-choices ,dirs)))
-     (projectile-completing-read
-      ,prompt
-      (hash-table-keys choices)
-      :action
-      (lambda (c)
-        (let* ((filepath (gethash c choices))
-               (filename c)) ;; so `s-lex-format' can interpolate FILENAME
-          (if filepath
-              (projectile-grid-goto-file filepath)
-            (when-let ((newfile-template ,newfile-template))
-              (projectile-grid-goto-file
-               (funcall newfile-template filepath)
-               ;; (cond
-               ;;  ((functionp newfile-template) (funcall newfile-template filepath))
-               ;;  ((stringp newfile-template) (s-lex-format newfile-template)))
-               t))))))))
-
-(defun projectile-grid-find-model ()
-  "Find a model."
-  (interactive)
-  (projectile-grid-find-resource
-   "model: "
-   '(("python/urbint_lib/models/"
-      "\\(.+\\)\\.py$")
-     ("python/urbint_lib/"
-      "\\(.+\\)/models/\\(.+\\).py$"))
-   (lambda (filename)
-     (pcase (s-split "/" filename)
-       (`(,model)
-        (s-lex-format "python/urbint_lib/models/${model}.py"))
-       (`(,app ,model)
-        (s-lex-format "python/urbint_lib/${app}/models/${model}.py"))))))
-
-(defun projectile-grid-find-repository ()
-  "Find a repository."
-  (interactive)
-  (projectile-grid-find-resource
-   "repository: "
-   '(("python/urbint_lib/repositories/"
-      "\\(.+\\)\\.py$")
-     ("python/urbint_lib/"
-      "\\(.+\\)/repositories/\\(.+\\).py$"))
-   (lambda (filename)
-     (pcase (s-split "/" filename)
-       (`(,repository)
-        (s-lex-format "python/urbint_lib/repositories/${repository}.py"))
-       (`(,app ,repository)
-        (s-lex-format "python/urbint_lib/${app}/repositories/${repository}.py"))))))
-
-(defun projectile-grid-find-controller ()
-  "Find a controller."
-  (interactive)
-  (projectile-grid-find-resource
-   "controller: "
-   '(("backend/src/grid/api/controllers/"
-      "\\(.+\\)\\.py$")
-     ("backend/src/grid/api/apps/"
-      "\\(.+\\)/controllers/\\(.+\\).py$"))
-   (lambda (filename)
-     (pcase (s-split "/" filename)
-       (`(,controller)
-        (s-lex-format "backend/src/grid/api/controllers/${controller}.py"))
-       (`(,app ,controller)
-        (s-lex-format "backend/src/grid/api/apps/${app}/controllers/${controller}.py"))))))
-
-(setq projectile-grid-mode-map
-  (let ((map (make-keymap)))
-    (map!
-     (:map map
-      (:leader
-       (:desc "Edit..." :prefix "e"
-        :desc "Model"      :n "m" #'projectile-grid-find-model
-        :desc "Controller" :n "c" #'projectile-grid-find-controller
-        :desc "Repository" :n "r" #'projectile-grid-find-repository))))
-    map))
-
-(define-minor-mode projectile-grid-mode
-  "Minor mode for finding files in GRID"
-  :init-value nil
-  :lighter " GRID"
-  :keymap projectile-grid-mode-map)
diff --git a/users/grfn/emacs.d/init.el b/users/grfn/emacs.d/init.el
deleted file mode 100644
index 46530ab950a0..000000000000
--- a/users/grfn/emacs.d/init.el
+++ /dev/null
@@ -1,175 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(defvar native-comp-deferred-compilation-deny-list nil)
-
-(doom! :completion
-       company           ; the ultimate code completion backend
-       (ivy +fuzzy
-            +prescient)               ; a search engine for love and life
-
-       :ui
-       ;;deft              ; notational velocity for Emacs
-       doom              ; what makes DOOM look the way it does
-       ;doom-dashboard    ; a nifty splash screen for Emacs
-       doom-quit         ; DOOM quit-message prompts when you quit Emacs
-       ;fill-column       ; a `fill-column' indicator
-       hl-todo           ; highlight TODO/FIXME/NOTE tags
-       ;;indent-guides     ; highlighted indent columns
-       modeline          ; snazzy, Atom-inspired modeline, plus API
-       nav-flash         ; blink the current line after jumping
-       ;;neotree           ; a project drawer, like NERDTree for vim
-       ophints           ; highlight the region an operation acts on
-       (popup            ; tame sudden yet inevitable temporary windows
-        +all             ; catch all popups that start with an asterix
-        +defaults)       ; default popup rules
-       ;; ligatures         ; replace bits of code with pretty symbols
-       ;; tabbar            ; FIXME an (incomplete) tab bar for Emacs
-       ;; treemacs          ; a project drawer, like neotree but cooler
-       unicode           ; extended unicode support for various languages
-       vc-gutter         ; vcs diff in the fringe
-       vi-tilde-fringe   ; fringe tildes to mark beyond EOB
-       ;;window-select     ; visually switch windows
-       workspaces        ; tab emulation, persistence & separate workspaces
-
-       :editor
-       (evil +everywhere); come to the dark side, we have cookies
-       file-templates    ; auto-snippets for empty files
-       fold              ; (nigh) universal code folding
-       ;;(format +onsave)  ; automated prettiness
-       ;;god               ; run Emacs commands without modifier keys
-       ;;lispy             ; vim for lisp, for people who dont like vim
-       ;;multiple-cursors  ; editing in many places at once
-       ;;objed             ; text object editing for the innocent
-       ;;parinfer          ; turn lisp into python, sort of
-       ;;rotate-text       ; cycle region at point between text candidates
-       snippets          ; my elves. They type so I don't have to
-       word-wrap
-
-       :emacs
-       dired             ; making dired pretty [functional]
-       electric          ; smarter, keyword-based electric-indent
-       ;;eshell            ; a consistent, cross-platform shell (WIP)
-       ;;term              ; terminals in Emacs
-       (undo +tree)
-       vc                ; version-control and Emacs, sitting in a tree
-
-       :tools
-       ;;ansible
-       ;;debugger          ; FIXME stepping through code, to help you add bugs
-       ;;direnv
-       docker
-       ;;editorconfig      ; let someone else argue about tabs vs spaces
-       ;; ein               ; tame Jupyter notebooks with emacs
-       (eval +overlay)              ; run code, run (also, repls)
-       gist              ; interacting with github gists
-       (lookup           ; helps you navigate your code and documentation
-        +docsets)        ; ...or in Dash docsets locally
-       lsp
-       ;;macos             ; MacOS-specific commands
-       magit             ; a git porcelain for Emacs
-       make              ; run make tasks from Emacs
-       pass              ; password manager for nerds
-       pdf               ; pdf enhancements
-       ;;prodigy           ; FIXME managing external services & code builders
-       ;;rgb               ; creating color strings
-       ;;terraform         ; infrastructure as code
-       ;;tmux              ; an API for interacting with tmux
-       tree-sitter       ; syntax and parsing, sitting in a tree...
-       ;;upload            ; map local to remote projects via ssh/ftp
-       ;;wakatime
-       ;;vterm             ; another terminals in Emacs
-
-       :checkers
-       syntax          ; tasing you for every semicolon you forget
-       ; spell           ; tasing you for misspelling mispelling
-
-       :lang
-       agda              ; types of types of types of types...
-       ;;assembly          ; assembly for fun or debugging
-       cc                ; C/C++/Obj-C madness
-       clojure           ; java with a lisp
-       common-lisp       ; if you've seen one lisp, you've seen them all
-       ; coq               ; proofs-as-programs
-       ;;crystal           ; ruby at the speed of c
-       ;;csharp            ; unity, .NET, and mono shenanigans
-       data              ; config/data formats
-       erlang            ; an elegant language for a more civilized age
-       elixir            ; erlang done right
-       ;;elm               ; care for a cup of TEA?
-       emacs-lisp        ; drown in parentheses
-       ;;ess               ; emacs speaks statistics
-       ;;go                ; the hipster dialect
-       ;; (haskell +intero) ; a language that's lazier than I am
-       haskell ; a language that's lazier than I am
-       ;;hy                ; readability of scheme w/ speed of python
-       ;; idris             ;
-       ;;(java +meghanada) ; the poster child for carpal tunnel syndrome
-       javascript        ; all(hope(abandon(ye(who(enter(here))))))
-       julia             ; a better, faster MATLAB
-       ;;kotlin            ; a better, slicker Java(Script)
-       latex             ; writing papers in Emacs has never been so fun
-       ;;ledger            ; an accounting system in Emacs
-       lua               ; one-based indices? one-based indices
-       markdown          ; writing docs for people to ignore
-       ;;nim               ; python + lisp at the speed of c
-       nix               ; I hereby declare "nix geht mehr!"
-       ocaml             ; an objective camel
-       (org              ; organize your plain life in plain text
-        +dragndrop       ; drag & drop files/images into org buffers
-        +attach          ; custom attachment system
-        +babel           ; running code in org
-        +capture         ; org-capture in and outside of Emacs
-        +export          ; Exporting org to whatever you want
-        ;; +habit           ; Keep track of your habits
-        +present         ; Emacs for presentations
-        +pretty
-        +brain
-        +protocol)       ; Support for org-protocol:// links
-       ;;perl              ; write code no one else can comprehend
-       ;;php               ; perl's insecure younger brother
-       ;;plantuml          ; diagrams for confusing people more
-       purescript        ; javascript, but functional
-       (python +lsp)            ; beautiful is better than ugly
-       ;;qt                ; the 'cutest' gui framework ever
-       racket            ; a DSL for DSLs
-       rest              ; Emacs as a REST client
-       ;;ruby              ; 1.step do {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"}
-       (rust +tree-sitter)              ; Fe2O3.unwrap().unwrap().unwrap().unwrap()
-       ;;scala             ; java, but good
-       (sh +fish)        ; she sells (ba|z|fi)sh shells on the C xor
-       ;;solidity          ; do you need a blockchain? No.
-       ;;swift             ; who asked for emoji variables?
-       ;;terra             ; Earth and Moon in alignment for performance.
-       ;;web               ; the tubes
-       ;;vala              ; GObjective-C
-       zig
-
-       ;; Applications are complex and opinionated modules that transform Emacs
-       ;; toward a specific purpose. They may have additional dependencies and
-       ;; should be loaded late.
-       :app
-       ;;(email +gmail)    ; emacs as an email client
-       irc               ; how neckbeards socialize
-       ;;(rss +org)        ; emacs as an RSS reader
-       twitter           ; twitter client https://twitter.com/vnought
-       ;;(write            ; emacs as a word processor (latex + org + markdown)
-       ;; +wordnut         ; wordnet (wn) search
-       ;; +langtool)       ; a proofreader (grammar/style check) for Emacs
-
-       :email
-       ;; (mu4e +gmail)
-       notmuch
-
-       :collab
-       ;;floobits          ; peer programming for a price
-       ;;impatient-mode    ; show off code over HTTP
-
-       :config
-       ;; For literate config users. This will tangle+compile a config.org
-       ;; literate config in your `doom-private-dir' whenever it changes.
-       ;;literate
-
-       ;; The default module sets reasonable defaults for Emacs. It also
-       ;; provides a Spacemacs-inspired keybinding scheme and a smartparens
-       ;; config. Use it as a reference for your own modules.
-       (default +bindings +smartparens))
diff --git a/users/grfn/emacs.d/irc.el b/users/grfn/emacs.d/irc.el
deleted file mode 100644
index 117869599d83..000000000000
--- a/users/grfn/emacs.d/irc.el
+++ /dev/null
@@ -1,131 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(require 'erc)
-(require 'alert)
-
-(defvar irc-servers
-  '("hackint"
-    "libera"))
-
-(defun irc-connect (server)
-  (interactive
-   (list (ivy-read "Server: " irc-servers)))
-  (let ((pw (s-trim (shell-command-to-string
-                     (format "pass irccloud/%s" server))))
-        (gnutls-verify-error nil))
-    (erc-tls :server "bnc.irccloud.com"
-             :port 6697
-             :nick "grfn"
-             :password (concat "bnc@"
-                               (s-trim (shell-command-to-string "hostname"))
-                               ":"
-                               pw))))
-
-
-(defgroup erc-alert nil
-  "Alert me using alert.el for important ERC messages"
-  :group 'erc)
-
-(defcustom erc-noise-regexp
-  "\\(Logging in:\\|Signing off\\|You're now away\\|Welcome back\\)"
-  "This regexp matches unwanted noise."
-  :type 'regexp
-  :group 'erc)
-
-(setq tvl-enabled? t)
-
-(defun disable-tvl-notifications ()
-  (interactive)
-  (setq tvl-enabled? nil))
-
-(defun enable-tvl-notifications ()
-  (interactive)
-  (setq tvl-enabled? t))
-
-(defun erc-alert-important-p (info)
-  (let ((message (plist-get info :message))
-        (erc-message (-> info (plist-get :data) (plist-get :message)))
-        (erc-channel (-> info (plist-get :data) (plist-get :channel))))
-    (and erc-message
-         (not (or (string-match "^\\** *Users on #" message)
-                  (string-match erc-noise-regexp
-                                message)))
-         (or (and tvl-enabled?
-                  (string-equal erc-channel "#tvl"))
-             (string-match "grfn" message)))))
-
-(comment
- last-info
- erc-noise-regexp
- (setq tvl-enabled? nil)
- )
-
-(defun my-erc-hook (&optional match-type nick message)
-  "Shows a notification, when user's nick was mentioned.
-If the buffer is currently not visible, makes it sticky."
-  (setq last-message message)
-  (if (or (null match-type) (not (eq match-type 'fool)))
-      (let (alert-log-messages)
-        (alert (or message (buffer-string))
-               :severity (if (string-match "grfn" (or message ""))
-                             'high 'low)
-               :title (or nick (buffer-name))
-               :data `(:message ,(or message (buffer-string))
-                                :channel ,(or nick (buffer-name)))))))
-
-(add-hook 'erc-text-matched-hook 'my-erc-hook)
-(add-hook 'erc-insert-modify-hook 'my-erc-hook)
-
-(defun my-erc-define-alerts (&rest ignore)
-  ;; Unless the user has recently typed in the ERC buffer, highlight the fringe
-  (alert-add-rule
-   :status   '(buried visible idle)
-   :severity '(moderate high urgent)
-   :mode     'erc-mode
-   :predicate
-   #'(lambda (info)
-       (and (not (eq (current-buffer) (plist-get info :buffer)))
-            (string-match "grfn:" (plist-get info :message))))
-   :persistent
-   #'(lambda (info)
-       ;; If the buffer is buried, or the user has been idle for
-       ;; `alert-reveal-idle-time' seconds, make this alert
-       ;; persistent.  Normally, alerts become persistent after
-       ;; `alert-persist-idle-time' seconds.
-       (memq (plist-get info :status) '(buried idle)))
-   :style 'message
-   :continue t)
-
-  (alert-add-rule
-   :status 'buried
-   :mode   'erc-mode
-   :predicate #'erc-alert-important-p
-   :style 'libnotify
-   :append t)
-
-  (alert-add-rule
-   :status 'buried
-   :mode   'erc-mode
-   :predicate #'erc-alert-important-p
-   :style 'message
-   :append t)
-
-  (alert-add-rule
-   :mode 'erc-mode
-   :predicate #'erc-alert-important-p
-   :style 'log
-   :append t)
-
-  (alert-add-rule :mode 'erc-mode :style 'ignore :append t))
-
-(add-hook 'erc-connect-pre-hook 'my-erc-define-alerts)
-
-(defun fix-irc-message (msg)
-  (let ((msg (s-trim msg)))
-    (if (string-equal msg ":q") "" msg)))
-
-(advice-add #'erc-user-input :filter-return #'fix-irc-message)
-
-(comment
- (my-erc-define-alerts)
- )
diff --git a/users/grfn/emacs.d/lisp.el b/users/grfn/emacs.d/lisp.el
deleted file mode 100644
index c45cc7e6e381..000000000000
--- a/users/grfn/emacs.d/lisp.el
+++ /dev/null
@@ -1,38 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(defun grfn/sly-panettone ()
-  (interactive)
-  (sly
-   (concat
-    (s-trim
-     (shell-command-to-string
-      "nix-build -o sbcl -E 'with import ~/code/depot {}; nix.buildLisp.sbclWith [web.panettone]'"))
-    "/bin/sbcl")))
-
-(defun grfn/setup-lisp ()
-  (interactive)
-  (unless paxedit-mode (paxedit-mode 1))
-  (rainbow-delimiters-mode)
-  (flycheck-mode -1))
-
-(add-hook 'common-lisp-lisp-mode-hook #'grfn/setup-lisp)
-
-(defun sly-run-tests ()
-  (interactive)
-  ;; TODO: handle other test frameworks
-  (let ((orig-window (get-buffer-window)))
-    (sly-eval '(fiveam:run!))
-    (funcall-interactively #'sly-mrepl-sync)
-    (select-window orig-window)))
-
-(map!
- (:map sly-mode-map
-  :n "g \\" #'sly-mrepl-sync
-  :n "g d" #'sly-edit-definition
-  :n "K" #'sly-documentation
-  :n "g SPC" #'sly-compile-and-load-file
-  :n "g RET" #'sly-run-tests)
-
- (:map sly-mrepl-mode-map
-  "C-k" #'sly-mrepl-previous-prompt
-  "C-r" #'isearch-backward))
diff --git a/users/grfn/emacs.d/nix-clangd.sh b/users/grfn/emacs.d/nix-clangd.sh
deleted file mode 100755
index 16f6252d8b27..000000000000
--- a/users/grfn/emacs.d/nix-clangd.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-set -euo pipefail
-
-CLANGD_FLAGS=--compile-commands-dir=/home/grfn/builds/tvix \
-    nix-shell /home/grfn/code/depot \
-    -A third_party.nix \
-    --run nix-clangd
diff --git a/users/grfn/emacs.d/nix.el b/users/grfn/emacs.d/nix.el
deleted file mode 100644
index ec5b474af218..000000000000
--- a/users/grfn/emacs.d/nix.el
+++ /dev/null
@@ -1,30 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(defun nix-buffer-type ()
-  "Returns:
-
-'home-manager, if the current buffer is a home-manager module
-'nixos, if the current buffer is a nixos module
-nil, if none of the above are the case"
-  (when buffer-file-name
-    (pcase buffer-file-name
-      ((rx (0+ nonl) "system/home" (0+ nonl) ".nix" eos)
-       'home-manager)
-      ((rx (0+ nonl) "system/system" (0+ nonl) ".nix" eos)
-       'nixos))))
-
-(defun set-nix-compile-command ()
-  "Set the compile command for the current buffer based on the type of nix
-buffer it is, per `nix-buffer-type'"
-  (interactive)
-  (when-let ((btype (nix-buffer-type)))
-    (setq-local
-     compile-command
-     (case btype
-       ('home-manager "home-manager switch")
-       ('nixos "sudo nixos-rebuild switch")))))
-
-(add-hook 'nix-mode-hook #'set-nix-compile-command)
-
-(map! (:map nix-mode-map
-       (:n "g SPC" #'compile)))
diff --git a/users/grfn/emacs.d/org-alerts.el b/users/grfn/emacs.d/org-alerts.el
deleted file mode 100644
index 8e6c3e0417ff..000000000000
--- a/users/grfn/emacs.d/org-alerts.el
+++ /dev/null
@@ -1,188 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-;;; Commentary:
-
-;;; Code:
-
-(require 's)
-(require 'dash)
-(require 'alert)
-(require 'org-agenda)
-
-
-(defvar grfn/org-alert-interval 300
-  "Interval in seconds to recheck and display deadlines.")
-
-
-(defvar grfn/org-alert-notification-title "*org*"
-  "Title to be sent with notify-send.")
-
-(defvar grfn/org-alert-headline-regexp "\\(Sched.+:.+\\|Deadline:.+\\)"
-  "Regexp for headlines to search in agenda buffer.")
-
-(defun grfn/org-alert--strip-prefix (headline)
-  "Remove the scheduled/deadline prefix from HEADLINE."
-  (replace-regexp-in-string ".*:\s+" "" headline))
-
-
-(defun grfn/org-alert--unique-headlines (regexp agenda)
-  "Return unique headlines from the results of REGEXP in AGENDA."
-  (let ((matches (-distinct (-flatten (s-match-strings-all regexp agenda)))))
-    (--map (grfn/org-alert--strip-prefix it) matches)))
-
-
-(defun grfn/org-alert--get-headlines ()
-  "Return the current org agenda as text only."
-  (with-temp-buffer
-    (let ((org-agenda-sticky nil)
-          (org-agenda-buffer-tmp-name (buffer-name)))
-      (ignore-errors (org-agenda-list nil "TODAY" 1))
-      (grfn/org-alert--unique-headlines
-       grfn/org-alert-headline-regexp
-       (buffer-substring-no-properties (point-min) (point-max))))))
-
-(defun grfn/parse-range-string (str)
-  (when
-      (string-match (rx (group (repeat 2 (any digit))
-                               ":"
-                               (repeat 2 (any digit)))
-                        (optional
-                         (and
-                          "-"
-                          (group (repeat 2 (any digit))
-                                 ":"
-                                 (repeat 2 (any digit))))))
-                    str)
-    (list
-     (org-read-date nil t
-                    (match-string 1 str))
-     (when-let ((et (match-string 2 str))) (org-read-date nil t et)))))
-
-(defun grfn/start-time-from-range-string (str)
-  (pcase-let ((`(,start-time . _) (grfn/parse-range-string str)))
-    start-time))
-
-(comment
- (org-agenda-list nil "TODAY" 1)
-
- (grfn/org-alert--get-headlines)
- (setq --src
-       (with-temp-buffer
-         (let ((org-agenda-sticky nil)
-               (org-agenda-buffer-tmp-name (buffer-name)))
-           (ignore-errors (org-agenda-list nil "TODAY" 1))
-           (buffer-substring-no-properties (point-min) (point-max)))))
-
- (setq --entries
-       (with-temp-buffer
-         (let ((inhibit-redisplay t)
-               (org-agenda-sticky nil)
-               (org-agenda-buffer-tmp-name (buffer-name))
-               (org-agenda-buffer-name (buffer-name))
-               (org-agenda-buffer (current-buffer)))
-           (org-agenda-get-day-entries
-            (cadr (org-agenda-files nil 'ifmode))
-            (calendar-gregorian-from-absolute
-             (time-to-days (org-read-date nil t "TODAY")))))))
-
- (loop for k in (text-properties-at 0 (car --entries))
-       by #'cddr
-       collect k)
-
- (--map (substring-no-properties (get-text-property 0 'txt it)) --entries)
- (--map (get-text-property 0 'time it) --entries)
- (current-time)
-
- (format-time-string "%R" (org-read-date nil t "10:00-11:00"))
-
- (grfn/start-time-from-range-string "10:00")
-
- (current-time-string (org-read-date nil t "10:00-11:00"))
-
- (todo-state
-  org-habit-p
-  priority
-  warntime
-  ts-date
-  date
-  type
-  org-hd-marker
-  org-marker
-  face
-  undone-face
-  help-echo
-  mouse-face
-  done-face
-  org-complex-heading-regexp
-  org-todo-regexp
-  org-not-done-regexp
-  dotime
-  format
-  extra
-  time
-  level
-  txt
-  breadcrumbs
-  duration
-  time-of-day
-  org-lowest-priority
-  org-highest-priority
-  tags
-  org-category)
-
- (propertize)
-
- --src
- )
-
-
-(defun grfn/org-alert--headline-complete? (headline)
-  "Return whether HEADLINE has been completed."
-  (--any? (s-starts-with? it headline) org-done-keywords-for-agenda))
-
-
-(defun grfn/org-alert--filter-active (deadlines)
-  "Remove any completed headings from the provided DEADLINES."
-  (-remove 'grfn/org-alert--headline-complete? deadlines))
-
-
-(defun grfn/org-alert--strip-states (deadlines)
-  "Remove the todo states from DEADLINES."
-  (--map (s-trim (s-chop-prefixes org-todo-keywords-for-agenda it)) deadlines))
-
-
-(defun grfn/org-alert-check ()
-  "Check for active, due deadlines and initiate notifications."
-  (interactive)
-  ;; avoid interrupting current command.
-  (unless (minibufferp)
-    (save-window-excursion
-      (save-excursion
-        (save-restriction
-          (let ((active (grfn/org-alert--filter-active (grfn/org-alert--get-headlines))))
-            (dolist (dl (grfn/org-alert--strip-states active))
-              (alert dl :title grfn/org-alert-notification-title))))))
-    (when (get-buffer org-agenda-buffer-name)
-      (ignore-errors
-        (with-current-buffer org-agenda-buffer-name
-          (org-agenda-redo t))))))
-
-
-(defun grfn/org-alert-enable ()
-  "Enable the notification timer.  Cancels existing timer if running."
-  (interactive)
-  (grfn/org-alert-disable)
-  (run-at-time 0 grfn/org-alert-interval 'grfn/org-alert-check))
-
-
-(defun grfn/org-alert-disable ()
-  "Cancel the running notification timer."
-  (interactive)
-  (dolist (timer timer-list)
-    (if (eq (elt timer 5) 'grfn/org-alert-check)
-        (cancel-timer timer))))
-
-
-
-(provide 'grfn/org-alert)
-;;; grfn/org-alert.el ends here
diff --git a/users/grfn/emacs.d/org-config.el b/users/grfn/emacs.d/org-config.el
deleted file mode 100644
index c26207ad09a1..000000000000
--- a/users/grfn/emacs.d/org-config.el
+++ /dev/null
@@ -1,191 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(defun +grfn/org-setup ()
-  (setq-local truncate-lines -1)
-  (display-line-numbers-mode -1)
-  (line-number-mode -1))
-
-(add-hook 'org-mode-hook #'+grfn/org-setup)
-
-(defun notes-file (f)
-  (concat org-directory (if (string-prefix-p "/" f) "" "/") f))
-
-(defun grfn/org-project-tag->key (tag)
-  (s-replace-regexp "^project__" "" tag))
-
-(defun grfn/org-project-tag->name (tag)
-  (s-titleized-words
-   (s-join " " (s-split "_" (grfn/org-project-tag->key tag)))))
-
-(defun grfn/org-project-tag->keys (tag)
-  (s-join "" (cons "p"
-                   (-map (lambda (s) (substring-no-properties s 0 1))
-                         (s-split "_" (grfn/org-project-tag->key tag))))))
-
-(defun grfn/org-projects->agenda-commands (project-tags)
-  (loop for tag in project-tags
-        collect `(,(grfn/org-project-tag->keys tag)
-                  ,(grfn/org-project-tag->name tag)
-                  tags-todo
-                  ,tag)))
-
-(defun grfn/org-projects ()
-  (loop for (tag) in
-        (org-global-tags-completion-table
-         (directory-files-recursively "~/notes" "\\.org$"))
-        when (s-starts-with-p "project__" tag)
-        collect tag))
-
-(comment
- (grfn/org-projects->agenda-commands (grfn/org-projects))
- )
-
-(setq
- org-directory (expand-file-name "~/notes")
- +org-dir (expand-file-name "~/notes")
- org-default-notes-file (concat org-directory "/inbox.org")
- +org-default-todo-file (concat org-directory "/inbox.org")
- org-agenda-files (directory-files-recursively
-                   "~/notes" "\\.org$")
- org-refile-targets '((org-agenda-files :maxlevel . 3))
- org-outline-path-complete-in-steps nil
- org-refile-use-outline-path t
- org-file-apps `((auto-mode . emacs)
-                 (,(rx (or (and "." (optional "x") (optional "htm") (optional "l") buffer-end)
-                           (and buffer-start "http" (optional "s") "://")))
-                  . "firefox %s")
-                 (,(rx ".pdf" buffer-end) . "apvlv %s")
-                 (,(rx "." (or "png"
-                               "jpg"
-                               "jpeg"
-                               "gif"
-                               "tif"
-                               "tiff")
-                       buffer-end)
-                  . "feh %s"))
- org-log-done 'time
- org-archive-location "~/notes/trash::* From %s"
- org-cycle-separator-lines 2
- org-hidden-keywords '(title)
- org-tags-column -130
- org-ellipsis "…"
- org-imenu-depth 9
- org-capture-templates
- `(("t" "Todo" entry
-    (file +org-default-todo-file)
-    "* TODO %?\n%i"
-    :kill-buffer t)
-
-   ("m" "Email" entry
-    (file +org-default-todo-file)
-    "* TODO [[%L][%:subject]] :email:\n%i")
-
-   ("n" "Notes" entry
-    (file +org-default-todo-file)
-    "* %U %?\n%i"
-    :prepend t
-    :kill-buffer t)
-
-   ("c" "Task note" entry
-    (clock)
-    "* %U %?\n%i[%l[Context]]\n"
-    :kill-buffer t
-    :unnarrowed t)
-
-   ("p" "Projects")
-   ("px" "Xanthous" entry
-    (file+headline ,(notes-file "xanthous.org") "Backlog")
-    "* TODO %?\nContext %a\nIn task: %K")
-   ("pt" "Tvix" entry
-    (file+headline ,(notes-file "tvix.org") "Tvix TODO")
-    "* TODO %?\nContext %a\nIn task: %K")
-   ("pw" "Windtunnel" entry
-    (file+headline ,(notes-file "windtunnel.org") "Inbox")
-    "* TODO %i%?\nContext: %a\nIn task: %K")
-   )
-
- org-capture-templates-contexts
- `(("px" ((in-file . "/home/grfn/code/depot/users/grfn/xanthous/.*")))
-   ("e" ((in-mode . "notmuch-show-mode"))))
-
- org-deadline-warning-days 1
- org-agenda-skip-scheduled-if-deadline-is-shown 'todo
- org-todo-keywords '((sequence "TODO(t)" "ACTIVE(a)" "|" "DONE(d)" "RUNNING(r)")
-                     (sequence "NEXT(n)" "WAITING(w)" "LATER(l)" "|" "CANCELLED(c)"))
- org-agenda-custom-commands
- `(("i" "Inbox" tags "inbox")
-   ("r" "Running jobs" todo "RUNNING")
-   ("w" "@Work" tags-todo "@work")
-   ("n" . "Next...")
-   ("nw" "Next @Work" tags-todo "@work&next")
-   ("nt" "Next tooling" tags-todo "tooling")
-
-   ("p" . "Project...")
-   ,@(grfn/org-projects->agenda-commands (grfn/org-projects)))
-
- org-agenda-dim-blocked-tasks nil
- org-enforce-todo-dependencies nil
-
- org-babel-clojure-backend 'cider)
-
-(defun +grfn/insert-work-template ()
-  (interactive)
-  (goto-char (point-min))
-  (forward-line)
-  (insert "#+TODO: TODO(t) NEXT(n) ACTIVE(a) | DONE(d) PR(p) RUNNING(r) TESTING(D)
-#+TODO: BLOCKED(b) BACKLOG(l) PROPOSED(o) | CANCELLED(c)
-#+FILETAGS: @work
-#+FILETAGS: @work
-#+PROPERTY: Effort_ALL 0 4:00 8:00 12:00 20:00 32:00
-#+PROPERTY: ESTIMATE_ALL 0 1 2 3 5 8
-#+PROPERTY: STORY-TYPE_ALL Feature Bug Chore
-#+PROPERTY: NOBLOCKING t
-#+COLUMNS: %TODO %40ITEM(Task) %17EFFORT(Estimated){:} %CLOCKSUM(Time Spent) %17STORY-TYPE(Type) %TAGS"))
-
-(defun +grfn/insert-org-template ()
-  (interactive)
-  (pcase (buffer-file-name)
-    ((s-contains "/work/") (+grfn/insert-work-template))))
-
-;;; TODO: this doesn't work?
-(define-auto-insert "\\.org?$" #'grfn/insert-org-template t)
-
-(defun forge--post-submit-around---link-pr-to-org-item
-    (orig)
-  (let ((cb (funcall orig)))
-    (lambda (value headers status req)
-      (prog1 (funcall cb value headers status req)
-        (grfn/at-org-clocked-in-item
-         (let ((url (alist-get 'html_url value))
-               (number (alist-get 'number value)))
-           (org-set-property
-            "pull-request"
-            (org-make-link-string
-             url
-             (format "%s/%s/%d"
-                     (->> value
-                          (alist-get 'base)
-                          (alist-get 'repo)
-                          (alist-get 'name))
-                     (->> value
-                          (alist-get 'base)
-                          (alist-get 'repo)
-                          (alist-get 'owner)
-                          (alist-get 'login))
-                     number)))))))))
-
-(advice-add
- #'forge--post-submit-callback
- :around #'forge--post-submit-around---link-pr-to-org-item)
-
-(set-face-foreground 'org-block +solarized-s-base00)
-(setq whitespace-global-modes '(not org-mode magit-mode vterm-mode))
-(setf (alist-get 'file org-link-frame-setup) 'find-file-other-window)
-(set-face-foreground 'org-block +solarized-s-base00)
-
-;; (add-hook! org-mode
-;;   (set-company-backend! 'org-mode
-;;     '(:separate company-ob-postgresql
-;;                 company-dabbrev
-;;                 company-yasnippet
-;;                 company-ispell)))
diff --git a/users/grfn/emacs.d/org-gcal.el b/users/grfn/emacs.d/org-gcal.el
deleted file mode 100644
index 3e315c5e6046..000000000000
--- a/users/grfn/emacs.d/org-gcal.el
+++ /dev/null
@@ -1,181 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(require 'aio)
-(require 'parse-time)
-
-(setq-local lexical-binding t)
-(setq plstore-cache-passphrase-for-symmetric-encryption t)
-
-(defvar gcal-client-id)
-(defvar gcal-client-secret)
-
-(defvar google-calendar-readonly-scope
-  "https://www.googleapis.com/auth/calendar.readonly")
-
-(defvar events-file "/home/grfn/notes/events.org")
-
-(defun google--get-token (scope client-id client-secret)
-  (oauth2-auth-and-store
-   "https://accounts.google.com/o/oauth2/v2/auth"
-   "https://oauth2.googleapis.com/token"
-   scope
-   client-id
-   client-secret))
-
-(cl-defun google--request (url &key method params scope)
-  (let ((p (aio-promise))
-        (auth-token (google--get-token scope gcal-client-id gcal-client-secret)))
-    (oauth2-refresh-access auth-token)
-    (oauth2-url-retrieve
-     auth-token
-     url
-     (lambda (&rest _)
-       (goto-char (point-min))
-       (re-search-forward "^$")
-       (let ((resp (json-parse-buffer :object-type 'alist)))
-         (aio-resolve p (lambda () resp))))
-     nil
-     (or method "GET")
-     params)
-    p))
-
-(cl-defun list-events (&key min-time max-time)
-  (google--request
-   (concat
-    "https://www.googleapis.com/calendar/v3/calendars/griffin@urbint.com/events"
-    "?timeMin=" (format-time-string "%Y-%m-%dT%T%z" min-time)
-    "&timeMax=" (format-time-string "%Y-%m-%dT%T%z" max-time))
-   :scope google-calendar-readonly-scope))
-
-
-(defun last-week-events ()
-  (list-events :min-time (time-subtract
-                          (current-time)
-                          (seconds-to-time
-                           (* 60 60 24 7)))
-               :max-time (current-time)))
-
-(defun next-week-events ()
-  (list-events :min-time (current-time)
-               :max-time (time-add
-                          (current-time)
-                          (seconds-to-time
-                           (* 60 60 24 7)))))
-
-(defun attending-event? (event)
-  (let* ((attendees (append (alist-get 'attendees event) nil))
-         (self (--find (alist-get 'self it) attendees)))
-    (equal "accepted" (alist-get 'responseStatus self))))
-
-(defun event->org-headline (event level)
-  (cl-flet ((make-time
-             (key)
-             (when-let ((raw-time (->> event (alist-get key) (alist-get 'dateTime))))
-               (format-time-string
-                (org-time-stamp-format t)
-                (parse-iso8601-time-string raw-time)))))
-    (if-let ((start-time (make-time 'start))
-             (end-time (make-time 'end)))
-        (s-format
-         "${headline} [[${htmlLink}][${summary}]] :event:
-${startTime}--${endTime}
-:PROPERTIES:
-${location-prop}
-:EVENT: ${htmlLink}
-:END:
-
-${description}"
-         (function
-          (lambda (k m)
-            (or (alist-get (intern k) m)
-                (format "key not found: %s" k))))
-         (append
-          event
-          `((headline . ,(make-string level ?*))
-            (startTime . ,start-time)
-            (endTime . ,end-time)
-            (location-prop
-             . ,(if-let ((location (alist-get 'location event)))
-                    (s-lex-format ":LOCATION: ${location}")
-                  "")))))
-      "")))
-
-(comment
- (alist-get 'foo nil)
- )
-
-(defun write-events (events)
-  (with-current-buffer (find-file-noselect events-file)
-    (save-mark-and-excursion
-      (save-restriction
-        (widen)
-        (erase-buffer)
-        (goto-char (point-min))
-        (insert "#+TITLE: Events")
-        (newline) (newline)
-        (prog1
-            (loop for event in (append events nil)
-                  when (attending-event? event)
-                  do
-                  (insert (event->org-headline event 1))
-                  (newline)
-                  sum 1)
-          (org-align-tags t))))))
-
-(defun +grfn/sync-events ()
-  (interactive)
-  (let* ((events (alist-get 'items (aio-wait-for (next-week-events))))
-         (num-written (write-events events)))
-    (message "Successfully wrote %d events" num-written)))
-
-(comment
- ((kind . "calendar#event")
-  (etag . "\"3174776941020000\"")
-  (id . "SNIP")
-  (status . "confirmed")
-  (htmlLink . "https://www.google.com/calendar/event?eid=SNIP")
-  (created . "2020-04-01T13:30:09.000Z")
-  (updated . "2020-04-20T13:14:30.510Z")
-  (summary . "SNIP")
-  (description . "SNIP")
-  (location . "SNIP")
-  (creator
-   (email . "griffin@urbint.com")
-   (self . t))
-  (organizer
-   (email . "griffin@urbint.com")
-   (self . t))
-  (start
-   (dateTime . "2020-04-01T12:00:00-04:00")
-   (timeZone . "America/New_York"))
-  (end
-   (dateTime . "2020-04-01T12:30:00-04:00")
-   (timeZone . "America/New_York"))
-  (recurrence .
-              ["RRULE:FREQ=WEEKLY;UNTIL=20200408T035959Z;BYDAY=WE"])
-  (iCalUID . "SNIP")
-  (sequence . 0)
-  (attendees .
-             [((email . "griffin@urbint.com")
-               (organizer . t)
-               (self . t)
-               (responseStatus . "accepted"))
-              ((email . "SNIP")
-               (displayName . "SNIP")
-               (responseStatus . "needsAction"))])
-  (extendedProperties
-   (private
-    (origRecurringId . "309q48kc1dihsvbi13pnlimb5a"))
-   (shared
-    (origRecurringId . "309q48kc1dihsvbi13pnlimb5a")))
-  (reminders
-   (useDefault . t)))
-
- (require 'icalendar)
-
- (icalendar--convert-recurring-to-diary
-  nil
-  "RRULE:FREQ=WEEKLY;UNTIL=20200408T035959Z;BYDAY=WE"
-  )
-
- )
diff --git a/users/grfn/emacs.d/org-query.el b/users/grfn/emacs.d/org-query.el
deleted file mode 100644
index 9d3b3358a9d3..000000000000
--- a/users/grfn/emacs.d/org-query.el
+++ /dev/null
@@ -1,143 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(require 'org)
-(require 'org-agenda)
-(require 'inflections)
-
-(defun grfn/org-text-element->string (elt)
-  (cond
-   ((stringp elt) elt)
-   ((and (consp elt)
-         (symbolp (car elt)))
-    (-> elt (caddr) (grfn/org-text-element->string) (s-trim) (concat " ")))))
-
-(defun grfn/org-element-title (elt)
-  (let ((title (org-element-property :title elt)))
-    (cond
-     ((stringp title) title)
-     ((listp title)
-      (->> title
-           (mapcar #'grfn/org-text-element->string)
-           (s-join "")
-           (s-trim))))))
-
-(defun grfn/org-agenda-entry->element (agenda-entry)
-  ;; ???
-  ())
-
-(defun org-elements-agenda-match (match &optional todo-only)
-  (setq match
-        (propertize match 'inherited t))
-  (with-temp-buffer
-    (let ((inhibit-redisplay (not debug-on-error))
-          (org-agenda-sticky nil)
-          (org-agenda-buffer-tmp-name (buffer-name))
-          (org-agenda-buffer-name (buffer-name))
-          (org-agenda-buffer (current-buffer))
-          (matcher (org-make-tags-matcher match))
-          result)
-      (org-agenda-prepare (concat "TAGS " match))
-      (setq match (car matcher)
-            matcher (cdr matcher))
-      (dolist (file (org-agenda-files nil 'ifmode)
-                    result)
-        (catch 'nextfile
-          (org-check-agenda-file file)
-          (when-let ((buffer (if (file-exists-p file)
-                                 (org-get-agenda-file-buffer file)
-                               (error "No such file %s" file))))
-            (with-current-buffer buffer
-              (unless (derived-mode-p 'org-mode)
-                (error "Agenda file %s is not in Org mode" file))
-              (save-excursion
-                (save-restriction
-                  (if (eq buffer org-agenda-restrict)
-                      (narrow-to-region org-agenda-restrict-begin
-                                        org-agenda-restrict-end)
-                    (widen))
-                  (setq result
-                        (append result (org-scan-tags
-                                        'agenda
-                                        matcher
-                                        todo-only))))))))))))
-
-(defun grfn/num-inbox-items ()
-  (length (org-elements-agenda-match "inbox" t)))
-
-(defun grfn/num-inbox-items-message ()
-  (let ((n (grfn/num-inbox-items)))
-    (if (zerop n) ""
-      (format "%d %s"
-              n
-              (if (= 1 n) "item" "items")))))
-
-(defmacro grfn/at-org-clocked-in-item (&rest body)
-  `(when (org-clocking-p)
-     (let ((m org-clock-marker))
-       (with-current-buffer (marker-buffer m)
-         (save-mark-and-excursion
-           (goto-char m)
-           (org-back-to-heading t)
-           ,@body)))))
-
-(defun grfn/org-element-clocked-in-task ()
-  (grfn/at-org-clocked-in-item
-   (org-element-at-point)))
-
-(comment
- (grfn/org-element-clocked-in-task)
- (org-element-property :title (grfn/org-element-clocked-in-task))
- )
-
-(defun grfn/minutes->hours:minutes (minutes)
-  (format "%d:%02d"
-          (floor (/ minutes 60))
-          (mod minutes 60)))
-
-(comment
- (grfn/minutes->hours:minutes 1)        ; => "0:01"
- (grfn/minutes->hours:minutes 15)       ; => "0:15"
- (grfn/minutes->hours:minutes 130)      ; => "2:10"
- )
-
-(defun grfn/org-current-clocked-in-task-message ()
-  (if (org-clocking-p)
-      (format "(%s) [%s]"
-              (->> (grfn/org-element-clocked-in-task)
-                   (grfn/org-element-title)
-                   (substring-no-properties)
-                   (s-trim))
-              (grfn/minutes->hours:minutes
-               (org-clock-get-clocked-time)))
-    ""))
-
-(comment
- (grfn/org-current-clocked-in-task-message)
- )
-
-(cl-defgeneric grfn/org-tracker-ticket-id-label (backend elt)
-  (org-tracker-backend/extract-issue-id backend elt))
-(cl-defmethod grfn/org-tracker-ticket-id-label
-  ((backend org-tracker-linear-backend) elt)
-  (when-let* ((link (plist-get elt :LINEAR-KEY)))
-    (string-match
-     (rx "[[" (one-or-more anything) "]"
-         "[" (group (one-or-more anything)) "]]")
-     link)
-    (match-string 1 link)))
-
-(defun grfn/org-clocked-in-ticket-id ()
-  (grfn/at-org-clocked-in-item
-   (when-let* ((backend (org-tracker-current-backend t)))
-     (grfn/org-tracker-ticket-id-label
-      backend
-      (cadr (org-element-at-point))))))
-
-(comment
- (grfn/at-org-clocked-in-item
-  (org-tracker-backend/extract-issue-id
-   (org-tracker-current-backend)
-   (cadr (org-element-at-point))))
-
- (grfn/org-clocked-in-ticket-id)
- )
diff --git a/users/grfn/emacs.d/packages.el b/users/grfn/emacs.d/packages.el
deleted file mode 100644
index 15a3843f4db9..000000000000
--- a/users/grfn/emacs.d/packages.el
+++ /dev/null
@@ -1,154 +0,0 @@
-;; -*- no-byte-compile: t; -*-
-;;; private/grfn/packages.el
-
-(package! moody)
-
-;; Editor
-(package! solarized-theme)
-(package! fill-column-indicator)
-(package! flx)
-(package! general
-  :recipe (:host github :repo "noctuid/general.el"))
-(package! fill-column-indicator)
-(package! writeroom-mode)
-(package! dash)
-(package! w3m)
-(package! rainbow-mode)
-(package! string-inflection)
-
-;;; Org
-(package! org-tracker
-  :recipe (:host file
-           :local-repo "~/code/org-tracker"))
-(package! jiralib2)
-(package! org-alert)
-(package! ob-http)
-(package! ob-ipython)
-(package! ob-async)
-(package! org-recent-headings)
-(package! org-sticky-header)
-(package! gnuplot)
-(package! gnuplot-mode)
-(package! org-d20)
-
-;; Presentation
-(package! epresent)
-(package! org-tree-slide)
-(package! ox-reveal)
-
-;; Slack etc
-(package! slack)
-(package! alert)
-
-;; Git
-(package! evil-magit)
-(package! marshal)
-(package! forge)
-(package!
-  github-review
-  :recipe
-  (:host github
-         :repo "charignon/github-review"
-         :files ("github-review.el")))
-
-;; Elisp
-(package! dash)
-(package! dash-functional)
-(package! s)
-(package! request)
-(package! predd
-  :recipe (:host github :repo "skeeto/predd"))
-(package! aio)
-
-;; Haskell
-(package! lsp-haskell)
-(package! counsel-etags)
-
-;;; LSP
-(package! lsp-mode)
-(package! lsp-ui :recipe (:host github :repo "emacs-lsp/lsp-ui"))
-(package! company-lsp)
-(package! lsp-treemacs)
-
-;; Rust
-;; (package! rustic :disable t)
-;; (package! racer :disable t)
-(package! cargo)
-
-;; Lisp
-(package! paxedit)
-
-;; Javascript
-(package! flow-minor-mode)
-(package! flycheck-flow)
-(package! company-flow)
-(package! prettier-js)
-
-;; GraphQL
-(package! graphql-mode)
-
-;; Haskell
-(package! lsp-mode)
-(package! lsp-ui)
-(package! lsp-haskell)
-(package! company-lsp)
-;; (package! lsp-imenu)
-
-;; Clojure
-(package! flycheck-clojure)
-
-;; SQL
-(package! sqlup-mode)
-(package! emacsql)
-(package! emacsql-psql)
-
-;;; Python
-(package! pyimport)
-;; (package! yapfify)
-(package! blacken)
-
-
-;;; Desktop interaction
-(package! counsel-spotify)
-
-;;; Dhall
-(package! dhall-mode)
-
-;;; Kubernetes
-(package! kubernetes)
-(package! kubernetes-evil)
-(package! k8s-mode)
-
-;;; Stack Exchange
-(package! sx)
-
-;;; Nix
-(package! nix-update
-  :recipe (:host github
-           :repo "glittershark/nix-update-el"))
-(package! direnv)
-
-;;; Sequence diagrams
-(package! wsd-mode
-  :recipe (:host github
-           :repo "josteink/wsd-mode"))
-
-;;; logic?
-(package! metal-mercury-mode
-  :recipe (:host github
-                 :repo "ahungry/metal-mercury-mode"))
-(package! flycheck-mercury)
-
-(package! terraform-mode)
-(package! company-terraform)
-
-(package! jsonnet-mode)
-
-;;;
-(package! znc
-  :recipe (:host github
-                 :repo "sshirokov/ZNC.el"))
-
-;;; cpp
-(package! protobuf-mode)
-(package! clang-format+)
diff --git a/users/grfn/emacs.d/rust.el b/users/grfn/emacs.d/rust.el
deleted file mode 100644
index 9988d16a5327..000000000000
--- a/users/grfn/emacs.d/rust.el
+++ /dev/null
@@ -1,42 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(add-to-list 'auto-mode-alist '("\\.rs$" . rust-mode))
-
-(defun grfn/rust-setup ()
-  (interactive)
-
-  (direnv--maybe-update-environment)
-
-  (+evil-embrace-angle-bracket-modes-hook-h)
-
-  ;; (setq lsp-rust-server 'rust-analyzer)
-  (setq-local whitespace-line-column 100
-              fill-column 100)
-  ;; (setq rust-format-show-buffer nil)
-  (setq lsp-rust-analyzer-import-merge-behaviour "last"
-        lsp-rust-analyzer-cargo-watch-command "clippy"
-        lsp-rust-analyzer-cargo-watch-args ["--target-dir" "/home/grfn/code/readyset/readyset/target/rust-analyzer"]
-        rustic-format-trigger 'on-save
-        lsp-ui-doc-enable t)
-  ;; (rust-enable-format-on-save)
-  (lsp))
-
-(add-hook 'rust-mode-hook #'grfn/rust-setup)
-
-(map!
- (:map rust-mode-map
-  :n "g RET" #'lsp-rust-analyzer-run
-  :n "g R" #'lsp-find-references
-  :n "g d" #'lsp-find-definition
-  :n "g Y" #'lsp-goto-type-definition
-  (:localleader
-   "m" #'lsp-rust-analyzer-expand-macro)))
-
-(comment
- (flycheck-get-next-checkers 'lsp)
- (flycheck-add-next-checker)
- (flycheck-get-next-checkers 'lsp)
- )
-
-(set-company-backend! 'rust-mode
-  '(:separate company-capf company-yasnippet))
diff --git a/users/grfn/emacs.d/show-matching-paren.el b/users/grfn/emacs.d/show-matching-paren.el
deleted file mode 100644
index ab65a912a8d1..000000000000
--- a/users/grfn/emacs.d/show-matching-paren.el
+++ /dev/null
@@ -1,61 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-;;; https://with-emacs.com/posts/ui-hacks/show-matching-lines-when-parentheses-go-off-screen/
-
-;; we will call `blink-matching-open` ourselves...
-(remove-hook 'post-self-insert-hook
-             #'blink-paren-post-self-insert-function)
-;; this still needs to be set for `blink-matching-open` to work
-(setq blink-matching-paren 'show)
-
-(let ((ov nil)) ; keep track of the overlay
-  (advice-add
-   #'show-paren-function
-   :after
-    (defun show-paren--off-screen+ (&rest _args)
-      "Display matching line for off-screen paren."
-      (when (overlayp ov)
-        (delete-overlay ov))
-      ;; check if it's appropriate to show match info,
-      ;; see `blink-paren-post-self-insert-function'
-      (when (and (overlay-buffer show-paren--overlay)
-                 (not (or cursor-in-echo-area
-                          executing-kbd-macro
-                          noninteractive
-                          (minibufferp)
-                          this-command))
-                 (and (not (bobp))
-                      (memq (char-syntax (char-before)) '(?\) ?\$)))
-                 (= 1 (logand 1 (- (point)
-                                   (save-excursion
-                                     (forward-char -1)
-                                     (skip-syntax-backward "/\\")
-                                     (point))))))
-        ;; rebind `minibuffer-message' called by
-        ;; `blink-matching-open' to handle the overlay display
-        (cl-letf (((symbol-function #'minibuffer-message)
-                   (lambda (msg &rest args)
-                     (let ((msg (apply #'format-message msg args)))
-                       (setq ov (display-line-overlay+
-                                 (window-start) msg ))))))
-          (blink-matching-open))))))
-
-(defun display-line-overlay+ (pos str &optional face)
-  "Display line at POS as STR with FACE.
-
-FACE defaults to inheriting from default and highlight."
-  (let ((ol (save-excursion
-              (goto-char pos)
-              (make-overlay (line-beginning-position)
-                            (line-end-position)))))
-    (overlay-put ol 'display str)
-    (overlay-put ol 'face
-                 (or face '(:inherit default :inherit highlight)))
-    ol))
-
-(setq show-paren-style 'paren
-      show-paren-delay 0.03
-      show-paren-highlight-openparen t
-      show-paren-when-point-inside-paren nil
-      show-paren-when-point-in-periphery t)
-(show-paren-mode 1)
diff --git a/users/grfn/emacs.d/slack-snippets.el b/users/grfn/emacs.d/slack-snippets.el
deleted file mode 100644
index b5bd4db7482c..000000000000
--- a/users/grfn/emacs.d/slack-snippets.el
+++ /dev/null
@@ -1,227 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(require 'dash)
-(require 'dash-functional)
-(require 'request)
-
-;;;
-;;; Configuration
-;;;
-
-(defvar slack/token nil
-  "Legacy (https://api.slack.com/custom-integrations/legacy-tokens) access token")
-
-(defvar slack/include-public-channels 't
-  "Whether or not to inclue public channels in the list of conversations")
-
-(defvar slack/include-private-channels 't
-  "Whether or not to inclue public channels in the list of conversations")
-
-(defvar slack/include-im 't
-  "Whether or not to inclue IMs (private messages) in the list of conversations")
-
-(defvar slack/include-mpim nil
-  "Whether or not to inclue multi-person IMs (multi-person private messages) in
-  the list of conversations")
-
-;;;
-;;; Utilities
-;;;
-
-(defmacro comment (&rest _body)
-  "Comment out one or more s-expressions"
-  nil)
-
-(defun ->list (vec) (append vec nil))
-
-(defun json-truthy? (x) (and x (not (equal :json-false x))))
-
-;;;
-;;; Generic API integration
-;;;
-
-(defvar slack/base-url "https://slack.com/api")
-
-(defun slack/get (path params &optional callback)
-  "params is an alist of query parameters"
-  (let* ((params-callback (if (functionp params) `(() . ,params) (cons params callback)))
-         (params (car params-callback)) (callback (cdr params-callback))
-         (params (append `(("token" . ,slack/token)) params))
-         (url (concat (file-name-as-directory slack/base-url) path)))
-    (request url
-             :type "GET"
-             :params params
-             :parser 'json-read
-             :success (cl-function
-                       (lambda (&key data &allow-other-keys)
-                         (funcall callback data))))))
-
-(defun slack/post (path params &optional callback)
-  (let* ((params-callback (if (functionp params) `(() . ,params) (cons params callback)))
-         (params (car params-callback)) (callback (cdr params-callback))
-         (url (concat (file-name-as-directory slack/base-url) path)))
-    (request url
-             :type "POST"
-             :data (json-encode params)
-             :headers `(("Content-Type"  . "application/json")
-                        ("Authorization" . ,(format "Bearer %s" slack/token)))
-             :success (cl-function
-                       (lambda (&key data &allow-other-keys)
-                         (funcall callback data))))))
-
-
-;;;
-;;; Specific API endpoints
-;;;
-
-;; Users
-
-(defun slack/users (cb)
-  "Returns users as (id . name) pairs"
-  (slack/get
-   "users.list"
-   (lambda (data)
-     (->> data
-          (assoc-default 'members)
-          ->list
-          (-map (lambda (user)
-                  (cons (assoc-default 'id user)
-                        (assoc-default 'real_name user))))
-          (-filter #'cdr)
-          (funcall cb)))))
-
-(comment
- (slack/get
-  "users.list"
-  (lambda (data) (setq response-data data)))
-
- (slack/users (lambda (data) (setq --users data)))
-
- )
-
-;; Conversations
-
-(defun slack/conversation-types ()
-  (->>
-   (list (when slack/include-public-channels  "public_channel")
-         (when slack/include-private-channels "private_channel")
-         (when slack/include-im               "im")
-         (when slack/include-mpim             "mpim"))
-   (-filter #'identity)
-   (s-join ",")))
-
-(defun channel-label (chan users-alist)
-  (cond
-   ((json-truthy? (assoc-default 'is_channel chan))
-    (format "#%s" (assoc-default 'name chan)))
-   ((json-truthy? (assoc-default 'is_im chan))
-    (let ((user-id (assoc-default 'user chan)))
-      (format "Private message with %s" (assoc-default user-id users-alist))))
-   ((json-truthy? (assoc-default 'is_mpim chan))
-    (->> chan
-         (assoc-default 'purpose)
-         (assoc-default 'value)))))
-
-(defun slack/conversations (cb)
-  "Calls `cb' with (id . '((label . \"label\") '(topic . \"topic\") '(purpose . \"purpose\"))) pairs"
-  (slack/get
-   "conversations.list"
-   `(("types"            . ,(slack/conversation-types))
-     ("exclude-archived" . "true"))
-   (lambda (data)
-     (setq --data data)
-     (slack/users
-      (lambda (users)
-        (->> data
-             (assoc-default 'channels)
-             ->list
-             (-map
-              (lambda (chan)
-                (cons (assoc-default 'id chan)
-                      `((label   . ,(channel-label chan users))
-                        (topic   . ,(->> chan
-                                         (assoc-default 'topic)
-                                         (assoc-default 'value)))
-                        (purpose . ,(->> chan
-                                         (assoc-default 'purpose)
-                                         (assoc-default 'value)))))))
-             (funcall cb)))))))
-
-(comment
- (slack/get
-  "conversations.list"
-  '(("types" . "public_channel,private_channel,im,mpim"))
-  (lambda (data) (setq response-data data)))
-
- (slack/get
-  "conversations.list"
-  '(("types" . "im"))
-  (lambda (data) (setq response-data data)))
-
- (slack/conversations
-  (lambda (convos) (setq --conversations convos)))
-
- )
-
-;; Messages
-
-(cl-defun slack/post-message
-    (&key text channel-id (on-success #'identity))
-  (slack/post "chat.postMessage"
-              `((text    . ,text)
-                (channel . ,channel-id)
-                (as_user . t))
-              on-success))
-
-(comment
-
- (slack/post-message
-  :text "hi slackbot"
-  :channel-id slackbot-channel-id
-  :on-success (lambda (data) (setq resp data)))
-
- )
-
-;;;
-;;; Posting code snippets to slack
-;;;
-
-(defun prompt-for-channel (cb)
-  (slack/conversations
-   (lambda (conversations)
-     (ivy-read
-      "Select channel: "
-      ;; TODO want to potentially use purpose / topic stuff here
-      (->> conversations
-           (-filter (lambda (c) (assoc-default 'label (cdr c))))
-           (-map (lambda (chan) (let ((label (assoc-default 'label (cdr chan)))
-                                 (id (car chan)))
-                             (propertize label 'channel-id id)))))
-      :history 'slack/channel-history
-      :action (lambda (selected)
-                (let ((channel-id (get-text-property 0 'channel-id selected)))
-                  (funcall cb channel-id)
-                  (message "Sent message to %s" selected))))))
-  nil)
-
-(comment
- (prompt-for-channel #'message)
- (->> --convos
-      (-filter (lambda (c) (assoc-default 'label (cdr c))))
-      (-map (lambda (chan) (let ((label (assoc-default 'label (cdr chan)))
-                       (id (car chan)))
-                   (propertize label 'channel-id id)))))
-
- (->> --convos (car) (cdr) (assoc-default 'label))
- )
-
-(defun slack-send-code-snippet (&optional snippet-text)
-  (interactive
-   (list (buffer-substring-no-properties (mark) (point))))
-  (prompt-for-channel
-   (lambda (channel-id)
-     (slack/post-message
-      :text       (format "```\n%s```" snippet-text)
-      :channel-id channel-id))))
-
-(provide 'slack-snippets)
diff --git a/users/grfn/emacs.d/slack.el b/users/grfn/emacs.d/slack.el
deleted file mode 100644
index 54d3b40b099c..000000000000
--- a/users/grfn/emacs.d/slack.el
+++ /dev/null
@@ -1,24 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(after! slack
-  (set-face-foreground 'slack-message-output-header +solarized-s-base01)
-  (set-face-attribute 'slack-message-output-header nil :underline nil)
-  (set-face-attribute 'slack-message-output-text nil :height 1.0))
-
-(require 'slack)
-(setq slack-buffer-emojify 't
-      slack-prefer-current-team 't
-      slack-thread-also-send-to-room nil)
-
-(set-popup-rule! "^\\*Slack"
-  :quit nil
-  :select t
-  :side 'bottom
-  :ttl nil
-  :size 0.5)
-
-(add-hook #'slack-message-buffer-mode-hook
-          (lambda () (toggle-truncate-lines -1)))
-
-(map! (:map slack-message-buffer-mode-map
-       :n "q" #'delete-window))
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/annotation b/users/grfn/emacs.d/snippets/haskell-mode/annotation
deleted file mode 100644
index 8a2854d759df..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/annotation
+++ /dev/null
@@ -1,5 +0,0 @@
-# key: ann
-# name: annotation
-# expand-env: ((yas-indent-line 'fixed))
-# --
-{-# ANN ${1:module} ("${2:HLint: ignore ${3:Reduce duplication}}" :: String) #-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/benchmark-module b/users/grfn/emacs.d/snippets/haskell-mode/benchmark-module
deleted file mode 100644
index cbb1646e41d1..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/benchmark-module
+++ /dev/null
@@ -1,26 +0,0 @@
-# key: bench
-# name: benchmark-module
-# expand-env: ((yas-indent-line (quote fixed)))
-# --
---------------------------------------------------------------------------------
-module ${1:`(if (not buffer-file-name) "Module"
-                (let ((name (file-name-sans-extension (buffer-file-name)))
-                      (case-fold-search nil))
-                     (if (cl-search "bench/" name)
-                         (replace-regexp-in-string "/" "."
-                           (replace-regexp-in-string "^\/[^A-Z]*" ""
-                             (car (last (split-string name "src")))))
-                         (file-name-nondirectory name))))`} ( benchmark, main ) where
---------------------------------------------------------------------------------
-import Bench.Prelude
---------------------------------------------------------------------------------
-import ${1:$(s-chop-suffix "Bench" yas-text)}
---------------------------------------------------------------------------------
-
-main :: IO ()
-main = defaultMain [benchmark]
-
---------------------------------------------------------------------------------
-
-benchmark :: Benchmark
-benchmark = bgroup "${1:$(->> yas-text (s-chop-suffix "Bench") (s-split ".") -last-item)}" [bench "something dumb" $ nf (1 +) (1 :: Int)]
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/header b/users/grfn/emacs.d/snippets/haskell-mode/header
deleted file mode 100644
index fdd8250d86ca..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/header
+++ /dev/null
@@ -1,5 +0,0 @@
-# key: hh
-# name: header
-# expand-env: ((yas-indent-line 'fixed))
-# --
---------------------------------------------------------------------------------$2
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/hedgehog-generator b/users/grfn/emacs.d/snippets/haskell-mode/hedgehog-generator
deleted file mode 100644
index 68863f70542b..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/hedgehog-generator
+++ /dev/null
@@ -1,8 +0,0 @@
-# key: gen
-# name: Hedgehog Generator
-# expand-env: ((yas-indent-line (quote fixed)))
-# --
-gen${1:Foo} :: Gen $1
-gen$1 = do
-  $2
-  pure $1{..}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/hedgehog-property b/users/grfn/emacs.d/snippets/haskell-mode/hedgehog-property
deleted file mode 100644
index bf39a2a3eecb..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/hedgehog-property
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- mode: snippet -*-
-# name: Hedgehog Property
-# key: hprop
-# expand-env: ((yas-indent-line 'fixed))
-# --
-hprop_${1:somethingIsAlwaysTrue} :: Property
-hprop_$1 = property $ do
-  ${2:x} <- forAll ${3:Gen.int $ Range.linear 1 100}
-  ${4:x === x}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/hlint b/users/grfn/emacs.d/snippets/haskell-mode/hlint
deleted file mode 100644
index f25a9b8d409e..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/hlint
+++ /dev/null
@@ -1,8 +0,0 @@
-# -*- mode: snippet -*-
-# name: hlint
-# uuid: hlint
-# expand-env: ((yas-indent-line 'fixed))
-# key: hlint
-# condition: t
-# --
-{-# ANN module ("Hlint: ignore $1" :: String) #- }
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/import-i b/users/grfn/emacs.d/snippets/haskell-mode/import-i
deleted file mode 100644
index 4a7fca2c2fd6..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/import-i
+++ /dev/null
@@ -1,4 +0,0 @@
-# key: i
-# name: import-i
-# --
-import           ${1:Prelude}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/inl b/users/grfn/emacs.d/snippets/haskell-mode/inl
deleted file mode 100644
index 6e17b83d7114..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/inl
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- mode: snippet -*-
-# name: inl
-# key: inl
-# expand-env: ((yas-indent-line 'fixed))
-# --
-{-# INLINE $1 #-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/inline b/users/grfn/emacs.d/snippets/haskell-mode/inline
deleted file mode 100644
index 1beafbe50b56..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/inline
+++ /dev/null
@@ -1,5 +0,0 @@
-# key: inline
-# name: inline
-# expand-env: ((yas-indent-line 'fixed))
-# --
-{-# INLINE $1 #-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/language pragma b/users/grfn/emacs.d/snippets/haskell-mode/language pragma
deleted file mode 100644
index 6f84720f4511..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/language pragma
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- mode: snippet -*-
-# name: language pragma
-# key: lang
-# expand-env: ((yas-indent-line 'fixed))
-# --
-{-# LANGUAGE $1 #-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/lens.field b/users/grfn/emacs.d/snippets/haskell-mode/lens.field
deleted file mode 100644
index b22ea3d2e888..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/lens.field
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: lens.field
-# key: lens
-# expand-env: ((yas-indent-line 'fixed))
-# --
-${1:field} :: Lens' ${2:Source} ${3:Target}
-$1 = lens _${4:sourceField} $ \\${2:$(-> yas-text s-word-initials s-downcase)} ${4:$(-> yas-text s-word-initials s-downcase)} -> ${2:$(-> yas-text s-word-initials s-downcase)} { _$4 = ${4:$(-> yas-text s-word-initials s-downcase)} }
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/module b/users/grfn/emacs.d/snippets/haskell-mode/module
deleted file mode 100644
index 4554d33f9ba7..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/module
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- mode: snippet -*-
-# key: module
-# name: module
-# condition: (= (length "module") (current-column))
-# expand-env: ((yas-indent-line 'fixed))
-# contributor: Luke Hoersten <luke@hoersten.org>
-# --
---------------------------------------------------------------------------------
--- |
--- Module      : $1
--- Description : $2
--- Maintainer  : Griffin Smith <grfn@urbint.com>
--- Maturity    : ${3:Draft, Usable, Maintained, OR MatureAF}
---
--- $4
---------------------------------------------------------------------------------
-module ${1:`(if (not buffer-file-name) "Module"
-                (let ((name (file-name-sans-extension (buffer-file-name)))
-                      (case-fold-search nil))
-                     (if (or (cl-search "src/" name)
-                             (cl-search "test/" name))
-                         (replace-regexp-in-string "/" "."
-                           (replace-regexp-in-string "^\/[^A-Z]*" ""
-                             (car (last (split-string name "src")))))
-                         (file-name-nondirectory name))))`}
-  (
-  ) where
---------------------------------------------------------------------------------
-import Prelude
---------------------------------------------------------------------------------
-
-$0
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/shut up, hlint b/users/grfn/emacs.d/snippets/haskell-mode/shut up, hlint
deleted file mode 100644
index fccff1d66f29..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/shut up, hlint
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- mode: snippet -*-
-# name: shut up, hlint
-# key: dupl
-# expand-env: ((yas-indent-line 'fixed))
-# --
-{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/test-group b/users/grfn/emacs.d/snippets/haskell-mode/test-group
deleted file mode 100644
index bf6a66f8a34f..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/test-group
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- mode: snippet -*-
-# name: test-group
-# uuid: test-group
-# key: testGroup
-# condition: t
-# --
-testGroup "${1:name}"
-[ $0
-]
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/test-module b/users/grfn/emacs.d/snippets/haskell-mode/test-module
deleted file mode 100644
index 036b0ae9983a..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/test-module
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- mode: snippet -*-
-# name: test-module
-# key: test
-# expand-env: ((yas-indent-line 'fixed))
-# --
---------------------------------------------------------------------------------
-module ${1:`(if (not buffer-file-name) "Module"
-                (let ((name (file-name-sans-extension (buffer-file-name)))
-                      (case-fold-search nil))
-                     (if (cl-search "test/" name)
-                         (replace-regexp-in-string "/" "."
-                           (replace-regexp-in-string "^\/[^A-Z]*" ""
-                             (car (last (split-string name "src")))))
-                         (file-name-nondirectory name))))`} (main, test) where
---------------------------------------------------------------------------------
-import           Test.Prelude
---------------------------------------------------------------------------------
-import           ${1:$(s-chop-suffix "Spec" yas-text)}
---------------------------------------------------------------------------------
-
-main :: IO ()
-main = defaultMain test
-
-test :: TestTree
-test = testGroup "$1"
-  [ $0
-  ]
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/haskell-mode/undefined b/users/grfn/emacs.d/snippets/haskell-mode/undefined
deleted file mode 100644
index 7bcd99b5716c..000000000000
--- a/users/grfn/emacs.d/snippets/haskell-mode/undefined
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- mode: snippet -*-
-# name: undefined
-# key: u
-# expand-env: ((yas-indent-line 'fixed) (yas-wrap-around-region 'nil))
-# --
-undefined$1
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/js2-mode/action-type b/users/grfn/emacs.d/snippets/js2-mode/action-type
deleted file mode 100644
index ef8d1a3863ee..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/action-type
+++ /dev/null
@@ -1,4 +0,0 @@
-# key: at
-# name: action-type
-# --
-export const ${1:FOO_BAR$(->> yas-text s-upcase (s-replace-all '(("-" . "_") (" " . "_"))))}: '${3:ns}/${1:$(-> yas-text s-dashed-words)}' = '$3/${1:$(-> yas-text s-dashed-words)}'$5
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/js2-mode/before b/users/grfn/emacs.d/snippets/js2-mode/before
deleted file mode 100644
index 4569b6583143..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/before
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: before
-# key: bef
-# --
-before(function() {
-                  $1
-})
diff --git a/users/grfn/emacs.d/snippets/js2-mode/context b/users/grfn/emacs.d/snippets/js2-mode/context
deleted file mode 100644
index d83809f3c35e..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/context
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: context
-# key: context
-# --
-context('$1', function() {
-              $2
-})
diff --git a/users/grfn/emacs.d/snippets/js2-mode/describe b/users/grfn/emacs.d/snippets/js2-mode/describe
deleted file mode 100644
index bd0198181d02..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/describe
+++ /dev/null
@@ -1,6 +0,0 @@
-# key: desc
-# name: describe
-# --
-describe('$1', () => {
-  $2
-})
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/js2-mode/expect b/users/grfn/emacs.d/snippets/js2-mode/expect
deleted file mode 100644
index eba41ef3309d..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/expect
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- mode: snippet -*-
-# name: expect
-# key: ex
-# --
-expect($1).$2
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/js2-mode/function b/users/grfn/emacs.d/snippets/js2-mode/function
deleted file mode 100644
index b423044b4410..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/function
+++ /dev/null
@@ -1,6 +0,0 @@
-# key: f
-# name: function
-# --
-function $1($2) {
-         $3
-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/js2-mode/header b/users/grfn/emacs.d/snippets/js2-mode/header
deleted file mode 100644
index 3e303764cb0b..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/header
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- mode: snippet -*-
-# name: header
-# key: hh
-# expand-env: ((yas-indent-line 'fixed))
-# --
-////////////////////////////////////////////////////////////////////////////////
diff --git a/users/grfn/emacs.d/snippets/js2-mode/it b/users/grfn/emacs.d/snippets/js2-mode/it
deleted file mode 100644
index a451cfc08a90..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/it
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: it
-# key: it
-# --
-it('$1', () => {
-  $2
-})
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/js2-mode/it-pending b/users/grfn/emacs.d/snippets/js2-mode/it-pending
deleted file mode 100644
index 00da312e1096..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/it-pending
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- mode: snippet -*-
-# name: it-pending
-# key: xi
-# --
-it('$1')$0
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/js2-mode/module b/users/grfn/emacs.d/snippets/js2-mode/module
deleted file mode 100644
index dc79819d8979..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/module
+++ /dev/null
@@ -1,12 +0,0 @@
-# key: module
-# name: module
-# expand-env: ((yas-indent-line (quote fixed)))
-# condition: (= (length "module") (current-column))
-# --
-/**
- * @fileOverview $1
- * @name ${2:`(file-name-nondirectory (buffer-file-name))`}
- * @author Griffin Smith
- * @license Proprietary
- */
-$3
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/js2-mode/record b/users/grfn/emacs.d/snippets/js2-mode/record
deleted file mode 100644
index 0bb0f024367b..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/record
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: record
-# key: rec
-# --
-export default class $1 extends Record({
-  $2
-}) {}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/js2-mode/test b/users/grfn/emacs.d/snippets/js2-mode/test
deleted file mode 100644
index 938d490a74e8..000000000000
--- a/users/grfn/emacs.d/snippets/js2-mode/test
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: test
-# key: test
-# --
-test('$1', () => {
-  $2
-})
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/nix-mode/fetchFromGitHub b/users/grfn/emacs.d/snippets/nix-mode/fetchFromGitHub
deleted file mode 100644
index d2447e4b5a4d..000000000000
--- a/users/grfn/emacs.d/snippets/nix-mode/fetchFromGitHub
+++ /dev/null
@@ -1,12 +0,0 @@
-# -*- mode: snippet -*-
-# name: fetchFromGitHub
-# uuid: fetchFromGitHub
-# key: fetchFromGitHub
-# condition: t
-# --
-fetchFromGitHub {
-                owner = "$1";
-                repo = "$2";
-                rev = "$3";
-                sha256 = "0000000000000000000000000000000000000000000000000000";
-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/nix-mode/pythonPackage b/users/grfn/emacs.d/snippets/nix-mode/pythonPackage
deleted file mode 100644
index 0a74c21e1857..000000000000
--- a/users/grfn/emacs.d/snippets/nix-mode/pythonPackage
+++ /dev/null
@@ -1,16 +0,0 @@
-# key: pypkg
-# name: pythonPackage
-# condition: t
-# --
-${1:pname} = buildPythonPackage rec {
-           name = "\${pname}-\${version}";
-           pname = "$1";
-           version = "${2:1.0.0}";
-           src = fetchPypi {
-               inherit pname version;
-               sha256 = "0000000000000000000000000000000000000000000000000000";
-           };
-           propagatedBuildInputs = with pythonSelf; [
-               $3
-           ];
-};
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/nix-mode/sha256 b/users/grfn/emacs.d/snippets/nix-mode/sha256
deleted file mode 100644
index bc640e5ab09b..000000000000
--- a/users/grfn/emacs.d/snippets/nix-mode/sha256
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: sha256
-# uuid: sha256
-# key: sha256
-# condition: t
-# --
-sha256 = "0000000000000000000000000000000000000000000000000000";
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/org-mode/SQL source block b/users/grfn/emacs.d/snippets/org-mode/SQL source block
deleted file mode 100644
index b5d43fd6bc01..000000000000
--- a/users/grfn/emacs.d/snippets/org-mode/SQL source block
+++ /dev/null
@@ -1,6 +0,0 @@
-# key: sql
-# name: SQL source block
-# --
-#+BEGIN_SRC sql ${1::async}
-$2
-#+END_SRC
diff --git a/users/grfn/emacs.d/snippets/org-mode/combat b/users/grfn/emacs.d/snippets/org-mode/combat
deleted file mode 100644
index b4db0f433aec..000000000000
--- a/users/grfn/emacs.d/snippets/org-mode/combat
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- mode: snippet -*-
-# name: combat
-# uuid: combat
-# key: combat
-# condition: t
-# --
-|             | initiative | max hp | current hp | status |      |
-|-------------+------------+--------+------------+--------+------|
-| Barty Barty |            |        |            |        | <--- |
-| Hectoroth   |            |        |            |        |      |
-| Xanadu      |            |        |            |        |      |
-| Aurora      |            |        |            |        |      |
-| EFB         |            |        |            |        |      |
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/org-mode/date b/users/grfn/emacs.d/snippets/org-mode/date
deleted file mode 100644
index 297529cdac64..000000000000
--- a/users/grfn/emacs.d/snippets/org-mode/date
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- mode: snippet -*-
-# key: date
-# name: date.org
-# --
-[`(format-time-string "%Y-%m-%d")`]$0
diff --git a/users/grfn/emacs.d/snippets/org-mode/date-time b/users/grfn/emacs.d/snippets/org-mode/date-time
deleted file mode 100644
index fde469276c3f..000000000000
--- a/users/grfn/emacs.d/snippets/org-mode/date-time
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- mode: snippet -*-
-# name: date-time
-# key: dt
-# --
-[`(format-time-string "%Y-%m-%d %H:%m:%S")`]
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/org-mode/description b/users/grfn/emacs.d/snippets/org-mode/description
deleted file mode 100644
index a43bc95cc3ed..000000000000
--- a/users/grfn/emacs.d/snippets/org-mode/description
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: description
-# key: desc
-# --
-:DESCRIPTION:
-$1
-:END:
diff --git a/users/grfn/emacs.d/snippets/org-mode/nologdone b/users/grfn/emacs.d/snippets/org-mode/nologdone
deleted file mode 100644
index e5be85d6b3c0..000000000000
--- a/users/grfn/emacs.d/snippets/org-mode/nologdone
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- mode: snippet -*-
-# name: nologdone
-# key: nologdone
-# --
-#+STARTUP: nologdone$0
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/org-mode/python source block b/users/grfn/emacs.d/snippets/org-mode/python source block
deleted file mode 100644
index 247ae51b0b78..000000000000
--- a/users/grfn/emacs.d/snippets/org-mode/python source block
+++ /dev/null
@@ -1,6 +0,0 @@
-# key: py
-# name: Python source block
-# --
-#+BEGIN_SRC python
-$0
-#+END_SRC
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/org-mode/reveal b/users/grfn/emacs.d/snippets/org-mode/reveal
deleted file mode 100644
index 1bdbdfa5dc36..000000000000
--- a/users/grfn/emacs.d/snippets/org-mode/reveal
+++ /dev/null
@@ -1,6 +0,0 @@
-# key: reveal
-# name: reveal
-# condition: t
-# --
-#+ATTR_REVEAL: :frag ${1:roll-in}
-$0
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/org-mode/transaction b/users/grfn/emacs.d/snippets/org-mode/transaction
deleted file mode 100644
index 37f2dd31caff..000000000000
--- a/users/grfn/emacs.d/snippets/org-mode/transaction
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: transaction
-# key: begin
-# --
-BEGIN;
-$0
-ROLLBACK;
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/prolog-mode/use-module b/users/grfn/emacs.d/snippets/prolog-mode/use-module
deleted file mode 100644
index 75fd19b6414b..000000000000
--- a/users/grfn/emacs.d/snippets/prolog-mode/use-module
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: use-module
-# uuid: use-module
-# key: use
-# condition: t
-# --
-:- use_module(${1:library($2)}${3:, [$4]}).
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/python-mode/add_column b/users/grfn/emacs.d/snippets/python-mode/add_column
deleted file mode 100644
index 47e83850d5b7..000000000000
--- a/users/grfn/emacs.d/snippets/python-mode/add_column
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- mode: snippet -*-
-# name: add_column
-# key: op.add_column
-# --
-op.add_column('${1:table}', sa.Column('${2:name}', sa.${3:String()}))$0
diff --git a/users/grfn/emacs.d/snippets/python-mode/decorate b/users/grfn/emacs.d/snippets/python-mode/decorate
deleted file mode 100644
index 4f96748572a2..000000000000
--- a/users/grfn/emacs.d/snippets/python-mode/decorate
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- mode: snippet -*-
-# name: decorate
-# uuid: decorate
-# key: decorate
-# condition: t
-# --
-def wrap(inner):
-    @wraps(inner)
-    def wrapped(*args, **kwargs):
-        ret = inner(*args, **kwargs)
-        return ret
-
-    return wrapped
-
-return wrap
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/python-mode/dunder b/users/grfn/emacs.d/snippets/python-mode/dunder
deleted file mode 100644
index 71d99dddc67d..000000000000
--- a/users/grfn/emacs.d/snippets/python-mode/dunder
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: dunder
-# uuid: dunder
-# key: du
-# condition: t
-# --
-__$1__$0
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/python-mode/name b/users/grfn/emacs.d/snippets/python-mode/name
deleted file mode 100644
index 1495cc91d9fb..000000000000
--- a/users/grfn/emacs.d/snippets/python-mode/name
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: name
-# uuid: name
-# key: name
-# condition: t
-# --
-__name__
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/python-mode/op.get_bind.execute b/users/grfn/emacs.d/snippets/python-mode/op.get_bind.execute
deleted file mode 100644
index aba801c6baf9..000000000000
--- a/users/grfn/emacs.d/snippets/python-mode/op.get_bind.execute
+++ /dev/null
@@ -1,7 +0,0 @@
-# key: exec
-# name: op.get_bind.execute
-# --
-op.get_bind().execute(
-    """
-    `(progn (sqlup-mode) "")`$1
-    """)
diff --git a/users/grfn/emacs.d/snippets/python-mode/pdb b/users/grfn/emacs.d/snippets/python-mode/pdb
deleted file mode 100644
index 41c6f87cbfc1..000000000000
--- a/users/grfn/emacs.d/snippets/python-mode/pdb
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- mode: snippet -*-
-# name: pdb
-# uuid: pdb
-# key: pdb
-# condition: t
-# --
-import pdb; pdb.set_trace()
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/rust-mode/#[macro_use] b/users/grfn/emacs.d/snippets/rust-mode/#[macro_use]
deleted file mode 100644
index fea942a337f6..000000000000
--- a/users/grfn/emacs.d/snippets/rust-mode/#[macro_use]
+++ /dev/null
@@ -1,5 +0,0 @@
-# key: macro_use
-# name: #[macro_use]
-# --
-#[macro_use]
-${1:extern crate} ${2:something};$0
diff --git a/users/grfn/emacs.d/snippets/rust-mode/async test b/users/grfn/emacs.d/snippets/rust-mode/async test
deleted file mode 100644
index 2352d7b56bcc..000000000000
--- a/users/grfn/emacs.d/snippets/rust-mode/async test
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- mode: snippet -*-
-# name: async test
-# uuid: atest
-# key: atest
-# condition: t
-# --
-#[tokio::test${1:(flavor = "multi_thread")}]
-async fn ${2:test_name}() {
-   `%`$0
-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/rust-mode/benchmark b/users/grfn/emacs.d/snippets/rust-mode/benchmark
deleted file mode 100644
index 9ec43075380b..000000000000
--- a/users/grfn/emacs.d/snippets/rust-mode/benchmark
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- mode: snippet -*-
-# name: benchmark
-# uuid: benchmark
-# key: bench
-# condition: t
-# --
-#[bench]
-fn ${1:benchmark_name}(b: &mut Bencher) {
-   `%`b.iter(|| $0);
-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/rust-mode/proptest b/users/grfn/emacs.d/snippets/rust-mode/proptest
deleted file mode 100644
index be12af49113a..000000000000
--- a/users/grfn/emacs.d/snippets/rust-mode/proptest
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- mode: snippet -*-
-# name: proptest
-# uuid: proptest
-# key: proptest
-# condition: t
-# --
-#[proptest]
-fn ${1:test_name}($2) {
-   `%`$0
-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/rust-mode/test-module b/users/grfn/emacs.d/snippets/rust-mode/test-module
deleted file mode 100644
index bfa2ca2d1881..000000000000
--- a/users/grfn/emacs.d/snippets/rust-mode/test-module
+++ /dev/null
@@ -1,11 +0,0 @@
-# -*- mode: snippet -*-
-# name: test-module
-# uuid: test-module
-# key: tmod
-# condition: t
-# --
-mod $1 {
-    use super::*;
-
-    $0
-}
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/rust-mode/tests b/users/grfn/emacs.d/snippets/rust-mode/tests
deleted file mode 100644
index 0a476ab58661..000000000000
--- a/users/grfn/emacs.d/snippets/rust-mode/tests
+++ /dev/null
@@ -1,9 +0,0 @@
-# key: tests
-# name: test module
-# --
-#[cfg(test)]
-mod ${1:tests} {
-    use super::*;
-
-    $0
-}
diff --git a/users/grfn/emacs.d/snippets/snippet-mode/indent b/users/grfn/emacs.d/snippets/snippet-mode/indent
deleted file mode 100644
index d38ffceafbad..000000000000
--- a/users/grfn/emacs.d/snippets/snippet-mode/indent
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- mode: snippet -*-
-# name: indent
-# key: indent
-# --
-# expand-env: ((yas-indent-line 'fixed))
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/sql-mode/count(*) group by b/users/grfn/emacs.d/snippets/sql-mode/count(*) group by
deleted file mode 100644
index 6acc46ff397a..000000000000
--- a/users/grfn/emacs.d/snippets/sql-mode/count(*) group by
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- mode: snippet -*-
-# name: count(*) group by
-# key: countby
-# --
-SELECT count(*), ${1:column} FROM ${2:table} GROUP BY $1;
diff --git a/users/grfn/emacs.d/snippets/terraform-mode/variable b/users/grfn/emacs.d/snippets/terraform-mode/variable
deleted file mode 100644
index 14822f1a05a8..000000000000
--- a/users/grfn/emacs.d/snippets/terraform-mode/variable
+++ /dev/null
@@ -1,11 +0,0 @@
-# -*- mode: snippet -*-
-# name: variable
-# uuid: variable
-# key: var
-# condition: t
-# --
-variable "${1:name}" {
-  type = ${2:string}
-  ${3:default = ${4:default}}
-}
-$0
\ No newline at end of file
diff --git a/users/grfn/emacs.d/snippets/text-mode/date b/users/grfn/emacs.d/snippets/text-mode/date
deleted file mode 100644
index 7b9431147011..000000000000
--- a/users/grfn/emacs.d/snippets/text-mode/date
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- coding: utf-8 -*-
-# name: date
-# key: date
-# --
-`(format-time-string "%Y-%m-%d")`$0
\ No newline at end of file
diff --git a/users/grfn/emacs.d/splitjoin.el b/users/grfn/emacs.d/splitjoin.el
deleted file mode 100644
index dbc9704d7909..000000000000
--- a/users/grfn/emacs.d/splitjoin.el
+++ /dev/null
@@ -1,192 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(require 'dash)
-(load! "utils")
-
-;;;
-;;; Vars
-;;;
-
-(defvar +splitjoin/split-callbacks '()
-  "Alist mapping major mode symbol names to lists of split callbacks")
-
-(defvar +splitjoin/join-callbacks '()
-  "Alist mapping major mode symbol names to lists of join callbacks")
-
-
-
-;;;
-;;; Definition macros
-;;;
-
-(defmacro +splitjoin/defsplit (mode name &rest body)
-  `(setf
-    (alist-get ',name (alist-get ,mode +splitjoin/split-callbacks))
-    (λ! () ,@body)))
-
-(defmacro +splitjoin/defjoin (mode name &rest body)
-  `(setf
-    (alist-get ',name (alist-get ,mode +splitjoin/join-callbacks))
-    (λ! () ,@body)))
-
-;;;
-;;; Commands
-;;;
-
-(defun +splitjoin/split ()
-  (interactive)
-  (when-let (callbacks (->> +splitjoin/split-callbacks
-                            (alist-get major-mode)
-                            (-map #'cdr)))
-    (find-if #'funcall callbacks)))
-
-(defun +splitjoin/join ()
-  (interactive)
-  (when-let (callbacks (->> +splitjoin/join-callbacks
-                            (alist-get major-mode)
-                            (-map #'cdr)))
-    (find-if #'funcall callbacks)))
-
-
-;;;
-;;; Splits and joins
-;;; TODO: this should probably go in a file-per-language
-;;;
-
-(+splitjoin/defjoin
- 'elixir-mode
- join-do
- (let* ((function-pattern (rx (and (zero-or-more whitespace)
-                                   "do"
-                                   (zero-or-more whitespace)
-                                   (optional (and "#" (zero-or-more anything)))
-                                   eol)))
-        (end-pattern (rx bol
-                         (zero-or-more whitespace)
-                         "end"
-                         (zero-or-more whitespace)
-                         eol))
-        (else-pattern (rx bol
-                         (zero-or-more whitespace)
-                         "else"
-                         (zero-or-more whitespace)
-                         eol))
-        (lineno     (line-number-at-pos))
-        (line       (thing-at-point 'line t)))
-   (when-let ((do-start-pos (string-match function-pattern line)))
-     (cond
-      ((string-match-p end-pattern (get-line (inc lineno)))
-       (modify-then-indent
-        (goto-line-char do-start-pos)
-        (insert ",")
-        (goto-char (line-end-position))
-        (insert ": nil")
-        (line-move 1)
-        (delete-line))
-       t)
-
-      ((string-match-p end-pattern (get-line (+ 2 lineno)))
-       (modify-then-indent
-        (goto-line-char do-start-pos)
-        (insert ",")
-        (goto-char (line-end-position))
-        (insert ":")
-        (join-line t)
-        (line-move 1)
-        (delete-line))
-       t)
-
-      ((and (string-match-p else-pattern (get-line (+ 2 lineno)))
-            (string-match-p end-pattern  (get-line (+ 4 lineno))))
-       (modify-then-indent
-        (goto-line-char do-start-pos)
-        (insert ",")
-        (goto-char (line-end-position))
-        (insert ":")
-        (join-line t)
-        (goto-eol)
-        (insert ",")
-        (join-line t)
-        (goto-eol)
-        (insert ":")
-        (join-line t)
-        (line-move 1)
-        (delete-line))
-       t)))))
-
-(comment
- (string-match (rx (and bol
-                        "if "
-                        (one-or-more anything)
-                        ","
-                        (zero-or-more whitespace)
-                        "do:"
-                        (one-or-more anything)
-                        ","
-                        (zero-or-more whitespace)
-                        "else:"
-                        (one-or-more anything)))
-               "if 1, do: nil, else: nil")
-
- )
-
-(+splitjoin/defsplit
- 'elixir-mode
- split-do-with-optional-else
- (let* ((if-with-else-pattern (rx (and bol
-                                       (one-or-more anything)
-                                       ","
-                                       (zero-or-more whitespace)
-                                       "do:"
-                                       (one-or-more anything)
-                                       (optional
-                                        ","
-                                        (zero-or-more whitespace)
-                                        "else:"
-                                        (one-or-more anything)))))
-        (current-line (get-line)))
-   (when (string-match if-with-else-pattern current-line)
-     (modify-then-indent
-      (assert (goto-regex-on-line ",[[:space:]]*do:"))
-      (delete-char 1)
-      (assert (goto-regex-on-line ":"))
-      (delete-char 1)
-      (insert "\n")
-      (when (goto-regex-on-line-r ",[[:space:]]*else:")
-        (delete-char 1)
-        (insert "\n")
-        (assert (goto-regex-on-line ":"))
-        (delete-char 1)
-        (insert "\n"))
-      (goto-eol)
-      (insert "\nend"))
-     t)))
-
-(comment
- (+splitjoin/defsplit 'elixir-mode split-def
- (let ((function-pattern (rx (and ","
-                                  (zero-or-more whitespace)
-                                  "do:")))
-       (line (thing-at-point 'line t)))
-   (when-let (idx (string-match function-pattern line))
-     (let ((beg (line-beginning-position))
-           (orig-line-char (- (point) (line-beginning-position))))
-       (save-mark-and-excursion
-        (goto-line-char idx)
-        (delete-char 1)
-        (goto-line-char (string-match ":" (thing-at-point 'line t)))
-        (delete-char 1)
-        (insert "\n")
-        (goto-eol)
-        (insert "\n")
-        (insert "end")
-        (evil-indent beg (+ (line-end-position) 1))))
-     (goto-line-char orig-line-char)
-     t))))
-
-(+splitjoin/defjoin
- 'elixir-mode
- join-if-with-else
- (let* ((current-line (thing-at-point 'line)))))
-
-(provide 'splitjoin)
diff --git a/users/grfn/emacs.d/sql-strings.el b/users/grfn/emacs.d/sql-strings.el
deleted file mode 100644
index eef397a24ea6..000000000000
--- a/users/grfn/emacs.d/sql-strings.el
+++ /dev/null
@@ -1,75 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-;;; https://www.emacswiki.org/emacs/StringAtPoint
-(defun ourcomments-string-or-comment-bounds-1 (what)
-  (save-restriction
-    (widen)
-    (let* ((here (point))
-           ;; Fix-me: when on end-point, how to handle that and which should be last hit point?
-           (state (parse-partial-sexp (point-min) (1+ here)))
-           (type (if (nth 3 state)
-                     'string
-                   (if (nth 4 state)
-                       'comment)))
-           (start (when type (nth 8 state)))
-           end)
-      (unless start
-        (setq state (parse-partial-sexp (point-min) here))
-        (setq type (if (nth 3 state)
-                       'string
-                     (if (nth 4 state)
-                         'comment)))
-        (setq start (when type (nth 8 state))))
-      (unless (or (not what)
-                  (eq what type))
-        (setq start nil))
-      (if (not start)
-          (progn
-            (goto-char here)
-            nil)
-        (setq state (parse-partial-sexp (1+ start) (point-max)
-                                        nil nil state 'syntax-table))
-        (setq end (point))
-        (goto-char here)
-        (cons start end)))))
-
-(defun ourcomments-bounds-of-string-at-point ()
-  "Return bounds of string at point if any."
-  (ourcomments-string-or-comment-bounds-1 'string))
-
-(put 'string 'bounds-of-thing-at-point 'ourcomments-bounds-of-string-at-point)
-
-(defun -sanitize-sql-string (str)
-  (->> str
-       (downcase)
-       (s-trim)
-       (replace-regexp-in-string
-        (rx (or (and string-start (or "\"\"\""
-                                      "\""))
-                (and (or "\"\"\""
-                         "\"")
-                     string-end)))
-        "")
-       (s-trim)))
-
-(defun sql-string-p (str)
-  "Returns 't if STR looks like a string literal for a SQL statement"
-  (setq str (-sanitize-sql-string str))
-  (or (s-starts-with? "select" str)))
-
-;;; tests
-
-(require 'ert)
-
-(ert-deftest sanitize-sql-string-test ()
-  (should (string-equal "select * from foo;"
-                        (-sanitize-sql-string
-                         "\"\"\"SELECT * FROM foo;\n\n\"\"\""))))
-
-(ert-deftest test-sql-string-p ()
-  (dolist (str '("SELECT * FROM foo;"
-                 "select * from foo;"))
-    (should (sql-string-p str)))
-
-  (dolist (str '("not a QUERY"))
-    (should-not (sql-string-p str))))
diff --git a/users/grfn/emacs.d/terraform.el b/users/grfn/emacs.d/terraform.el
deleted file mode 100644
index 2d69c9bad9db..000000000000
--- a/users/grfn/emacs.d/terraform.el
+++ /dev/null
@@ -1,31 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(add-hook 'terraform-mode-hook #'terraform-format-on-save-mode)
-
-(defun packer-format-buffer ()
-  (interactive)
-  (let ((buf (get-buffer-create "*packer-fmt*")))
-    (if (zerop (call-process-region (point-min) (point-max)
-                "packer" nil buf nil "fmt" "-"))
-        (let ((point (point))
-              (window-start (window-start)))
-          (erase-buffer)
-          (insert-buffer-substring buf)
-          (goto-char point)
-          (set-window-start nil window-start))
-      (message "packer fmt failed: %s" (with-current-buffer buf (buffer-string))))
-    (kill-buffer buf)))
-
-(define-minor-mode packer-format-on-save-mode
-  "Run packer-format-buffer before saving the current buffer"
-  :lighter nil
-  (if packer-format-on-save-mode
-      (add-hook 'before-save-hook #'packer-format-buffer nil t)
-    (remove-hook 'before-save-hook #'packer-format-buffer t)))
-
-(defun maybe-init-packer ()
-  (interactive)
-  (when (s-ends-with-p ".pkr" (file-name-base (buffer-file-name)))
-    (packer-format-on-save-mode)))
-
-(add-hook 'hcl-mode-hook #'maybe-init-packer)
diff --git a/users/grfn/emacs.d/tests/splitjoin_test.el b/users/grfn/emacs.d/tests/splitjoin_test.el
deleted file mode 100644
index 6495a1a5952e..000000000000
--- a/users/grfn/emacs.d/tests/splitjoin_test.el
+++ /dev/null
@@ -1,68 +0,0 @@
-;;; private/grfn/tests/splitjoin_test.el -*- lexical-binding: t; -*-
-
-(require 'ert)
-;; (load! 'splitjoin)
-;; (load! 'utils)
-; (require 'splitjoin)
-
-;;; Helpers
-
-(defvar *test-buffer* nil)
-(make-variable-buffer-local '*test-buffer*)
-
-(defun test-buffer ()
-  (when (not *test-buffer*)
-    (setq *test-buffer* (get-buffer-create "test-buffer")))
-  *test-buffer*)
-
-(defmacro with-test-buffer (&rest body)
-  `(with-current-buffer (test-buffer)
-     ,@body))
-
-(defun set-test-buffer-mode (mode)
-  (let ((mode (if (functionp mode) mode
-                (-> mode symbol-name (concat "-mode") intern))))
-    (assert (functionp mode))
-    (with-test-buffer (funcall mode))))
-
-(defmacro set-test-buffer-contents (contents)
-  (with-test-buffer
-   (erase-buffer)
-   (insert contents)))
-
-(defun test-buffer-contents ()
-  (with-test-buffer (substring-no-properties (buffer-string))))
-
-(defmacro assert-test-buffer-contents (expected-contents)
-  `(should (equal (string-trim (test-buffer-contents))
-                  (string-trim ,expected-contents))))
-
-(defmacro should-join-to (mode original-contents expected-contents)
-  `(progn
-     (set-test-buffer-mode ,mode)
-     (set-test-buffer-contents ,original-contents)
-     (with-test-buffer (+splitjoin/join))
-     (assert-test-buffer-contents ,expected-contents)))
-
-(defmacro should-split-to (mode original-contents expected-contents)
-  `(progn
-     (set-test-buffer-mode ,mode)
-     (set-test-buffer-contents ,original-contents)
-     (with-test-buffer (+splitjoin/split))
-     (assert-test-buffer-contents ,expected-contents)))
-
-(defmacro should-splitjoin (mode joined-contents split-contents)
-  `(progn
-     (should-split-to ,mode ,joined-contents ,split-contents)
-     (should-join-to  ,mode ,split-contents  ,joined-contents)))
-
-;;; Tests
-
-;; Elixir
-(ert-deftest elixir-if-splitjoin-test ()
-  (should-splitjoin 'elixir
-   "if predicate?(), do: result"
-   "if predicate?() do
-  result
-end"))
-
diff --git a/users/grfn/emacs.d/themes/grfn-solarized-light-theme.el b/users/grfn/emacs.d/themes/grfn-solarized-light-theme.el
deleted file mode 100644
index ae00b6b5fc75..000000000000
--- a/users/grfn/emacs.d/themes/grfn-solarized-light-theme.el
+++ /dev/null
@@ -1,115 +0,0 @@
-(require 'solarized)
-(eval-when-compile
-  (require 'solarized-palettes))
-
-;; (defun grfn-solarized-theme ()
-;;   (custom-theme-set-faces
-;;    theme-name
-;;    `(font-lock-doc-face ((,class (:foreground ,s-base1))))
-;;    `(font-lock-preprocessor-face ((,class (:foreground ,red))))
-;;    `(font-lock-keyword-face ((,class (:foreground ,green))))
-
-;;    `(elixir-attribute-face ((,class (:foreground ,blue))))
-;;    `(elixir-atom-face ((,class (:foreground ,cyan))))))
-
-(setq +solarized-s-base03    "#002b36"
-      +solarized-s-base02    "#073642"
-      ;; emphasized content
-      +solarized-s-base01    "#586e75"
-      ;; primary content
-      +solarized-s-base00    "#657b83"
-      +solarized-s-base0     "#839496"
-      ;; comments
-      +solarized-s-base1     "#93a1a1"
-      ;; background highlight light
-      +solarized-s-base2     "#eee8d5"
-      ;; background light
-      +solarized-s-base3     "#fdf6e3"
-
-      ;; Solarized accented colors
-      +solarized-yellow    "#b58900"
-      +solarized-orange    "#cb4b16"
-      +solarized-red       "#dc322f"
-      +solarized-magenta   "#d33682"
-      +solarized-violet    "#6c71c4"
-      +solarized-blue      "#268bd2"
-      +solarized-cyan      "#2aa198"
-      +solarized-green     "#859900"
-
-      ;; Darker and lighter accented colors
-      ;; Only use these in exceptional circumstances!
-      +solarized-yellow-d  "#7B6000"
-      +solarized-yellow-l  "#DEB542"
-      +solarized-orange-d  "#8B2C02"
-      +solarized-orange-l  "#F2804F"
-      +solarized-red-d     "#990A1B"
-      +solarized-red-l     "#FF6E64"
-      +solarized-magenta-d "#93115C"
-      +solarized-magenta-l "#F771AC"
-      +solarized-violet-d  "#3F4D91"
-      +solarized-violet-l  "#9EA0E5"
-      +solarized-blue-d    "#00629D"
-      +solarized-blue-l    "#69B7F0"
-      +solarized-cyan-d    "#00736F"
-      +solarized-cyan-l    "#69CABF"
-      +solarized-green-d   "#546E00"
-      +solarized-green-l "#B4C342")
-
-
-(deftheme grfn-solarized-light "The light variant of Griffin's solarized theme")
-
-(setq grfn-solarized-faces
-      '("Griffin's solarized theme customization"
-        (custom-theme-set-faces
-         theme-name
-         `(font-lock-doc-face ((t (:foreground ,+solarized-s-base1))))
-         `(font-lock-preprocessor-face ((t (:foreground ,+solarized-red))))
-         `(font-lock-keyword-face ((t (:foreground ,+solarized-green))))
-
-         `(elixir-attribute-face ((t (:foreground ,+solarized-blue))))
-         `(elixir-atom-face ((t (:foreground ,+solarized-cyan))))
-         `(agda2-highlight-keyword-face ((t (:foreground ,green))))
-         `(agda2-highlight-string-face ((t (:foreground ,cyan))))
-         `(agda2-highlight-number-face ((t (:foreground ,violet))))
-         `(agda2-highlight-symbol-face ((((background ,base3)) (:foreground ,base01))))
-         `(agda2-highlight-primitive-type-face ((t (:foreground ,blue))))
-         `(agda2-highlight-bound-variable-face ((t nil)))
-         `(agda2-highlight-inductive-constructor-face ((t (:foreground ,green))))
-         `(agda2-highlight-coinductive-constructor-face ((t (:foreground ,yellow))))
-         `(agda2-highlight-datatype-face ((t (:foreground ,blue))))
-         `(agda2-highlight-field-face ((t (:foreground ,red))))
-         `(agda2-highlight-function-face ((t (:foreground ,blue))))
-         `(agda2-highlight-module-face ((t (:foreground ,yellow))))
-         `(agda2-highlight-postulate-face ((t (:foreground ,blue))))
-         `(agda2-highlight-primitive-face ((t (:foreground ,blue))))
-         `(agda2-highlight-record-face ((t (:foreground ,blue))))
-         `(agda2-highlight-dotted-face ((t nil)))
-         `(agda2-highlight-operator-face ((t nil)))
-         `(agda2-highlight-error-face ((t (:foreground ,red :underline t))))
-         `(agda2-highlight-unsolved-meta-face ((t (:background ,base2))))
-         `(agda2-highlight-unsolved-constraint-face ((t (:background ,base2))))
-         `(agda2-highlight-termination-problem-face ((t (:background ,orange :foreground ,base03))))
-         `(agda2-highlight-incomplete-pattern-face ((t (:background ,orange :foreground ,base03))))
-         `(agda2-highlight-typechecks-face ((t (:background ,cyan :foreground ,base03))))
-
-         `(font-lock-doc-face ((t (:foreground ,+solarized-s-base1))))
-         `(font-lock-preprocessor-face ((t (:foreground ,+solarized-red))))
-         `(font-lock-keyword-face ((t (:foreground ,+solarized-green :bold nil))))
-         `(font-lock-builtin-face ((t (:foreground ,+solarized-s-base01
-                                                  :bold t))))
-
-         `(elixir-attribute-face ((t (:foreground ,+solarized-blue))))
-         `(elixir-atom-face ((t (:foreground ,+solarized-cyan))))
-         `(linum ((t (:background ,+solarized-s-base2 :foreground ,+solarized-s-base1))))
-         `(line-number ((t (:background ,+solarized-s-base2 :foreground ,+solarized-s-base1))))
-
-         `(haskell-operator-face ((t (:foreground ,+solarized-green))))
-         `(haskell-keyword-face ((t (:foreground ,+solarized-cyan))))
-
-         `(org-drawer ((t (:foreground ,+solarized-s-base1
-                                      :bold t)))))))
-
-(solarized-with-color-variables
-  'light 'grfn-solarized-light solarized-light-color-palette-alist)
-
-(provide-theme 'grfn-solarized-light)
diff --git a/users/grfn/emacs.d/utils.el b/users/grfn/emacs.d/utils.el
deleted file mode 100644
index 21192753a268..000000000000
--- a/users/grfn/emacs.d/utils.el
+++ /dev/null
@@ -1,114 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-
-;; Elisp Extras
-
-(defmacro comment (&rest _body)
-  "Comment out one or more s-expressions"
-  nil)
-
-(defun inc (x) "Returns x + 1" (+ 1 x))
-(defun dec (x) "Returns x - 1" (- x 1))
-
-(defun average (ns)
-  "Arithmetic mean of xs"
-  (if (null ns) nil
-    (/ (apply #'+ ns)
-       (length ns))))
-
-(comment
- (average (list 1 2 3 4))
- )
-
-;;
-;; Text editing utils
-;;
-
-;; Reading strings
-
-(defun get-char (&optional point)
-  "Get the character at the given `point' (defaulting to the current point),
-without properties"
-  (let ((point (or point (point))))
-    (buffer-substring-no-properties point (+ 1 point))))
-
-(defun get-line (&optional lineno)
-  "Read the line number `lineno', or the current line if `lineno' is nil, and
-return it as a string stripped of all text properties"
-  (let ((current-line (line-number-at-pos)))
-    (if (or (not lineno)
-            (= current-line lineno))
-        (thing-at-point 'line t)
-      (save-mark-and-excursion
-       (line-move (- lineno (line-number-at-pos)))
-       (thing-at-point 'line t)))))
-
-(defun get-line-point ()
-  "Get the position in the current line of the point"
-  (- (point) (line-beginning-position)))
-
-;; Moving in the file
-
-(defun goto-line-char (pt)
-  "Moves the point to the given position expressed as an offset from the start
-of the line"
-  (goto-char (+ (line-beginning-position) pt)))
-
-(defun goto-eol ()
-  "Moves to the end of the current line"
-  (goto-char (line-end-position)))
-
-(defun goto-regex-on-line (regex)
-  "Moves the point to the first occurrence of `regex' on the current line.
-Returns nil if the regex did not match, non-nil otherwise"
-  (when-let ((current-line (get-line))
-             (line-char (string-match regex current-line)))
-    (goto-line-char line-char)))
-
-(defun goto-regex-on-line-r (regex)
-  "Moves the point to the *last* occurrence of `regex' on the current line.
-Returns nil if the regex did not match, non-nil otherwise"
-  (when-let ((current-line (get-line))
-             (modified-regex (concat ".*\\(" regex "\\)"))
-             (_ (string-match modified-regex current-line))
-             (match-start (match-beginning 1)))
-    (goto-line-char match-start)))
-
-(comment
- (progn
-   (string-match (rx (and (zero-or-more anything)
-                          (group "foo" "foo")))
-                 "foofoofoo")
-   (match-beginning 1)))
-
-;; Changing file contents
-
-(defun delete-line ()
-  "Remove the line at the current point"
-  (delete-region (line-beginning-position)
-                 (inc (line-end-position))))
-
-(defmacro modify-then-indent (&rest body)
-  "Modify text in the buffer according to body, then re-indent from where the
-  cursor started to where the cursor ended up, then return the cursor to where
-  it started."
-  `(let ((beg (line-beginning-position))
-         (orig-line-char (- (point) (line-beginning-position))))
-     (atomic-change-group
-       (save-mark-and-excursion
-        ,@body
-        (evil-indent beg (+ (line-end-position) 1))))
-     (goto-line-char orig-line-char)))
-
-(pcase-defmacro s-starts-with (prefix)
-  `(pred (s-starts-with-p ,prefix)))
-
-(pcase-defmacro s-contains (needle &optional ignore-case)
-  `(pred (s-contains-p ,needle
-                       ,@(when ignore-case (list ignore-case)))))
-
-(comment
- (pcase "foo"
-   ((s-contains "bar") 1)
-   ((s-contains "o") 2))
- )
diff --git a/users/grfn/emacs.d/vterm.el b/users/grfn/emacs.d/vterm.el
deleted file mode 100644
index a7fdea46da32..000000000000
--- a/users/grfn/emacs.d/vterm.el
+++ /dev/null
@@ -1,24 +0,0 @@
-;;; -*- lexical-binding: t; -*-
-
-(defun require-vterm ()
-  (add-to-list
-   'load-path
-   (concat
-    (s-trim
-     (shell-command-to-string
-      "nix-build --no-out-link ~/code/depot -A third_party.emacs.vterm"))
-    "/share/emacs/site-lisp/elpa/vterm-20200515.1412"))
-  (require 'vterm))
-
-(defun +grfn/vterm-setup ()
-  (hide-mode-line-mode)
-  (setq-local evil-collection-vterm-send-escape-to-vterm-p t))
-
-(add-hook 'vterm-mode-hook #'+grfn/vterm-setup)
-
-(map! (:map vterm-mode-map
-       "<C-escape>" #'evil-normal-state))
-
-(comment
- (require-vterm)
- )