From 3e542dd454085a9588e1f152d60e7f5f068b3d88 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 18 Feb 2016 05:05:03 -0500 Subject: [PATCH] iedit: add cmd+D 'add next match' functionality, ala sublime text --- core/core-evil.el | 12 +++++++--- core/defuns/defuns-evil.el | 11 --------- core/defuns/defuns-iedit.el | 45 +++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 core/defuns/defuns-iedit.el diff --git a/core/core-evil.el b/core/core-evil.el index 2e5c0d7b2..18659e1b8 100644 --- a/core/core-evil.el +++ b/core/core-evil.el @@ -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 "") '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 diff --git a/core/defuns/defuns-evil.el b/core/defuns/defuns-evil.el index 84941a667..3a63bf0e9 100644 --- a/core/defuns/defuns-evil.el +++ b/core/defuns/defuns-evil.el @@ -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 diff --git a/core/defuns/defuns-iedit.el b/core/defuns/defuns-iedit.el new file mode 100644 index 000000000..7be259815 --- /dev/null +++ b/core/defuns/defuns-iedit.el @@ -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