From 330ba3ca1b9a5e7cae3432a86a31cd0eae2ac91c Mon Sep 17 00:00:00 2001 From: Marko Bencun Date: Tue, 3 Dec 2013 10:15:59 +0100 Subject: Interface to multiple-cursors --- visual-regexp.el | 74 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 16 deletions(-) (limited to 'visual-regexp.el') diff --git a/visual-regexp.el b/visual-regexp.el index f5960b3..530406c 100644 --- a/visual-regexp.el +++ b/visual-regexp.el @@ -566,17 +566,17 @@ visible all the time in the minibuffer." (set-match-data (mapcar (lambda (el) (+ cumulative-offset el)) last-match-data)) replace-count)))) -(defun vr--interactive-get-args () +(defun vr--interactive-get-args (mode) "Get interactive args for the vr/replace and vr/query-replace functions." (unwind-protect (progn (let ((buffer-read-only t)) ;; make target buffer (when vr--in-minibuffer (error "visual-regexp already in use.")) (setq vr--target-buffer (current-buffer)) - (setq vr--target-buffer-start (if (and transient-mark-mode mark-active) + (setq vr--target-buffer-start (if (region-active-p) (region-beginning) (point))) - (setq vr--target-buffer-end (if (and transient-mark-mode mark-active) + (setq vr--target-buffer-end (if (region-active-p) (region-end) (point-max))) @@ -598,19 +598,25 @@ visible all the time in the minibuffer." nil vr/query-replace-from-history-variable)) ;;(setq vr--regexp-string (format "%s%s" (vr--get-regexp-modifiers-prefix) vr--regexp-string)) - (setq vr--in-minibuffer 'vr--minibuffer-replace) - (setq vr--last-minibuffer-contents "") - (setq vr--replace-string - (read-from-minibuffer - " " ;; prompt will be set in vr--minibuffer-setup - nil vr/minibuffer-replace-keymap - nil vr/query-replace-to-history-variable)))) + (when (equal mode 'vr--mode-regexp-replace) + (setq vr--in-minibuffer 'vr--minibuffer-replace) + (setq vr--last-minibuffer-contents "") + (setq vr--replace-string + (read-from-minibuffer + " " ;; prompt will be set in vr--minibuffer-setup + nil vr/minibuffer-replace-keymap + nil vr/query-replace-to-history-variable))))) ;; Successfully got the args, deactivate mark now. If the command was aborted (C-g), the mark (region) would remain active. (deactivate-mark) - (list vr--regexp-string - vr--replace-string - vr--target-buffer-start - vr--target-buffer-end))) + (cond ((equal mode 'vr--mode-regexp-replace) + (list vr--regexp-string + vr--replace-string + vr--target-buffer-start + vr--target-buffer-end)) + ((equal mode 'vr--mode-regexp) + (list vr--regexp-string + vr--target-buffer-start + vr--target-buffer-end))))) (progn ;; execute on finish (setq vr--in-minibuffer nil) (unless (overlayp vr--minibuffer-message-overlay) @@ -618,11 +624,47 @@ visible all the time in the minibuffer." (vr--delete-overlay-displays) (vr--delete-overlays)))) +(add-hook 'multiple-cursors-mode-enabled-hook + ;; run vr/mc-mark once per cursor by default (do not ask the user) + (lambda () + (when (boundp 'mc--default-cmds-to-run-once) + (add-to-list 'mc--default-cmds-to-run-once 'vr/mc-mark)))) + +;;;###autoload +(defun vr/mc-mark (regexp start end) + "Convert regexp selection to multiple cursors." + (interactive + (vr--interactive-get-args 'vr--mode-regexp)) + (with-current-buffer vr--target-buffer + (mc/remove-fake-cursors) + (activate-mark) + (let ((regexp-string (vr--get-regexp-string)) + ;; disable deactivating of mark after buffer-editing commands + ;; (which happen for example in visual-regexp-steroids/vr--parse-matches + ;; during the callback). + (deactivate-mark nil) + (first-fake-cursor nil)) + (vr--feedback-function t nil (lambda (i j begin end) + (with-current-buffer vr--target-buffer + (goto-char end) + (push-mark begin) + ;; temporarily enable transient mark mode + (activate-mark) + (let ((fc (mc/create-fake-cursor-at-point))) + (unless first-fake-cursor + (setq first-fake-cursor fc)))))) + + ;; one fake cursor too many, replace first one with + ;; the regular cursor. + (when first-fake-cursor + (mc/pop-state-from-overlay first-fake-cursor))) + (mc/maybe-multiple-cursors-mode))) + ;;;###autoload (defun vr/replace (regexp replace start end) "Regexp-replace with live visual feedback." (interactive - (vr--interactive-get-args)) + (vr--interactive-get-args 'vr--mode-regexp-replace)) (unwind-protect (progn (when vr--in-minibuffer (error "visual-regexp already in use.")) @@ -671,7 +713,7 @@ E [not supported in visual-regexp]" (defun vr/query-replace (regexp replace start end) "Use vr/query-replace like you would use query-replace-regexp." (interactive - (vr--interactive-get-args)) + (vr--interactive-get-args 'vr--mode-regexp-replace)) (unwind-protect (progn (when vr--in-minibuffer (error "visual-regexp already in use.")) -- cgit v1.2.3