Separate kill-ring for each cursor.

This commit is contained in:
Magnar Sveen 2012-01-24 20:36:47 +01:00
parent 13668a9e1c
commit c18aa846b6

View File

@ -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)