2019-01-28 19:54:55 -05:00
|
|
|
;;; editor/multiple-cursors/autoload/evil-mc.el -*- lexical-binding: t; -*-
|
2019-04-21 19:59:44 -04:00
|
|
|
;;;###if (featurep! :editor evil)
|
2017-05-26 23:08:53 +02:00
|
|
|
|
|
|
|
;;;###autoload
|
2019-01-28 19:54:55 -05:00
|
|
|
(defun +multiple-cursors/evil-mc-toggle-cursors ()
|
2017-05-26 23:08:53 +02:00
|
|
|
"Toggle frozen state of evil-mc cursors."
|
|
|
|
(interactive)
|
|
|
|
(setq evil-mc-frozen (not (and (evil-mc-has-cursors-p)
|
|
|
|
evil-mc-frozen)))
|
|
|
|
(if evil-mc-frozen
|
|
|
|
(message "evil-mc paused")
|
|
|
|
(message "evil-mc resumed")))
|
|
|
|
|
2019-01-28 19:54:55 -05:00
|
|
|
;;;###autoload (autoload '+multiple-cursors/evil-mc-make-cursor-here "editor/multiple-cursors/autoload/evil-mc" nil t)
|
|
|
|
(evil-define-command +multiple-cursors/evil-mc-make-cursor-here ()
|
2017-05-26 23:08:53 +02:00
|
|
|
"Create a cursor at point. If in visual block or line mode, then create
|
2017-07-09 02:14:45 +02:00
|
|
|
cursors on each line of the selection, on the column of the cursor. Otherwise
|
|
|
|
pauses cursors."
|
2017-05-26 23:08:53 +02:00
|
|
|
:repeat nil
|
|
|
|
:keep-visual nil
|
|
|
|
:evil-mc t
|
|
|
|
(interactive)
|
|
|
|
(cond ((memq evil-this-type '(block line))
|
|
|
|
(let ((col (evil-column))
|
2017-06-08 11:47:56 +02:00
|
|
|
(line-at-pt (line-number-at-pos)))
|
2017-05-26 23:08:53 +02:00
|
|
|
;; Fix off-by-one error
|
|
|
|
(when (= evil-visual-direction 1)
|
|
|
|
(cl-decf col)
|
|
|
|
(backward-char))
|
|
|
|
(save-excursion
|
|
|
|
(evil-apply-on-block
|
|
|
|
(lambda (ibeg _)
|
|
|
|
(unless (= line-at-pt (line-number-at-pos ibeg))
|
|
|
|
(goto-char ibeg)
|
|
|
|
(move-to-column col)
|
|
|
|
(when (= (current-column) col)
|
|
|
|
(evil-mc-make-cursor-here))))
|
2017-06-08 11:47:56 +02:00
|
|
|
evil-visual-beginning
|
2017-05-26 23:08:53 +02:00
|
|
|
(if (eq evil-this-type 'line) (1- evil-visual-end) evil-visual-end)
|
|
|
|
nil)
|
|
|
|
(evil-exit-visual-state))))
|
|
|
|
(t
|
|
|
|
(evil-mc-pause-cursors)
|
|
|
|
;; I assume I don't want the cursors to move yet
|
|
|
|
(evil-mc-make-cursor-here))))
|
|
|
|
|
2019-01-28 19:54:55 -05:00
|
|
|
;;;###autoload (autoload '+multiple-cursors:evil-mc "editor/multiple-cursors/autoload/evil-mc" nil t)
|
|
|
|
(evil-define-command +multiple-cursors:evil-mc (beg end type pattern &optional bang)
|
2017-05-26 23:08:53 +02:00
|
|
|
"Create mc cursors at each match of PATTERN within BEG and END, and leave the
|
2017-05-27 18:57:46 +02:00
|
|
|
cursor at the final match. If BANG, then treat PATTERN as literal."
|
2017-05-26 23:08:53 +02:00
|
|
|
:move-point nil
|
|
|
|
:evil-mc t
|
2017-05-27 18:57:46 +02:00
|
|
|
(interactive "<R><//g><!>")
|
2018-07-13 12:58:58 +02:00
|
|
|
(unless (and (stringp pattern)
|
|
|
|
(not (string-empty-p pattern)))
|
|
|
|
(user-error "A regexp pattern is required"))
|
2017-05-27 18:57:46 +02:00
|
|
|
(require 'evil-mc)
|
2018-07-13 12:58:58 +02:00
|
|
|
(setq evil-mc-pattern
|
2018-07-13 23:35:52 +02:00
|
|
|
(cons (evil-ex-make-search-pattern
|
|
|
|
(if bang (regexp-quote pattern) pattern))
|
2018-07-13 12:58:58 +02:00
|
|
|
(list beg end type)))
|
2017-05-26 23:08:53 +02:00
|
|
|
(save-excursion
|
|
|
|
(evil-with-restriction beg end
|
2018-07-13 12:58:58 +02:00
|
|
|
(evil-mc-make-cursors-for-all)))
|
2017-05-26 23:08:53 +02:00
|
|
|
(evil-exit-visual-state)
|
|
|
|
(evil-mc-goto-cursor
|
|
|
|
(if (= (evil-visual-direction) 1)
|
|
|
|
(evil-mc-find-last-cursor)
|
|
|
|
(evil-mc-find-first-cursor))
|
2018-07-13 12:58:58 +02:00
|
|
|
nil)
|
|
|
|
(evil-mc-undo-cursor-at-pos (point))
|
|
|
|
(if (evil-mc-has-cursors-p)
|
|
|
|
(evil-mc-print-cursors-info "Created")
|
|
|
|
(evil-mc-message "No cursors were created")))
|