2015-06-06 06:40:33 -04:00
|
|
|
;;; core-evil.el --- the root of all evil
|
2015-06-15 09:05:52 +02:00
|
|
|
;; see lib/evil-defuns.el
|
2015-06-06 06:40:33 -04:00
|
|
|
|
2015-06-04 18:23:21 -04:00
|
|
|
(use-package evil
|
|
|
|
:init
|
2015-10-15 14:01:53 -04:00
|
|
|
;; highlight matching delimiters where it's important
|
|
|
|
(defun show-paren-mode-off () (show-paren-mode -1))
|
|
|
|
(add-hook! evil-insert-state-entry 'show-paren-mode)
|
|
|
|
(add-hook! evil-insert-state-exit 'show-paren-mode-off)
|
|
|
|
(add-hook! evil-visual-state-entry 'show-paren-mode)
|
|
|
|
(add-hook! evil-visual-state-exit 'show-paren-mode-off)
|
|
|
|
(add-hook! evil-motion-state-entry 'show-paren-mode)
|
|
|
|
(add-hook! evil-motion-state-exit 'show-paren-mode-off)
|
|
|
|
(add-hook! evil-operator-state-entry 'show-paren-mode)
|
|
|
|
(add-hook! evil-operator-state-exit 'show-paren-mode-off)
|
|
|
|
|
2015-06-06 06:40:33 -04:00
|
|
|
;; Always ensure evil-shift-width is consistent with tab-width
|
2015-06-15 09:05:52 +02:00
|
|
|
(add-hook! evil-local-mode (setq evil-shift-width tab-width))
|
2015-10-15 14:01:53 -04:00
|
|
|
;; Disable highlights on insert-mode
|
|
|
|
(add-hook! evil-insert-state-entry 'evil-ex-nohighlight)
|
|
|
|
|
2015-06-04 18:23:21 -04:00
|
|
|
:config
|
2015-10-15 14:01:53 -04:00
|
|
|
(setq evil-magic t
|
|
|
|
evil-want-C-u-scroll t ; enable C-u for scrolling
|
2015-06-06 06:40:33 -04:00
|
|
|
evil-ex-visual-char-range t ; column range for ex commands
|
2015-10-15 14:01:53 -04:00
|
|
|
evil-want-fine-undo nil
|
2015-07-03 00:26:27 +02:00
|
|
|
evil-want-visual-char-semi-exclusive t
|
2015-06-06 06:40:33 -04:00
|
|
|
evil-ex-search-vim-style-regexp t
|
|
|
|
evil-ex-interactive-search-highlight 'selected-window
|
2015-10-13 00:44:47 -04:00
|
|
|
evil-echo-state nil
|
2015-06-06 06:40:33 -04:00
|
|
|
|
|
|
|
;; Color-coded state cursors
|
|
|
|
evil-normal-state-cursor '("white" box)
|
|
|
|
evil-emacs-state-cursor '("cyan" bar)
|
|
|
|
evil-insert-state-cursor '("white" bar)
|
|
|
|
evil-visual-state-cursor '("white" hollow)
|
|
|
|
evil-iedit-state-cursor '("orange" box))
|
|
|
|
|
|
|
|
(evil-mode 1)
|
|
|
|
(evil-select-search-module 'evil-search-module 'evil-search)
|
2015-06-15 09:05:52 +02:00
|
|
|
|
2015-10-28 03:31:51 -04:00
|
|
|
(evil-define-key 'normal evil-command-window-mode-map [escape] 'kill-buffer-and-window)
|
2015-06-06 06:40:33 -04:00
|
|
|
|
|
|
|
;; modes to map to different default states
|
|
|
|
(dolist (mode-map '((cider-repl-mode . emacs)
|
|
|
|
(comint-mode . emacs)
|
|
|
|
(term-mode . emacs)
|
|
|
|
(help-mode . normal)
|
|
|
|
(message-mode . normal)
|
2015-09-29 09:53:45 -04:00
|
|
|
(compilation-mode . normal)))
|
2015-06-06 06:40:33 -04:00
|
|
|
(evil-set-initial-state `,(car mode-map) `,(cdr mode-map)))
|
|
|
|
|
|
|
|
(progn ; evil hacks
|
2015-10-28 03:31:51 -04:00
|
|
|
(defadvice evil-force-normal-state (after evil-esc-quit activate)
|
2015-06-06 06:40:33 -04:00
|
|
|
(ignore-errors
|
2015-10-28 03:31:51 -04:00
|
|
|
(when (popwin:popup-window-live-p)
|
|
|
|
(popwin:close-popup-window))
|
|
|
|
; close popups, if any
|
2015-06-06 06:40:33 -04:00
|
|
|
(evil-ex-nohighlight)
|
|
|
|
;; Exit minibuffer if alive
|
|
|
|
(if (minibuffer-window-active-p (minibuffer-window))
|
|
|
|
(narf/minibuffer-quit))))
|
|
|
|
;; Jump to new splits
|
|
|
|
(defadvice evil-window-split (after evil-window-split-jump activate)
|
|
|
|
(evil-window-down 1))
|
|
|
|
(defadvice evil-window-vsplit (after evil-window-vsplit-jump activate)
|
|
|
|
(evil-window-right 1))
|
|
|
|
|
2015-10-18 02:27:40 -04:00
|
|
|
;; Fix disruptive errors w/ hidden buffers caused by popwin
|
|
|
|
(defadvice evil-ex-hl-do-update-highlight (around evil-ex-hidden-buffer-ignore-errors activate)
|
|
|
|
(ignore-errors ad-do-it))
|
|
|
|
|
2015-09-29 09:53:45 -04:00
|
|
|
;; Restore vimmish ex-mode keymaps in isearch
|
2015-06-15 09:05:52 +02:00
|
|
|
;; Hide keystroke display while isearch is active
|
|
|
|
(add-hook! isearch-mode (setq echo-keystrokes 0))
|
|
|
|
(add-hook! isearch-mode-end (setq echo-keystrokes 0.02))
|
2015-10-28 03:31:51 -04:00
|
|
|
(let ((map evil-ex-search-keymap))
|
|
|
|
(define-key map (kbd "C-w") 'evil-delete-backward-word)
|
|
|
|
(define-key map (kbd "C-u") 'evil-delete-whole-line))
|
|
|
|
|
2015-10-25 00:39:22 -04:00
|
|
|
;; Repeat motions with SPC/S-SPC
|
|
|
|
(defmacro narf-space-setup! (command next-func prev-func)
|
|
|
|
`(defadvice ,command
|
|
|
|
(before ,(intern (format "narf-space--%s" (symbol-name command))) activate)
|
|
|
|
(define-key evil-motion-state-map (kbd "SPC") ',next-func)
|
|
|
|
(define-key evil-motion-state-map (kbd "S-SPC") ',prev-func)))
|
|
|
|
|
|
|
|
(after! evil-snipe
|
|
|
|
(narf-space-setup! evil-snipe-f evil-snipe-repeat evil-snipe-repeat-reverse)
|
|
|
|
(narf-space-setup! evil-snipe-F evil-snipe-repeat evil-snipe-repeat-reverse)
|
|
|
|
(narf-space-setup! evil-snipe-t evil-snipe-repeat evil-snipe-repeat-reverse)
|
|
|
|
(narf-space-setup! evil-snipe-T evil-snipe-repeat evil-snipe-repeat-reverse)
|
|
|
|
(narf-space-setup! evil-snipe-s evil-snipe-repeat evil-snipe-repeat-reverse)
|
|
|
|
(narf-space-setup! evil-snipe-S evil-snipe-repeat evil-snipe-repeat-reverse)
|
|
|
|
(narf-space-setup! evil-snipe-x evil-snipe-repeat evil-snipe-repeat-reverse)
|
|
|
|
(narf-space-setup! evil-snipe-X evil-snipe-repeat evil-snipe-repeat-reverse))
|
|
|
|
|
|
|
|
(after! evil-visualstar
|
|
|
|
(narf-space-setup! evil-visualstar/begin-search-forward evil-ex-search-next evil-ex-search-previous)
|
|
|
|
(narf-space-setup! evil-visualstar/begin-search-backward evil-ex-search-previous evil-ex-search-next))
|
|
|
|
|
|
|
|
(narf-space-setup! evil-ex-search-next evil-ex-search-next evil-ex-search-previous)
|
|
|
|
(narf-space-setup! evil-ex-search-previous evil-ex-search-next evil-ex-search-previous)
|
|
|
|
|
|
|
|
(narf-space-setup! evil-ex-search-forward evil-ex-search-next evil-ex-search-previous)
|
|
|
|
(narf-space-setup! evil-ex-search-backward evil-ex-search-next evil-ex-search-previous)))
|
2015-06-15 09:05:52 +02:00
|
|
|
|
|
|
|
;; evil plugins
|
2015-10-15 14:01:53 -04:00
|
|
|
(use-package evil-anzu
|
|
|
|
:config (setq anzu-cons-mode-line-p nil))
|
|
|
|
|
|
|
|
(use-package evil-args
|
|
|
|
:commands (evil-inner-arg evil-outer-arg evil-forward-arg evil-backward-arg evil-jump-out-args)
|
|
|
|
:init
|
|
|
|
(define-key evil-inner-text-objects-map "a" #'evil-inner-arg)
|
|
|
|
(define-key evil-outer-text-objects-map "a" #'evil-outer-arg)
|
|
|
|
(define-key evil-normal-state-map "K" #'evil-jump-out-args))
|
2015-06-15 09:05:52 +02:00
|
|
|
|
|
|
|
(use-package evil-commentary
|
|
|
|
:diminish evil-commentary-mode
|
|
|
|
:commands (evil-commentary
|
|
|
|
evil-commentary-yank
|
|
|
|
evil-commentary-line)
|
|
|
|
:config (evil-commentary-mode 1))
|
|
|
|
|
|
|
|
(use-package evil-ex-registers
|
|
|
|
:commands (evil-get-spec-register
|
|
|
|
evil-ex-paste-from-register))
|
|
|
|
|
|
|
|
(use-package evil-exchange
|
|
|
|
:commands evil-exchange
|
|
|
|
:config
|
2015-07-26 13:14:31 +02:00
|
|
|
(advice-add 'evil-force-normal-state :after 'narf*evil-exchange-off))
|
2015-06-15 09:05:52 +02:00
|
|
|
|
|
|
|
(use-package evil-iedit-state
|
|
|
|
:functions (iedit-current-occurrence-string iedit-restrict-region)
|
|
|
|
:commands (evil-iedit-state evil-iedit-state/iedit-mode)
|
|
|
|
:config
|
2015-10-28 03:31:51 -04:00
|
|
|
(define-key evil-visual-state-map (kbd "SPC") 'narf:iedit-restrict-to-region)
|
|
|
|
(let ((map evil-iedit-state-map))
|
|
|
|
;; Don't interfere with evil-snipe
|
|
|
|
(define-key map "s" nil)
|
|
|
|
(define-key map "S" nil)
|
|
|
|
|
|
|
|
(define-key map (kbd "V") 'evil-visual-line)
|
|
|
|
(define-key map (kbd "C") 'evil-iedit-state/substitute) ; instead of s/S
|
|
|
|
(define-key map (kbd "za") 'iedit-toggle-unmatched-lines-visible)))
|
2015-06-15 09:05:52 +02:00
|
|
|
|
|
|
|
(use-package evil-indent-textobject
|
|
|
|
:commands (evil-indent-i-indent
|
|
|
|
evil-indent-a-indent
|
|
|
|
evil-indent-a-indent-lines)
|
|
|
|
:init
|
2015-10-28 03:31:51 -04:00
|
|
|
(let ((map evil-inner-text-objects-map))
|
|
|
|
(define-key map "i" 'evil-indent-i-indent)
|
|
|
|
(define-key map "i" 'evil-indent-a-indent)
|
|
|
|
(define-key map "I" 'evil-indent-a-indent-lines)))
|
2015-06-04 18:23:21 -04:00
|
|
|
|
2015-06-15 09:05:52 +02:00
|
|
|
(use-package evil-jumper
|
|
|
|
:init
|
2015-10-28 03:31:51 -04:00
|
|
|
(setq evil-jumper-file (concat narf-temp-dir "jumplist")
|
2015-06-15 09:05:52 +02:00
|
|
|
evil-jumper-auto-center t
|
|
|
|
evil-jumper-auto-save-interval 3600))
|
|
|
|
|
|
|
|
(use-package evil-matchit
|
2015-10-15 14:01:53 -04:00
|
|
|
:commands (evilmi-jump-items evilmi-text-object global-evil-matchit-mode)
|
|
|
|
:config (global-evil-matchit-mode 1)
|
|
|
|
:init
|
|
|
|
(define-key evil-normal-state-map "%" #'evilmi-jump-items)
|
|
|
|
(define-key evil-inner-text-objects-map "%" #'evilmi-text-object)
|
|
|
|
(define-key evil-outer-text-objects-map "%" #'evilmi-text-object))
|
2015-06-15 09:05:52 +02:00
|
|
|
|
2015-08-21 12:40:04 -04:00
|
|
|
(use-package evil-easymotion
|
2015-10-06 20:27:18 -04:00
|
|
|
:defer 1
|
2015-08-21 12:40:04 -04:00
|
|
|
:config
|
|
|
|
(evilem-default-keybindings "g SPC")
|
2015-09-30 13:48:25 -04:00
|
|
|
(evilem-define (kbd "g SPC n") 'evil-ex-search-next)
|
|
|
|
(evilem-define (kbd "g SPC N") 'evil-ex-search-previous)
|
2015-08-21 12:40:04 -04:00
|
|
|
(evilem-define (kbd "g s") 'evil-snipe-repeat
|
|
|
|
(lambda ()
|
|
|
|
(save-excursion
|
|
|
|
(ignore-errors
|
|
|
|
(call-interactively #'evil-snipe-s))))
|
|
|
|
nil
|
|
|
|
((evil-snipe-enable-highlight)
|
|
|
|
(evil-snipe-enable-incremental-highlight)))
|
|
|
|
|
|
|
|
(evilem-define (kbd "g S") 'evil-snipe-repeat-reverse
|
|
|
|
(lambda ()
|
|
|
|
(save-excursion
|
|
|
|
(ignore-errors
|
|
|
|
(call-interactively #'evil-snipe-s))))
|
|
|
|
nil
|
|
|
|
((evil-snipe-enable-highlight)
|
|
|
|
(evil-snipe-enable-incremental-highlight))))
|
|
|
|
|
2015-06-15 09:05:52 +02:00
|
|
|
(use-package evil-numbers
|
2015-09-30 13:47:57 -04:00
|
|
|
:commands (evil-numbers/inc-at-pt evil-numbers/dec-at-pt))
|
2015-06-15 09:05:52 +02:00
|
|
|
|
|
|
|
(use-package evil-search-highlight-persist
|
2015-07-26 13:14:31 +02:00
|
|
|
:config
|
|
|
|
(global-evil-search-highlight-persist t)
|
|
|
|
(advice-add 'evil-force-normal-state :after 'evil-search-highlight-persist-remove-all))
|
2015-06-15 09:05:52 +02:00
|
|
|
|
|
|
|
(use-package evil-snipe
|
|
|
|
:diminish evil-snipe-mode
|
2015-10-15 14:01:53 -04:00
|
|
|
:commands (evil-snipe-f evil-snipe-F evil-snipe-t evil-snipe-T evil-snipe-s evil-snipe-S evil-snipe-x evil-snipe-X)
|
2015-06-15 09:05:52 +02:00
|
|
|
:init
|
|
|
|
(setq-default
|
|
|
|
evil-snipe-smart-case t
|
2015-09-29 09:53:45 -04:00
|
|
|
evil-snipe-repeat-keys nil ; using evil-space to repeat
|
2015-06-15 09:05:52 +02:00
|
|
|
evil-snipe-scope 'line
|
2015-10-15 14:01:53 -04:00
|
|
|
evil-snipe-repeat-scope 'visible
|
2015-09-29 09:53:45 -04:00
|
|
|
evil-snipe-override-evil-repeat-keys nil ; causes problems with remapped ;
|
2015-06-15 09:05:52 +02:00
|
|
|
evil-snipe-symbol-groups '((?\[ "[[{(]")
|
|
|
|
(?\] "[]})]")))
|
2015-10-15 14:01:53 -04:00
|
|
|
(bind! :m "f" 'evil-snipe-f
|
|
|
|
:m "F" 'evil-snipe-F
|
|
|
|
:m "t" 'evil-snipe-t
|
|
|
|
:m "T" 'evil-snipe-T
|
|
|
|
:m "s" 'evil-snipe-s
|
|
|
|
:m "S" 'evil-snipe-S
|
|
|
|
:o "x" 'evil-snipe-x
|
|
|
|
:o "X" 'evil-snipe-X)
|
2015-08-12 15:05:40 +02:00
|
|
|
:config
|
2015-06-15 09:05:52 +02:00
|
|
|
(evil-snipe-mode 1)
|
|
|
|
(evil-snipe-override-mode 1))
|
|
|
|
|
|
|
|
(use-package evil-surround
|
|
|
|
:commands (global-evil-surround-mode
|
|
|
|
evil-surround-edit
|
|
|
|
evil-Surround-edit
|
|
|
|
evil-surround-region)
|
|
|
|
:config
|
|
|
|
(global-evil-surround-mode 1)
|
|
|
|
;; Escaped surround characters
|
|
|
|
(push '(?\\ . narf/evil-surround-escaped) evil-surround-pairs-alist))
|
|
|
|
|
|
|
|
(use-package evil-visualstar
|
|
|
|
:commands (global-evil-visualstar-mode
|
|
|
|
evil-visualstar/begin-search
|
|
|
|
evil-visualstar/begin-search-forward
|
|
|
|
evil-visualstar/begin-search-backward)
|
|
|
|
:config
|
|
|
|
(global-evil-visualstar-mode 1))
|
2015-06-04 18:23:21 -04:00
|
|
|
|
|
|
|
(provide 'core-evil)
|
|
|
|
;;; core-evil.el ends here
|