about summary refs log tree commit diff
path: root/users/grfn/emacs.d/+bindings.el
diff options
context:
space:
mode:
Diffstat (limited to 'users/grfn/emacs.d/+bindings.el')
-rw-r--r--users/grfn/emacs.d/+bindings.el1439
1 files changed, 0 insertions, 1439 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"))))