diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 959148fe5..3d41520af 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -1,15 +1,38 @@ ;;; config/default/+bindings.el -*- lexical-binding: t; -*- -;; This file defines a Spacemacs-esque keybinding scheme +(when (featurep! :editor evil +everywhere) + ;; Have C-u behave similarly to `doom/backward-to-bol-or-indent'. + ;; NOTE SPC u replaces C-u as the universal argument. + (map! :gi "C-u" #'doom/backward-kill-to-bol-and-indent + :gi "C-w" #'backward-kill-word + ;; Vimmish ex motion keys + :gi "C-b" #'backward-word + :gi "C-f" #'forward-word) -;; Don't let evil-collection interfere with certain keys -(appendq! evil-collection-key-blacklist - '("gd" "gf" "K" "[" "]" "gz" "")) + ;; Minibuffer + (define-key! evil-ex-completion-map + "C-a" #'move-beginning-of-line + "C-b" #'backward-word + "C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history)) -(defadvice! +default-evil-collection-disable-blacklist-a (orig-fn) - :around #'evil-collection-vterm-toggle-send-escape ; allow binding to ESC - (let (evil-collection-key-blacklist) - (apply orig-fn))) + (define-key! :keymaps +default-minibuffer-maps + [escape] #'abort-recursive-edit + "C-v" #'yank + "C-z" (λ! (ignore-errors (call-interactively #'undo))) + "C-a" #'move-beginning-of-line + "C-b" #'backward-word + "C-r" #'evil-paste-from-register + ;; Scrolling lines + "C-j" #'next-line + "C-k" #'previous-line + "C-S-j" #'scroll-up-command + "C-S-k" #'scroll-down-command) + + (define-key! read-expression-map + "C-j" #'next-line-or-history-element + "C-k" #'previous-line-or-history-element)) ;; @@ -20,176 +43,51 @@ (and (featurep! :editor snippets) (bound-and-true-p yas-minor-mode) (yas-maybe-expand-abbrev-key-filter 'yas-expand)) - 'yas-expand + #'yas-expand (and (featurep! :completion company +tng) (+company-has-completion-p)) - '+company/complete) + #'+company/complete) :n [tab] (general-predicate-dispatch nil (and (featurep! :editor fold) (save-excursion (end-of-line) (invisible-p (point)))) - '+fold/toggle + #'+fold/toggle (fboundp 'evil-jump-item) - 'evil-jump-item) + #'evil-jump-item) :v [tab] (general-predicate-dispatch nil (and (bound-and-true-p yas-minor-mode) (or (eq evil-visual-selection 'line) (not (memq (char-after) (list ?\( ?\[ ?\{ ?\} ?\] ?\)))))) - 'yas-insert-snippet + #'yas-insert-snippet (fboundp 'evil-jump-item) - 'evil-jump-item) + #'evil-jump-item) ;; Smarter newlines :i [remap newline] #'newline-and-indent ; auto-indent on newline :i "C-j" #'+default/newline ; default behavior - (:after vc-annotate - :map vc-annotate-mode-map - [remap quit-window] #'kill-current-buffer) - - (:map (help-mode-map helpful-mode-map) + (:after help :map help-mode-map :n "o" #'ace-link-help) - (:map apropos-mode-map + (:after helpful :map helpful-mode-map + :n "o" #'ace-link-help) + (:after info :map Info-mode-map + :n "o" #'ace-link-info) + (:after apropos :map apropos-mode-map :n "o" #'ace-link-help :n "TAB" #'forward-button :n [tab] #'forward-button :n [backtab] #'backward-button) - (:map Info-mode-map - :n "o" #'ace-link-info) + (:after view :map view-mode-map + [escape] #'View-quit-all) + (:after man :map Man-mode-map + :n "q" #'kill-current-buffer) + + :m "gs" #'+evil/easymotion ; lazy-load `evil-easymotion' ;; misc :n "C-S-f" #'toggle-frame-fullscreen :n "C-+" #'doom/reset-font-size - :n "C-=" #'doom/increase-font-size - :n "C--" #'doom/decrease-font-size - - ;; ported from vim - :m "]m" #'+evil/next-beginning-of-method - :m "[m" #'+evil/previous-beginning-of-method - :m "]M" #'+evil/next-end-of-method - :m "[M" #'+evil/previous-end-of-method - :m "]#" #'+evil/next-preproc-directive - :m "[#" #'+evil/previous-preproc-directive - :m "]*" #'+evil/next-comment - :m "[*" #'+evil/previous-comment - :m "]\\" #'+evil/next-comment - :m "[\\" #'+evil/previous-comment - :nv "z=" #'flyspell-correct-word-generic - :v "@" #'+evil:apply-macro - - ;; ported from vim-unimpaired - :n "] SPC" #'+evil/insert-newline-below - :n "[ SPC" #'+evil/insert-newline-above - :n "]b" #'next-buffer - :n "[b" #'previous-buffer - :n "]f" #'+evil/next-file - :n "[f" #'+evil/previous-file - :m "]u" #'+evil:url-encode - :m "[u" #'+evil:url-decode - :m "]y" #'+evil:c-string-encode - :m "[y" #'+evil:c-string-decode - ;; NOTE hl-todo-{next,previous} have ]t/[t, use ]F/[F instead - ;; NOTE {next,previous}-error have ]e/[e, use ddp/ddP or gx instead - (:when (featurep! :lang web) - :m "]x" #'+web:encode-html-entities - :m "[x" #'+web:decode-html-entities) - - ;; custom vim-unmpaired-esque keys - :m "]a" #'evil-forward-arg - :m "[a" #'evil-backward-arg - :m "]e" #'next-error - :m "[e" #'previous-error - :n "]F" #'+evil/next-frame - :n "[F" #'+evil/previous-frame - :m "]h" #'outline-next-visible-heading - :m "[h" #'outline-previous-visible-heading - :n "[o" #'+evil/insert-newline-above - :n "]o" #'+evil/insert-newline-below - :n "gp" #'+evil/reselect-paste - :v "gp" #'+evil/paste-preserve-register - :nv "g@" #'+evil:apply-macro - :nv "gc" #'evilnc-comment-operator - :nv "gx" #'evil-exchange - :nv "gy" #'+evil:yank-unindented - :n "g=" #'evil-numbers/inc-at-pt - :n "g-" #'evil-numbers/dec-at-pt - :v "g=" #'evil-numbers/inc-at-pt-incremental - :v "g-" #'evil-numbers/dec-at-pt-incremental - :v "g+" #'evil-numbers/inc-at-pt - - ;; custom evil keybinds - :n "zn" #'+evil:narrow-buffer - :n "zN" #'doom/widen-indirectly-narrowed-buffer - :n "zx" #'kill-current-buffer - :n "ZX" #'bury-buffer - ;; repeat in visual mode (FIXME buggy) - :v "." #'+evil:apply-macro - ;; don't leave visual mode after shifting - :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv - - ;; window management (prefix "C-w") - (:map evil-window-map - ;; Navigation - "C-h" #'evil-window-left - "C-j" #'evil-window-down - "C-k" #'evil-window-up - "C-l" #'evil-window-right - "C-w" #'other-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 - (:prefix "m" - "m" #'doom/window-maximize-buffer - "v" #'doom/window-maximize-vertically - "s" #'doom/window-maximize-horizontally) - "u" #'winner-undo - "C-u" #'winner-undo - "C-r" #'winner-redo - "o" #'doom/window-enlargen - ;; Delete window - "d" #'evil-window-delete - "C-C" #'ace-delete-window) - - ;; Plugins - ;; evil-easymotion - :m "gs" #'+evil/easymotion ; lazy-load `evil-easymotion' - (:after evil-easymotion - :map evilem-map - "a" (evilem-create #'evil-forward-arg) - "A" (evilem-create #'evil-backward-arg) - "s" #'evil-avy-goto-char-2 - "SPC" (λ!! #'evil-avy-goto-char-timer t) - "/" #'evil-avy-goto-char-timer) - - ;; text object plugins - :textobj "x" #'evil-inner-xml-attr #'evil-outer-xml-attr - :textobj "a" #'evil-inner-arg #'evil-outer-arg - :textobj "B" #'evil-textobj-anyblock-inner-block #'evil-textobj-anyblock-a-block - :textobj "c" #'evilnc-inner-comment #'evilnc-outer-commenter - :textobj "f" #'+evil:defun-txtobj #'+evil:defun-txtobj - :textobj "g" #'+evil:whole-buffer-txtobj #'+evil:whole-buffer-txtobj - :textobj "i" #'evil-indent-plus-i-indent #'evil-indent-plus-a-indent - :textobj "k" #'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 - - ;; evil-snipe - (:after evil-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) + :n "C-=" #'doom/increase-font-size + :n "C--" #'doom/decrease-font-size) ;; @@ -199,16 +97,6 @@ (map! (:when (featurep! :completion company) :i "C-@" #'+company/complete :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 - :i "C-p" #'+company/dabbrev-code-previous) (:after company (:map company-active-map "C-w" nil ; don't interfere with `evil-delete-backward-word' @@ -232,15 +120,13 @@ "C-j" #'company-select-next-or-abort "C-k" #'company-select-previous-or-abort "C-s" (λ! (company-search-abort) (company-filter-candidates)) - "ESC" #'company-search-abort) - ;; TAB auto-completion in term buffers - (:map comint-mode-map - "TAB" #'company-complete - [tab] #'company-complete))) + "ESC" #'company-search-abort)) + ;; TAB auto-completion in term buffers + (:after comint :map comint-mode-map + "TAB" #'company-complete + [tab] #'company-complete)) (:when (featurep! :completion ivy) - (:map (help-mode-map helpful-mode-map) - :n "Q" #'ivy-resume) (:after ivy :map ivy-minibuffer-map "C-SPC" #'ivy-call-and-recenter ; preview file @@ -253,98 +139,48 @@ [C-return] #'+ivy/git-grep-other-window-action)) (:when (featurep! :completion helm) - (:after helm - (:map helm-map - [left] #'left-char - [right] #'right-char - "C-S-n" #'helm-next-source - "C-S-p" #'helm-previous-source - "C-j" #'helm-next-line - "C-k" #'helm-previous-line - "C-S-j" #'helm-next-source - "C-S-k" #'helm-previous-source - "C-f" #'helm-next-page - "C-S-f" #'helm-previous-page - "C-u" #'helm-delete-minibuffer-contents - "C-w" #'backward-kill-word - "C-r" #'evil-paste-from-register ; Evil registers in helm! Glorious! - "C-s" #'helm-minibuffer-history - "C-b" #'backward-word - ;; Swap TAB and C-z - "TAB" #'helm-execute-persistent-action - [tab] #'helm-execute-persistent-action - "C-z" #'helm-select-action) - (:after helm-ag - :map helm-ag-map - "C--" #'+helm-do-ag-decrease-context - "C-=" #'+helm-do-ag-increase-context - [left] nil - [right] nil) - (:after helm-files - :map (helm-find-files-map helm-read-file-map) - [C-return] #'helm-ff-run-switch-other-window - "C-w" #'helm-find-files-up-one-level) - (:after helm-locate - :map helm-generic-files-map - [C-return] #'helm-ff-run-switch-other-window) - (:after helm-buffers - :map helm-buffer-map - [C-return] #'helm-buffer-switch-other-window) - (:after helm-occur - :map helm-occur-map - [C-return] #'helm-occur-run-goto-line-ow) - (:after helm-grep - :map helm-grep-map - [C-return] #'helm-grep-run-other-window-action)))) + (:after helm :map helm-map + [left] #'left-char + [right] #'right-char + "C-S-f" #'helm-previous-page + "C-S-n" #'helm-next-source + "C-S-p" #'helm-previous-source + "C-S-j" #'helm-next-source + "C-S-k" #'helm-previous-source + "C-j" #'helm-next-line + "C-k" #'helm-previous-line + "C-u" #'helm-delete-minibuffer-contents + "C-s" #'helm-minibuffer-history + ;; Swap TAB and C-z + "TAB" #'helm-execute-persistent-action + [tab] #'helm-execute-persistent-action + "C-z" #'helm-select-action) + (:after helm-ag :map helm-ag-map + "C--" #'+helm-do-ag-decrease-context + "C-=" #'+helm-do-ag-increase-context + [left] nil + [right] nil) + (:after helm-files :map (helm-find-files-map helm-read-file-map) + [C-return] #'helm-ff-run-switch-other-window + "C-w" #'helm-find-files-up-one-level) + (:after helm-locate :map helm-generic-files-map + [C-return] #'helm-ff-run-switch-other-window) + (:after helm-buffers :map helm-buffer-map + [C-return] #'helm-buffer-switch-other-window) + (:after helm-occur :map helm-occur-map + [C-return] #'helm-occur-run-goto-line-ow) + (:after helm-grep :map helm-grep-map + [C-return] #'helm-grep-run-other-window-action))) ;;; :ui -(map! (:when (featurep! :ui hl-todo) - :m "]t" #'hl-todo-next - :m "[t" #'hl-todo-previous) - - (:when (featurep! :ui neotree) - :after neotree - :map neotree-mode-map - :n "g" nil - :n "TAB" #'neotree-quick-look - :n "RET" #'neotree-enter - :n [tab] #'neotree-quick-look - :n [return] #'neotree-enter - :n "DEL" #'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) - - (:when (featurep! :ui popup) +(map! (:when (featurep! :ui popup) :n "C-`" #'+popup/toggle :n "C-~" #'+popup/raise :g "C-x p" #'+popup/other) - (:when (featurep! :ui vc-gutter) - :m "]d" #'git-gutter:next-hunk - :m "[d" #'git-gutter:previous-hunk) - (:when (featurep! :ui workspaces) - :n "gt" #'+workspace:switch-next - :n "gT" #'+workspace:switch-previous - :n "]w" #'+workspace/switch-right - :n "[w" #'+workspace/switch-left + :n "C-t" #'+workspace/new + :n "C-S-t" #'+workspace/display :g "M-1" #'+workspace/switch-to-0 :g "M-2" #'+workspace/switch-to-1 :g "M-3" #'+workspace/switch-to-2 @@ -355,8 +191,6 @@ :g "M-8" #'+workspace/switch-to-7 :g "M-9" #'+workspace/switch-to-8 :g "M-0" #'+workspace/switch-to-final - :n "C-t" #'+workspace/new - :n "C-S-t" #'+workspace/display (:when IS-MAC :g "s-t" #'+workspace/new :g "s-T" #'+workspace/display @@ -372,36 +206,13 @@ :n "s-0" #'+workspace/switch-to-final))) ;;; :editor -(map! (:when (featurep! :editor fold) - :nv "C-SPC" #'+fold/toggle) +(map! (:when (featurep! :editor format) + :n "gQ" #'+format:region) - (:when (featurep! :editor format) - :n "gQ" #'+format:region) + (:when (featurep! :editor rotate-text) + :n "!" #'rotate-text) (:when (featurep! :editor multiple-cursors) - ;; evil-mc - (:prefix "gz" - :nv "d" #'evil-mc-make-and-goto-next-match - :nv "D" #'evil-mc-make-and-goto-prev-match - :nv "j" #'evil-mc-make-cursor-move-next-line - :nv "k" #'evil-mc-make-cursor-move-prev-line - :nv "m" #'evil-mc-make-all-cursors - :nv "n" #'evil-mc-make-and-goto-next-cursor - :nv "N" #'evil-mc-make-and-goto-last-cursor - :nv "p" #'evil-mc-make-and-goto-prev-cursor - :nv "P" #'evil-mc-make-and-goto-first-cursor - :nv "q" #'evil-mc-undo-all-cursors - :nv "t" #'+multiple-cursors/evil-mc-toggle-cursors - :nv "u" #'evil-mc-undo-last-added-cursor - :nv "z" #'+multiple-cursors/evil-mc-make-cursor-here - :v "I" #'evil-mc-make-cursor-in-visual-selection-beg - :v "A" #'evil-mc-make-cursor-in-visual-selection-end) - (: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 @@ -414,106 +225,16 @@ "M-d" #'evil-multiedit-match-and-next "M-D" #'evil-multiedit-match-and-prev "RET" #'evil-multiedit-toggle-or-restrict-region - [return] #'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))) - - (:when (featurep! :editor rotate-text) - :n "!" #'rotate-text) + [return] #'evil-multiedit-toggle-or-restrict-region))) (:when (featurep! :editor snippets) ;; auto-yasnippet :i [C-tab] #'aya-expand - :nv [C-tab] #'aya-create - ;; 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 - [backspace] #'+snippets/delete-backward-char - [delete] #'+snippets/delete-forward-char-or-field)))) - -;;; :emacs -(map! (:when (featurep! :emacs vc) - :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)) + :nv [C-tab] #'aya-create)) ;;; :tools -(map! (:when (featurep! :tools eval) - :g "M-r" #'+eval/buffer - :nv "gr" #'+eval:region - :n "gR" #'+eval/buffer - :v "gR" #'+eval:replace-region) - - (:when (featurep! :tools flyspell) - ;; Keybinds that have no Emacs+evil analogues (i.e. don't exist): - ;; zq - mark word at point as good word - ;; zw - mark word at point as bad - ;; zu{q,w} - undo last marking - ;; Keybinds that evil define: - ;; z= - correct flyspell word at point - ;; ]s - jump to previous spelling error - ;; [s - jump to next spelling error - (:map flyspell-mouse-map - "RET" #'flyspell-correct-word-generic - [return] #'flyspell-correct-word-generic - [mouse-1] #'flyspell-correct-word-generic)) - - (:when (featurep! :tools flycheck) - (: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 - :n [return] #'flycheck-error-list-goto-error)) - - (:when (featurep! :tools gist) - :after gist - :map gist-list-menu-mode-map - :n "go" #'gist-browse-current-url - :n "gr" #'gist-list-reload - :n "c" #'gist-add-buffer - :n "d" #'gist-kill-current - :n "e" #'gist-edit-current-description - :n "f" #'gist-fork - :n "q" #'kill-current-buffer - :n "s" #'gist-star - :n "S" #'gist-unstar - :n "y" #'gist-print-current-url) - - (:when (featurep! :tools lookup) - :nv "K" #'+lookup/documentation - :nv "gd" #'+lookup/definition - :nv "gD" #'+lookup/references - :nv "gf" #'+lookup/file) - - (:when (featurep! :tools magit) - (:after evil-magit - ;; fix conflicts with private bindings - :map (magit-status-mode-map magit-revision-mode-map) - "C-j" nil - "C-k" nil) - (:map transient-map - "q" #'transient-quit-one))) - -;;; :lang -(map! (:when (featurep! :lang markdown) - :after markdown-mode - :map markdown-mode-map - ;; fix conflicts with private bindings - [backspace] nil)) +(when (featurep! :tools eval) + (map! "M-r" #'+eval/buffer)) ;; @@ -831,7 +552,8 @@ :desc "Save session to file" "S" #'doom/save-session :desc "Restore session from file" "L" #'doom/load-session :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore - :desc "Restart Emacs" "R" #'doom/restart) + :desc "Restart Emacs" "R" #'doom/restart + :desc "Restart emacs server" "d" #'+default/restart-server) ;;; r --- remote (:when (featurep! :tools upload) @@ -878,93 +600,3 @@ (:when (featurep! :lang org +pomodoro) :desc "Pomodoro timer" "t" #'org-pomodoro) :desc "Word-wrap mode" "w" #'+word-wrap-mode)) - - -;; -;;; Universal motion repeating keys - -(defvar +default-repeat-keys (cons ";" ",") - "The keys to use for repeating motions. - -This is a cons cell whose CAR is the key for repeating a motion forward, and -whose CDR is for repeating backward. They should both be kbd-able strings.") - -(when +default-repeat-keys - (defmacro set-repeater! (command next-func prev-func) - "Makes ; and , the universal repeat-keys in evil-mode. -To change these keys see `+default-repeat-keys'." - (let ((fn-sym (intern (format "+default/repeat-%s" (doom-unquote command))))) - `(progn - (defun ,fn-sym (&rest _) - (evil-define-key* 'motion 'local - (kbd (car +default-repeat-keys)) #',next-func - (kbd (cdr +default-repeat-keys)) #',prev-func)) - (advice-add #',command :after-while #',fn-sym)))) - - ;; n/N - (set-repeater! evil-ex-search-next evil-ex-search-next evil-ex-search-previous) - (set-repeater! evil-ex-search-previous evil-ex-search-next evil-ex-search-previous) - (set-repeater! evil-ex-search-forward evil-ex-search-next evil-ex-search-previous) - (set-repeater! evil-ex-search-backward evil-ex-search-next evil-ex-search-previous) - - ;; f/F/t/T/s/S - (after! evil-snipe - (setq evil-snipe-repeat-keys nil - evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; - (set-repeater! evil-snipe-f evil-snipe-repeat evil-snipe-repeat-reverse) - (set-repeater! evil-snipe-F evil-snipe-repeat evil-snipe-repeat-reverse) - (set-repeater! evil-snipe-t evil-snipe-repeat evil-snipe-repeat-reverse) - (set-repeater! evil-snipe-T evil-snipe-repeat evil-snipe-repeat-reverse) - (set-repeater! evil-snipe-s evil-snipe-repeat evil-snipe-repeat-reverse) - (set-repeater! evil-snipe-S evil-snipe-repeat evil-snipe-repeat-reverse) - (set-repeater! evil-snipe-x evil-snipe-repeat evil-snipe-repeat-reverse) - (set-repeater! evil-snipe-X evil-snipe-repeat evil-snipe-repeat-reverse)) - - ;; */# - (set-repeater! evil-visualstar/begin-search-forward - evil-ex-search-next evil-ex-search-previous) - (set-repeater! evil-visualstar/begin-search-backward - evil-ex-search-previous evil-ex-search-next)) - - -;; -;;; Universal evil integration - -(when (featurep! :editor evil +everywhere) - ;; Have C-u behave similarly to `doom/backward-to-bol-or-indent'. - ;; NOTE SPC u replaces C-u as the universal argument. - (map! :gi "C-u" #'doom/backward-kill-to-bol-and-indent - :gi "C-w" #'backward-kill-word - ;; Vimmish ex motion keys - :gi "C-b" #'backward-word - :gi "C-f" #'forward-word) - - (after! view - (define-key view-mode-map [escape] #'View-quit-all)) - (after! man - (evil-define-key* 'normal Man-mode-map "q" #'kill-current-buffer)) - - ;; Minibuffer - (define-key! evil-ex-completion-map - "C-a" #'move-beginning-of-line - "C-b" #'backward-word - "C-s" (if (featurep! :completion ivy) - #'counsel-minibuffer-history - #'helm-minibuffer-history)) - - (define-key! :keymaps +default-minibuffer-maps - [escape] #'abort-recursive-edit - "C-v" #'yank - "C-z" (λ! (ignore-errors (call-interactively #'undo))) - "C-a" #'move-beginning-of-line - "C-b" #'backward-word - "C-r" #'evil-paste-from-register - ;; Scrolling lines - "C-j" #'next-line - "C-k" #'previous-line - "C-S-j" #'scroll-up-command - "C-S-k" #'scroll-down-command) - - (define-key! read-expression-map - "C-j" #'next-line-or-history-element - "C-k" #'previous-line-or-history-element)) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 464e82c4a..715a53ba1 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -7,9 +7,13 @@ minibuffer-local-must-match-map minibuffer-local-isearch-map read-expression-map - ,@(when (featurep! :completion ivy) - '(ivy-minibuffer-map - ivy-switch-buffer-map))) + ,@(cond ((featurep! :completion ivy) + '(ivy-minibuffer-map + ivy-switch-buffer-map)) + ((featurep! :completion helm) + '(helm-map + helm-ag-map + helm-read-file-map)))) "A list of all the keymaps used for the minibuffer.") diff --git a/modules/editor/evil/config.el b/modules/editor/evil/config.el index b9525bf03..5f832e6ee 100644 --- a/modules/editor/evil/config.el +++ b/modules/editor/evil/config.el @@ -3,6 +3,12 @@ ;; I'm a vimmer at heart. Its modal philosophy suits me better, and this module ;; strives to make Emacs a much better vim than vim was. +(defvar +evil-repeat-keys (cons ";" ",") + "The keys to use for universal repeating motions. + +This is a cons cell whose CAR is the key for repeating a motion forward, and +whose CDR is for repeating backward. They should both be kbd-able strings.") + (defvar +evil-want-o/O-to-continue-comments t "If non-nil, the o/O keys will continue comment lines if the point is on a line with a linewise comment.") @@ -171,11 +177,6 @@ directives. By default, this only recognizes C directives.") (evil-add-command-properties '+evil:align-right :ex-arg 'regexp-match) (evil-add-command-properties '+multiple-cursors:evil-mc :ex-arg 'regexp-global-match) - ;; `evil-collection' - (when (and (featurep! +everywhere) - (not doom-reloading-p)) - (load! "+everywhere")) - ;; Lazy load evil ex commands (delq! 'evil-ex features) (add-transient-hook! 'evil-ex (provide 'evil-ex)) @@ -329,3 +330,229 @@ directives. By default, this only recognizes C directives.") (use-package! exato :commands evil-outer-xml-attr evil-inner-xml-attr) + + +;; +;;; Keybinds + +(when +evil-repeat-keys + (defmacro set-repeater! (command next-func prev-func) + "Makes ; and , the universal repeat-keys in evil-mode. +To change these keys see `+evil-repeat-keys'." + (let ((fn-sym (intern (format "+default/repeat-%s" (doom-unquote command))))) + `(progn + (defun ,fn-sym (&rest _) + (evil-define-key* 'motion 'local + (kbd (car +evil-repeat-keys)) #',next-func + (kbd (cdr +evil-repeat-keys)) #',prev-func)) + (advice-add #',command :after-while #',fn-sym)))) + + ;; n/N + (set-repeater! evil-ex-search-next evil-ex-search-next evil-ex-search-previous) + (set-repeater! evil-ex-search-previous evil-ex-search-next evil-ex-search-previous) + (set-repeater! evil-ex-search-forward evil-ex-search-next evil-ex-search-previous) + (set-repeater! evil-ex-search-backward evil-ex-search-next evil-ex-search-previous) + + ;; f/F/t/T/s/S + (after! evil-snipe + (setq evil-snipe-repeat-keys nil + evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; + (set-repeater! evil-snipe-f evil-snipe-repeat evil-snipe-repeat-reverse) + (set-repeater! evil-snipe-F evil-snipe-repeat evil-snipe-repeat-reverse) + (set-repeater! evil-snipe-t evil-snipe-repeat evil-snipe-repeat-reverse) + (set-repeater! evil-snipe-T evil-snipe-repeat evil-snipe-repeat-reverse) + (set-repeater! evil-snipe-s evil-snipe-repeat evil-snipe-repeat-reverse) + (set-repeater! evil-snipe-S evil-snipe-repeat evil-snipe-repeat-reverse) + (set-repeater! evil-snipe-x evil-snipe-repeat evil-snipe-repeat-reverse) + (set-repeater! evil-snipe-X evil-snipe-repeat evil-snipe-repeat-reverse)) + + ;; */# + (set-repeater! evil-visualstar/begin-search-forward + evil-ex-search-next evil-ex-search-previous) + (set-repeater! evil-visualstar/begin-search-backward + evil-ex-search-previous evil-ex-search-next)) + + +;; `evil-collection' +(when (featurep! +everywhere) + (unless doom-reloading-p + (load! "+everywhere")) + + (setq evil-collection-company-use-tng (featurep! :completion company +tng)) + + ;; Don't let evil-collection interfere with certain keys + (appendq! evil-collection-key-blacklist + (append (when (featurep! :tools lookup) + '("gd" "gf" "K")) + (when (featurep! :tools eval) + '("gr" "gR")) + '("[" "]" "gz" ""))) + + (defadvice! +default-evil-collection-disable-blacklist-a (orig-fn) + :around #'evil-collection-vterm-toggle-send-escape ; allow binding to ESC + (let (evil-collection-key-blacklist) + (apply orig-fn)))) + +;; Keybinds that have no Emacs+evil analogues (i.e. don't exist): +;; zq - mark word at point as good word +;; zw - mark word at point as bad +;; zu{q,w} - undo last marking +;; Keybinds that evil define: +;; z= - correct flyspell word at point +;; ]s - jump to previous spelling error +;; [s - jump to next spelling error + +(map! :m "]m" #'+evil/next-beginning-of-method + :m "[m" #'+evil/previous-beginning-of-method + :m "]M" #'+evil/next-end-of-method + :m "[M" #'+evil/previous-end-of-method + :m "]#" #'+evil/next-preproc-directive + :m "[#" #'+evil/previous-preproc-directive + :m "]*" #'+evil/next-comment + :m "[*" #'+evil/previous-comment + :m "]\\" #'+evil/next-comment + :m "[\\" #'+evil/previous-comment + :v "@" #'+evil:apply-macro + + ;; ported from vim-unimpaired + :n "] SPC" #'+evil/insert-newline-below + :n "[ SPC" #'+evil/insert-newline-above + :n "]b" #'next-buffer + :n "[b" #'previous-buffer + :n "]f" #'+evil/next-file + :n "[f" #'+evil/previous-file + :m "]u" #'+evil:url-encode + :m "[u" #'+evil:url-decode + :m "]y" #'+evil:c-string-encode + :m "[y" #'+evil:c-string-decode + (:when (featurep! :lang web) + :m "]x" #'+web:encode-html-entities + :m "[x" #'+web:decode-html-entities) + (:when (featurep! :ui vc-gutter) + :m "]d" #'git-gutter:next-hunk + :m "[d" #'git-gutter:previous-hunk) + (:when (featurep! :ui hl-todo) + :m "]t" #'hl-todo-next + :m "[t" #'hl-todo-previous) + (:when (featurep! :ui workspaces) + :n "gt" #'+workspace:switch-next + :n "gT" #'+workspace:switch-previous + :n "]w" #'+workspace/switch-right + :n "[w" #'+workspace/switch-left) + + ;; custom vim-unmpaired-esque keys + :m "]a" #'evil-forward-arg + :m "[a" #'evil-backward-arg + :m "]e" #'next-error + :m "[e" #'previous-error + :n "]F" #'+evil/next-frame + :n "[F" #'+evil/previous-frame + :m "]h" #'outline-next-visible-heading + :m "[h" #'outline-previous-visible-heading + :n "[o" #'+evil/insert-newline-above + :n "]o" #'+evil/insert-newline-below + :n "gp" #'+evil/reselect-paste + :v "gp" #'+evil/paste-preserve-register + :nv "g@" #'+evil:apply-macro + :nv "gc" #'evilnc-comment-operator + :nv "gx" #'evil-exchange + :nv "gy" #'+evil:yank-unindented + :n "g=" #'evil-numbers/inc-at-pt + :n "g-" #'evil-numbers/dec-at-pt + :v "g=" #'evil-numbers/inc-at-pt-incremental + :v "g-" #'evil-numbers/dec-at-pt-incremental + :v "g+" #'evil-numbers/inc-at-pt + (:when (featurep! :tools lookup) + :nv "K" #'+lookup/documentation + :nv "gd" #'+lookup/definition + :nv "gD" #'+lookup/references + :nv "gf" #'+lookup/file) + (:when (featurep! :tools eval) + :nv "gr" #'+eval:region + :n "gR" #'+eval/buffer + :v "gR" #'+eval:replace-region) + + :nv "z=" #'flyspell-correct-word-generic + ;; custom evil keybinds + :n "zn" #'+evil:narrow-buffer + :n "zN" #'doom/widen-indirectly-narrowed-buffer + :n "zx" #'kill-current-buffer + :n "ZX" #'bury-buffer + ;; don't leave visual mode after shifting + :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv + + ;; window management (prefix "C-w") + (:map evil-window-map + ;; Navigation + "C-h" #'evil-window-left + "C-j" #'evil-window-down + "C-k" #'evil-window-up + "C-l" #'evil-window-right + "C-w" #'other-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 + (:prefix "m" + "m" #'doom/window-maximize-buffer + "v" #'doom/window-maximize-vertically + "s" #'doom/window-maximize-horizontally) + "u" #'winner-undo + "C-u" #'winner-undo + "C-r" #'winner-redo + "o" #'doom/window-enlargen + ;; Delete window + "d" #'evil-window-delete + "C-C" #'ace-delete-window) + + ;; text objects + :textobj "x" #'evil-inner-xml-attr #'evil-outer-xml-attr + :textobj "a" #'evil-inner-arg #'evil-outer-arg + :textobj "B" #'evil-textobj-anyblock-inner-block #'evil-textobj-anyblock-a-block + :textobj "c" #'evilnc-inner-comment #'evilnc-outer-commenter + :textobj "f" #'+evil:defun-txtobj #'+evil:defun-txtobj + :textobj "g" #'+evil:whole-buffer-txtobj #'+evil:whole-buffer-txtobj + :textobj "i" #'evil-indent-plus-i-indent #'evil-indent-plus-a-indent + :textobj "k" #'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 + + ;; evil-easymotion + (:after evil-easymotion + :map evilem-map + "a" (evilem-create #'evil-forward-arg) + "A" (evilem-create #'evil-backward-arg) + "s" #'evil-avy-goto-char-2 + "SPC" (λ!! #'evil-avy-goto-char-timer t) + "/" #'evil-avy-goto-char-timer) + + ;; evil-snipe + (:after evil-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 + + ;; Omni-completion + (:when (featurep! :completion company) + (: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 + :i "C-p" #'+company/dabbrev-code-previous))) diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el index 6a60914f8..ac358df02 100644 --- a/modules/editor/multiple-cursors/config.el +++ b/modules/editor/multiple-cursors/config.el @@ -1,5 +1,14 @@ ;;; editor/multiple-cursors/config.el -*- lexical-binding: t; -*- +(use-package! evil-multiedit + :when (featurep! :editor evil) + :defer t + :config + (map! :map (evil-multiedit-state-map evil-multiedit-insert-state-map) + "C-n" #'evil-multiedit-next + "C-p" #'evil-multiedit-prev)) + + (use-package! evil-mc :when (featurep! :editor evil) :commands (evil-mc-make-cursor-here @@ -25,7 +34,12 @@ evil-mc-make-and-goto-prev-match evil-mc-skip-and-goto-prev-match) :init + ;; The included keybindings are too imposing and are likely to cause + ;; conflicts, so we'll set them ourselves. (defvar evil-mc-key-map (make-sparse-keymap)) + + (defvar +multiple-cursors-evil-mc-prefix "gz" + "Where to store `evil-mc' keybinds.") :config (global-evil-mc-mode +1) @@ -71,7 +85,30 @@ ;; Forward declare these so that ex completion and evil-mc support is ;; recognized before the autoloaded functions are loaded. (evil-add-command-properties '+evil:align :evil-mc t) - (evil-add-command-properties '+multiple-cursors:evil-mc :evil-mc t)) + (evil-add-command-properties '+multiple-cursors:evil-mc :evil-mc t) + + (map! :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 + :when +multiple-cursors-evil-mc-prefix + (:prefix +multiple-cursors-evil-mc-prefix + :nv "d" #'evil-mc-make-and-goto-next-match + :nv "D" #'evil-mc-make-and-goto-prev-match + :nv "j" #'evil-mc-make-cursor-move-next-line + :nv "k" #'evil-mc-make-cursor-move-prev-line + :nv "m" #'evil-mc-make-all-cursors + :nv "n" #'evil-mc-make-and-goto-next-cursor + :nv "N" #'evil-mc-make-and-goto-last-cursor + :nv "p" #'evil-mc-make-and-goto-prev-cursor + :nv "P" #'evil-mc-make-and-goto-first-cursor + :nv "q" #'evil-mc-undo-all-cursors + :nv "t" #'+multiple-cursors/evil-mc-toggle-cursors + :nv "u" #'evil-mc-undo-last-added-cursor + :nv "z" #'+multiple-cursors/evil-mc-make-cursor-here + :v "I" #'evil-mc-make-cursor-in-visual-selection-beg + :v "A" #'evil-mc-make-cursor-in-visual-selection-end))) (after! multiple-cursors-core diff --git a/modules/editor/snippets/config.el b/modules/editor/snippets/config.el index ff195c85d..00bbc594e 100644 --- a/modules/editor/snippets/config.el +++ b/modules/editor/snippets/config.el @@ -71,7 +71,16 @@ ;; Replace commands with superior alternatives (define-key! yas-minor-mode-map [remap yas-new-snippet] #'+snippets/new - [remap yas-visit-snippet-file] #'+snippets/edit)) + [remap yas-visit-snippet-file] #'+snippets/edit) + + (map! :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 + [backspace] #'+snippets/delete-backward-char + [delete] #'+snippets/delete-forward-char-or-field)) (use-package! auto-yasnippet diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index d3b360a9f..68cfe853c 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -15,7 +15,11 @@ ("^\\vc-c" :select t))) ; *vc-change-log* (set-evil-initial-state! '(vc-annotate-mode vc-git-log-view-mode) - 'normal)) + 'normal) + + ;; Clean up after itself + (define-key vc-annotate-mode-map [remap quit-window] #'kill-current-buffer)) + (after! git-timemachine @@ -34,6 +38,12 @@ (add-transient-hook! #'git-timemachine-blame (require 'magit-blame))) (map! :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 :n "gtc" #'git-timemachine-show-commit)) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index b0cae2ed1..1ef7b6d03 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -4,10 +4,6 @@ (setq-hook! css-mode comment-indent-function #'+css/comment-indent-new-line) -(map! :map (css-mode-map scss-mode-map less-css-mode-map) - :localleader - "rb" #'+css/toggle-inline-or-block) - (after! (:any css-mode sass-mode) (set-docsets! '(css-mode scss-mode sass-mode) "CSS" "HTML" "Bourbon" "Compass" @@ -37,7 +33,30 @@ ;; DEPRECATED css-mode's built in completion is superior in 26+ 'company-capf 'company-css)) - (map! :map scss-mode-map :localleader "b" #'+css/scss-build)) + + (map! :localleader + :map scss-mode-map + "b" #'+css/scss-build + :map (css-mode-map scss-mode-map less-css-mode-map) + "rb" #'+css/toggle-inline-or-block) + + (use-package! counsel-css + :when (featurep! :completion ivy) + :commands counsel-css + :hook (css-mode . counsel-css-imenu-setup) + :init + (map! :map (css-mode-map scss-mode-map less-css-mode-map) + :localleader ";" #'counsel-css)) + + (use-package! helm-css-scss + :when (featurep! :completion helm) + :defer t + :init + (map! :map (css-mode-map scss-mode-map less-css-mode-map) + :localleader ";" #'helm-css-scss) + :config + (setq helm-css-scss-split-direction #'split-window-vertically + helm-css-scss-split-with-multiple-windows t))) (after! sass-mode @@ -51,23 +70,3 @@ (when (featurep! +lsp) (add-hook! '(css-mode-hook sass-mode-hook less-css-mode-hook) #'lsp!)) - - -(use-package! counsel-css - :when (featurep! :completion ivy) - :commands counsel-css - :hook (css-mode . counsel-css-imenu-setup) - :init - (map! :map (css-mode-map scss-mode-map less-css-mode-map) - :localleader ";" #'counsel-css)) - - -(use-package! helm-css-scss - :when (featurep! :completion helm) - :defer t - :init - (map! :map (css-mode-map scss-mode-map less-css-mode-map) - :localleader ";" #'helm-css-scss) - :config - (setq helm-css-scss-split-direction #'split-window-vertically - helm-css-scss-split-with-multiple-windows t)) diff --git a/modules/tools/flycheck/config.el b/modules/tools/flycheck/config.el index 9777a8e5b..1c9fb0f5a 100644 --- a/modules/tools/flycheck/config.el +++ b/modules/tools/flycheck/config.el @@ -34,6 +34,14 @@ errors.") (ignore-errors (flycheck-buffer)) nil))) + (map! :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 + :n [return] #'flycheck-error-list-goto-error) + (global-flycheck-mode +1)) diff --git a/modules/tools/flyspell/config.el b/modules/tools/flyspell/config.el index 8a7b013ee..61fcd75a3 100644 --- a/modules/tools/flyspell/config.el +++ b/modules/tools/flyspell/config.el @@ -64,7 +64,12 @@ e.g. proselint and langtool." ;; Ensure mode-local predicates declared with `set-flyspell-predicate!' are ;; used in their respective major modes. - (add-hook 'flyspell-mode-hook #'+flyspell-init-predicate-h)) + (add-hook 'flyspell-mode-hook #'+flyspell-init-predicate-h) + + (map! :map flyspell-mouse-map + "RET" #'flyspell-correct-word-generic + [return] #'flyspell-correct-word-generic + [mouse-1] #'flyspell-correct-word-generic)) (use-package! flyspell-correct diff --git a/modules/tools/gist/config.el b/modules/tools/gist/config.el index 9a3f608d9..d86131b2f 100644 --- a/modules/tools/gist/config.el +++ b/modules/tools/gist/config.el @@ -13,4 +13,16 @@ :around #'gist-list-render (funcall orig-fn (car args) t) (unless (cadr args) - (pop-to-buffer (current-buffer))))) + (pop-to-buffer (current-buffer)))) + + (map! :map gist-list-menu-mode-map + :n "go" #'gist-browse-current-url + :n "gr" #'gist-list-reload + :n "c" #'gist-add-buffer + :n "d" #'gist-kill-current + :n "e" #'gist-edit-current-description + :n "f" #'gist-fork + :n "q" #'kill-current-buffer + :n "s" #'gist-star + :n "S" #'gist-unstar + :n "y" #'gist-print-current-url)) diff --git a/modules/ui/neotree/config.el b/modules/ui/neotree/config.el index 76c982bde..705b61979 100644 --- a/modules/ui/neotree/config.el +++ b/modules/ui/neotree/config.el @@ -47,7 +47,35 @@ (defun +neotree-fix-cursor-h (&rest _) (with-current-buffer neo-global--buffer (+neotree--indent-cursor-a)))) + (defadvice! +neotree--indent-cursor-a (&rest _) :after '(neotree-next-line neotree-previous-line) (beginning-of-line) - (skip-chars-forward " \t\r"))) + (skip-chars-forward " \t\r")) + + (map! :map neotree-mode-map + :n "g" nil + :n "TAB" #'neotree-quick-look + :n "RET" #'neotree-enter + :n [tab] #'neotree-quick-look + :n [return] #'neotree-enter + :n "DEL" #'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))