iedit: add cmd+D 'add next match' functionality, ala sublime text

This commit is contained in:
Henrik Lissner 2016-02-18 05:05:03 -05:00
parent 1b4742167d
commit 3e542dd454
3 changed files with 54 additions and 14 deletions

View file

@ -35,15 +35,13 @@
evil-operator-state-tag "O"
evil-motion-state-tag "M"
evil-replace-state-tag "R"
evil-iedit-state-tag "R+"
;; Color-coded state cursors
evil-default-cursor "orange"
evil-normal-state-cursor 'box
evil-emacs-state-cursor '("cyan" box)
evil-insert-state-cursor 'bar
evil-visual-state-cursor 'hollow
evil-iedit-state-cursor 'box)
evil-visual-state-cursor 'hollow)
;; NOTE: a bug in emacs 25 breaks undoing in evil. See
;; https://bitbucket.org/lyro/evil/issues/594/undo-doesnt-behave-like-vim
@ -270,14 +268,22 @@
(use-package evil-iedit-state
:functions (iedit-current-occurrence-string iedit-restrict-region)
:commands (evil-iedit-state evil-iedit-state/iedit-mode)
:init
(defvar iedit-occurrence-keymap-default (make-sparse-keymap))
:config
(setq evil-iedit-state-cursor 'box
evil-iedit-state-tag "R+")
(advice-add 'evil-force-normal-state :after 'evil-iedit-state/quit-iedit-mode)
(define-key evil-iedit-state-map (kbd "<escape>") 'evil-iedit-state/quit-iedit-mode)
(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 "M-d") 'narf/mark-and-next)
(define-key map (kbd "M-D") 'narf/mark-and-prev)
(define-key map "V" 'evil-visual-line)
(define-key map "C" 'evil-iedit-state/substitute) ; instead of s/S

View file

@ -33,17 +33,6 @@
(and (evil-visual-state-p)
(eq (evil-visual-type) 'line)))
;;;###autoload
(defun narf:iedit-restrict-to-region ()
(interactive)
(if (iedit-current-occurrence-string)
(let ((current-prefix-arg '(4)))
(iedit-done)
(call-interactively 'iedit-mode)
(save-excursion (iedit-restrict-region (region-beginning) (region-end)))
(evil-previous-line))
(call-interactively 'evil-ret)))
;;;###autoload
(defun narf*evil-exchange-off ()
(when evil-exchange--overlays

View file

@ -0,0 +1,45 @@
;;; defuns-iedit.el
;;;###autoload
(defun narf:iedit-restrict-to-region (&optional beg end)
(interactive)
(if (iedit-current-occurrence-string)
(let ((current-prefix-arg '(4))
(beg (or beg (region-beginning)))
(end (or end (region-end))))
(iedit-done)
(call-interactively 'iedit-mode)
(save-excursion (iedit-restrict-region beg end))
(evil-previous-line))
(call-interactively 'evil-ret)))
;;;###autoload
(defun narf/mark-and-prev ()
(interactive)
(narf/mark-and-next t))
;;;###autoload
(defun narf/mark-and-next (&optional backwards-p)
(interactive)
(let ((beg evil-visual-beginning)
(end evil-visual-end)
(last-pos (point)))
(unless (bound-and-true-p evil-iedit-state-local-minor-mode)
(save-excursion
(funcall (intern (format "evil-visualstar/begin-search-%s" (if backwards-p "backward" "forward")))
beg end))
(when backwards-p
(goto-char beg))
(evil-visual-make-region beg end)
(call-interactively 'evil-iedit-state/iedit-mode)
(save-excursion
(narf:iedit-restrict-to-region beg end)))
(evil-ex-find-next nil (if backwards-p 'backward 'forward) t)
;; (evil-ex-search-next)
(evil-ex-nohighlight)
(when (and (iedit-find-current-occurrence-overlay)
(if backwards-p t (not (= last-pos (point)))))
(iedit-toggle-selection))))
(provide 'defuns-iedit)
;;; defuns-iedit.el ends here