summaryrefslogtreecommitdiff
path: root/visual-regexp.el
diff options
context:
space:
mode:
authorMarko Bencun <mbencun@gmail.com>2013-12-03 10:15:59 +0100
committerMarko Bencun <mbencun@gmail.com>2013-12-03 10:15:59 +0100
commit330ba3ca1b9a5e7cae3432a86a31cd0eae2ac91c (patch)
treee95f9d13a3d1bec2cce14d5ae11f927cd9418ed6 /visual-regexp.el
parent7c1f4a27b7d0ff3bbd39a1bf841c0ce423b684c8 (diff)
Interface to multiple-cursors
Diffstat (limited to 'visual-regexp.el')
-rw-r--r--visual-regexp.el74
1 files changed, 58 insertions, 16 deletions
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."))