From 36b262c99eabb619dcc1bf733b0ffffef5f90a03 Mon Sep 17 00:00:00 2001 From: Magnar Sveen Date: Mon, 23 Jul 2012 22:06:09 +0200 Subject: [PATCH] Added mc-version of mark-next-like-this --- features/mark-more.feature | 41 ++++++++++++++++++++++++ features/support/env.el | 1 + mc-mark-more.el | 64 ++++++++++++++++++++++++++++++++++++++ multiple-cursors.el | 1 + 4 files changed, 107 insertions(+) create mode 100644 features/mark-more.feature create mode 100644 mc-mark-more.el diff --git a/features/mark-more.feature b/features/mark-more.feature new file mode 100644 index 0000000..6317823 --- /dev/null +++ b/features/mark-more.feature @@ -0,0 +1,41 @@ +Feature: Marking multiple parts of the buffer + + Scenario: Marking next like this, cursors + When I insert "This text has the word text in it" + And I select "text" + And I press "M->" + Then I should have 2 cursors + + Scenario: Marking next like this, region + Given I turn on delete-selection-mode + When I insert "This text has the word text in it" + And I select "text" + And I press "M->" + And I type "sentence" + Then I should see "This sentence has the word sentence in it" + + Scenario: Skipping a mark + Given I turn on delete-selection-mode + When I insert "Here's text, text and text" + And I select "text" + And I press "M->" + And I press "C-0 M->" + And I type "more" + Then I should see "Here's more, text and more" + + Scenario: Removing last fake + When I insert "Here's text, text and text" + And I select "text" + And I press "M->" + And I press "C-- M->" + Then I should have one cursor + + Scenario: Removing furthest mark + Given I turn on delete-selection-mode + When I insert "Here's text, text and text" + And I select "text" + And I press "M->" + And I press "M->" + And I press "C-- M->" + And I type "more" + Then I should see "Here's more, more and text" diff --git a/features/support/env.el b/features/support/env.el index d7a4748..108e0b2 100644 --- a/features/support/env.el +++ b/features/support/env.el @@ -20,6 +20,7 @@ (rectangular-region-mode 0) (mm/clear-all) (global-set-key (kbd "C->") 'mark-next-like-this) + (global-set-key (kbd "M->") 'mc/mark-next-like-this) (global-set-key (kbd "H-SPC") 'set-rectangular-region-anchor) (switch-to-buffer (get-buffer-create "*multiple-cursors*")) diff --git a/mc-mark-more.el b/mc-mark-more.el new file mode 100644 index 0000000..75e93f7 --- /dev/null +++ b/mc-mark-more.el @@ -0,0 +1,64 @@ +(defun mc/cursor-end (cursor) + (if (overlay-get cursor 'mark-active) + (max (overlay-get cursor 'point) + (overlay-get cursor 'mark)) + (overlay-get cursor 'point))) + +(defun mc/cursor-beg (cursor) + (if (overlay-get cursor 'mark-active) + (min (overlay-get cursor 'point) + (overlay-get cursor 'mark)) + (overlay-get cursor 'point))) + +(defun mc/furthest-region-end () + (let ((end (max (mark) (point)))) + (mc/for-each-fake-cursor + (setq end (max end (mc/cursor-end cursor)))) + end)) + +(defun mc/furthest-cursor-after-point () + (let ((end (max (mark) (point))) + furthest) + (mc/for-each-fake-cursor + (when (> (mc/cursor-end cursor) end) + (setq end (mc/cursor-end cursor)) + (setq furthest cursor))) + furthest)) + +(defun mc/region-strings () + (let ((strings (list (buffer-substring-no-properties (point) (mark))))) + (mc/for-each-fake-cursor + (add-to-list 'strings (buffer-substring-no-properties + (mc/cursor-beg cursor) + (mc/cursor-end cursor)))) + strings)) + +(defun mc/mark-next-like-this (arg) + "Find and mark the next part of the buffer matching the currently active region +With negative ARG, delete the last one instead. +With zero ARG, skip the last one and mark next." + (interactive "p") + (unless (region-active-p) + (error "Mark a region to match first.")) + (when (< arg 0) + (mc/remove-fake-cursor (mc/furthest-cursor-after-point))) + (when (>= arg 0) + (let ((case-fold-search nil) + (point-first (< (point) (mark))) + (re (regexp-opt (mc/region-strings))) + (furthest-cursor (mc/furthest-cursor-after-point))) + (mc/save-excursion + (goto-char (mc/furthest-region-end)) + (when (= arg 0) + (mc/remove-fake-cursor furthest-cursor)) + (if (search-forward-regexp re nil t) + (progn + (push-mark (match-beginning 0)) + (when point-first (exchange-point-and-mark)) + (mc/create-fake-cursor-at-point)) + (error "no more found forward"))))) + (if (> (mc/num-cursors) 1) + (multiple-cursors-mode 1) + (multiple-cursors-mode 0))) + +(provide 'mc-mark-more) diff --git a/multiple-cursors.el b/multiple-cursors.el index 3ceeaef..ef09102 100644 --- a/multiple-cursors.el +++ b/multiple-cursors.el @@ -75,6 +75,7 @@ (require 'multiple-cursors-core) (require 'mc-edit-lines) (require 'mc-cycle-cursors) +(require 'mc-mark-more) (require 'mc-mark-multiple-integration) (require 'rectangular-region-mode)