diff --git a/multiple-cursors.el b/multiple-cursors.el index e6aded8..bbc0bce 100644 --- a/multiple-cursors.el +++ b/multiple-cursors.el @@ -21,16 +21,17 @@ (defun mc/add-cursor-at-point () (let ((overlay (mc/make-cursor-overlay-at-point))) (overlay-put overlay 'type 'additional-cursor) + (overlay-put overlay 'kill-ring kill-ring) (overlay-put overlay 'priority 100))) (setq mc--cmds '(self-insert-command previous-line next-line newline - right-char - right-word - left-char - left-word + right-char forward-char + right-word forward-word + left-char backward-char + left-word backward-word yank kill-word kill-region-or-backward-word @@ -41,18 +42,34 @@ move-end-of-line-or-next-line move-start-of-line-or-prev-line)) -(defun mc/execute-this-command-for-all-cursors () - (if (not (memq this-original-command mc--cmds)) - (message "Skipping %S" this-original-command) +(setq mc--unsupported-cmds '(yank-pop)) + +;; todo: macro-ify and iterate over mc--unsupported-cmds +(defadvice yank-pop (around yank-pop-unsupported-advice activate) + "yank-pop isn't supported with multiple cursors" + (unless multiple-cursors-mode + ad-do-it)) + +(defun mc/execute-command-for-all-cursors (cmd) + (let ((current-kill-ring kill-ring)) (save-excursion (mapc #'(lambda (o) (when (eq (overlay-get o 'type) 'additional-cursor) (goto-char (overlay-start o)) + (setq kill-ring (overlay-get o 'kill-ring)) (delete-overlay o) (ignore-errors - (call-interactively this-original-command) + (call-interactively cmd) (mc/add-cursor-at-point)))) - (overlays-in (point-min) (point-max)))))) + (overlays-in (point-min) (point-max)))) + (setq kill-ring current-kill-ring))) + +(defun mc/execute-this-command-for-all-cursors () + (if (memq this-original-command mc--unsupported-cmds) + (message "%S is not supported with multiple cursors" this-original-command) + (if (not (memq this-original-command mc--cmds)) + (message "Skipping %S" this-original-command) + (mc/execute-command-for-all-cursors this-original-command)))) (defun mc/remove-additional-cursors () (mapc #'(lambda (o) @@ -75,8 +92,10 @@ (mc/remove-additional-cursors)) (t (add-hook 'post-command-hook 'mc/execute-this-command-for-all-cursors t t)))) -(defun mc/edit-ends-of-lines () +(defun mc/add-multiple-cursors-to-region-lines () (interactive) + (when (not (use-region-p)) + (error "Mark a set of lines first.")) (mc/remove-additional-cursors) (let* ((point-line (line-number-at-pos)) (mark-line (save-excursion (exchange-point-and-mark) (line-number-at-pos))) @@ -84,11 +103,21 @@ (navigation-func (if (< point-line mark-line) 'previous-line 'next-line))) (exchange-point-and-mark) (while (not (eq (line-number-at-pos) point-line)) - (end-of-line) (mc/add-cursor-at-point) (funcall navigation-func)) - (end-of-line) (deactivate-mark) (multiple-cursors-mode))) +(defun mc/edit-ends-of-lines () + (interactive) + (mc/add-multiple-cursors-to-region-lines) + (mc/execute-command-for-all-cursors 'end-of-line) + (end-of-line)) + +(defun mc/edit-beginnings-of-lines () + (interactive) + (mc/add-multiple-cursors-to-region-lines) + (mc/execute-command-for-all-cursors 'beginning-of-line) + (beginning-of-line)) + (provide 'multiple-cursors)