From 82a1fe37469c075c5fff9381b8826ede9228bbd0 Mon Sep 17 00:00:00 2001 From: Magnar Sveen Date: Sun, 10 Feb 2013 21:04:09 +0100 Subject: [PATCH] Add mc/sort-regions and mc/reverse-regions --- README.md | 2 + features/sort-and-reverse.feature | 19 +++++++ features/support/env.el | 2 + mc-insert-numbers.el | 47 ----------------- mc-separate-operations.el | 85 +++++++++++++++++++++++++++++++ multiple-cursors-core.el | 2 + multiple-cursors.el | 4 +- 7 files changed, 113 insertions(+), 48 deletions(-) create mode 100644 features/sort-and-reverse.feature delete mode 100644 mc-insert-numbers.el create mode 100644 mc-separate-operations.el diff --git a/README.md b/README.md index 9366cb0..968ec56 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,8 @@ You can [watch an intro to multiple-cursors at Emacs Rocks](http://emacsrocks.co - `set-rectangular-region-anchor`: Think of this one as `set-mark` except you're marking a rectangular region. - `mc/mark-sgml-tag-pair`: Mark the current opening and closing tag. - `mc/insert-numbers`: Insert increasing numbers for each cursor, top to bottom. + - `mc/sort-regions`: Sort the marked regions alphabetically. + - `mc/reverse-regions`: Reverse the order of the marked regions. ## Tips and tricks diff --git a/features/sort-and-reverse.feature b/features/sort-and-reverse.feature new file mode 100644 index 0000000..f5eea12 --- /dev/null +++ b/features/sort-and-reverse.feature @@ -0,0 +1,19 @@ +Feature: Sorting and reversing cursor regions + + Scenario: Reversing regions + Given I have cursors at "text" in "This text contains the word text thrice (text here)" + When I press "M-f" + And I press "C-f" + And I press "C-SPC" + And I press "M-f" + And I press "H-1" + Then I should see "This text here the word text thrice (text contains)" + + Scenario: Sorting regions + Given I have cursors at "text" in "This text contains the word text thrice (text here)" + When I press "M-f" + And I press "C-f" + And I press "C-SPC" + And I press "M-f" + And I press "H-2" + Then I should see "This text contains the word text here (text thrice)" diff --git a/features/support/env.el b/features/support/env.el index f6da1f5..4f6af30 100644 --- a/features/support/env.el +++ b/features/support/env.el @@ -26,6 +26,8 @@ (global-set-key (kbd "M-$") 'mc/mark-all-like-this-dwim) (global-set-key (kbd "M-#") 'mc/mark-all-in-region) (global-set-key (kbd "H-0") 'mc/insert-numbers) + (global-set-key (kbd "H-1") 'mc/reverse-regions) + (global-set-key (kbd "H-2") 'mc/sort-regions) (global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines) (global-set-key (kbd "H-SPC") 'set-rectangular-region-anchor) (switch-to-buffer diff --git a/mc-insert-numbers.el b/mc-insert-numbers.el deleted file mode 100644 index d226c69..0000000 --- a/mc-insert-numbers.el +++ /dev/null @@ -1,47 +0,0 @@ -;;; mc-insert-numbers.el - -;; Copyright (C) 2012 Magnar Sveen - -;; Author: Magnar Sveen -;; Keywords: editing cursors - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This file contains functions for adding increasing integers to -;; each cursor. - -;; Please see multiple-cursors.el for more commentary. - -;;; Code: - -(require 'multiple-cursors-core) - -;;;###autoload -(defun mc/insert-numbers (arg) - (interactive "P") - (setq mc--insert-numbers-number (or arg 0)) - (mc/for-each-cursor-ordered - (mc/execute-command-for-fake-cursor 'mc--insert-number-and-increase cursor))) - -(defvar mc--insert-numbers-number 0) - -(defun mc--insert-number-and-increase () - (interactive) - (insert (number-to-string mc--insert-numbers-number)) - (setq mc--insert-numbers-number (1+ mc--insert-numbers-number))) - -(provide 'mc-insert-numbers) -;;; mc-insert-numbers.el ends here diff --git a/mc-separate-operations.el b/mc-separate-operations.el new file mode 100644 index 0000000..f15dc7d --- /dev/null +++ b/mc-separate-operations.el @@ -0,0 +1,85 @@ +;;; mc-separate-operations.el - functions that work differently on each cursor + +;; Copyright (C) 2012 Magnar Sveen + +;; Author: Magnar Sveen +;; Keywords: editing cursors + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; This file contains functions that work differently on each cursor, +;; instead of treating all of them the same. + +;; Please see multiple-cursors.el for more commentary. + +;;; Code: + +(require 'multiple-cursors-core) + +;;;###autoload +(defun mc/insert-numbers (arg) + "Insert increasing numbers for each cursor, starting at 0 or ARG." + (interactive "P") + (setq mc--insert-numbers-number (or arg 0)) + (mc/for-each-cursor-ordered + (mc/execute-command-for-fake-cursor 'mc--insert-number-and-increase cursor))) + +(defvar mc--insert-numbers-number 0) + +(defun mc--insert-number-and-increase () + (interactive) + (insert (number-to-string mc--insert-numbers-number)) + (setq mc--insert-numbers-number (1+ mc--insert-numbers-number))) + +(defun mc--ordered-region-strings () + (let (strings) + (save-excursion + (mc/for-each-cursor-ordered + (add-to-list 'strings (buffer-substring-no-properties + (mc/cursor-beg cursor) + (mc/cursor-end cursor))))strings) + (nreverse strings))) + +(defvar mc--strings-to-replace nil) + +(defun mc--replace-region-strings-1 () + (interactive) + (delete-region (region-beginning) (region-end)) + (insert (car mc--strings-to-replace)) + (setq mc--strings-to-replace (cdr mc--strings-to-replace))) + +(defun mc--replace-region-strings () + (mc/for-each-cursor-ordered + (mc/execute-command-for-fake-cursor 'mc--replace-region-strings-1 cursor))) + +;;;###autoload +(defun mc/reverse-regions () + (interactive) + (if (not (use-region-p)) + (message "Mark regions to reverse first.") + (setq mc--strings-to-replace (nreverse (mc--ordered-region-strings))) + (mc--replace-region-strings))) + +;;;###autoload +(defun mc/sort-regions () + (interactive) + (if (not (use-region-p)) + (message "Mark regions to sort first.") + (setq mc--strings-to-replace (sort (mc--ordered-region-strings) 'string<)) + (mc--replace-region-strings))) + +(provide 'mc-separate-operations) +;;; mc-separate-operations.el ends here diff --git a/multiple-cursors-core.el b/multiple-cursors-core.el index be66a69..fc358cb 100644 --- a/multiple-cursors-core.el +++ b/multiple-cursors-core.el @@ -566,6 +566,8 @@ for running commands with multiple cursors.") mc/mark-all-like-this-dwim mc/mark-sgml-tag-pair mc/insert-numbers + mc/sort-regions + mc/reverse-regions mc/cycle-forward mc/cycle-backward rrm/switch-to-multiple-cursors diff --git a/multiple-cursors.el b/multiple-cursors.el index b618e3c..7ada1cc 100644 --- a/multiple-cursors.el +++ b/multiple-cursors.el @@ -83,6 +83,8 @@ ;; - `set-rectangular-region-anchor`: Think of this one as `set-mark` except you're marking a rectangular region. ;; - `mc/mark-sgml-tag-pair`: Mark the current opening and closing tag. ;; - `mc/insert-numbers`: Insert increasing numbers for each cursor, top to bottom. +;; - `mc/sort-regions`: Sort the marked regions alphabetically. +;; - `mc/reverse-regions`: Reverse the order of the marked regions. ;; ## Tips and tricks @@ -164,7 +166,7 @@ (require 'mc-cycle-cursors) (require 'mc-mark-more) (require 'rectangular-region-mode) -(require 'mc-insert-numbers) +(require 'mc-separate-operations) (provide 'multiple-cursors)