mc-separate-operations.el (4868B)
1 ;;; mc-separate-operations.el - functions that work differently on each cursor 2 3 ;; Copyright (C) 2012 Magnar Sveen 4 5 ;; Author: Magnar Sveen <magnars@gmail.com> 6 ;; Keywords: editing cursors 7 8 ;; This program is free software; you can redistribute it and/or modify 9 ;; it under the terms of the GNU General Public License as published by 10 ;; the Free Software Foundation, either version 3 of the License, or 11 ;; (at your option) any later version. 12 13 ;; This program is distributed in the hope that it will be useful, 14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 ;; GNU General Public License for more details. 17 18 ;; You should have received a copy of the GNU General Public License 19 ;; along with this program. If not, see <http://www.gnu.org/licenses/>. 20 21 ;;; Commentary: 22 23 ;; This file contains functions that work differently on each cursor, 24 ;; instead of treating all of them the same. 25 26 ;; Please see multiple-cursors.el for more commentary. 27 28 ;;; Code: 29 30 (require 'multiple-cursors-core) 31 32 ;;;###autoload 33 (defun mc/insert-numbers (arg) 34 "Insert increasing numbers for each cursor, starting at 0 or ARG." 35 (interactive "P") 36 (setq mc--insert-numbers-number (or (and arg (prefix-numeric-value arg)) 37 0)) 38 (mc/for-each-cursor-ordered 39 (mc/execute-command-for-fake-cursor 'mc--insert-number-and-increase cursor))) 40 41 (defvar mc--insert-numbers-number 0) 42 43 (defun mc--insert-number-and-increase () 44 (interactive) 45 (insert (number-to-string mc--insert-numbers-number)) 46 (setq mc--insert-numbers-number (1+ mc--insert-numbers-number))) 47 48 (defun mc--ordered-region-strings () 49 (let (strings) 50 (save-excursion 51 (mc/for-each-cursor-ordered 52 (setq strings (cons (buffer-substring-no-properties 53 (mc/cursor-beg cursor) 54 (mc/cursor-end cursor)) strings)))) 55 (nreverse strings))) 56 57 ;;;###autoload 58 (defun mc/insert-letters (arg) 59 "Insert increasing letters for each cursor, starting at 0 or ARG. 60 Where letter[0]=a letter[2]=c letter[26]=aa" 61 (interactive "P") 62 (setq mc--insert-letters-number (or (and arg (prefix-numeric-value arg)) 63 0)) 64 (mc/for-each-cursor-ordered 65 (mc/execute-command-for-fake-cursor 'mc--insert-letter-and-increase cursor))) 66 67 (defun mc--number-to-letters (number) 68 (let ((letter 69 (char-to-string 70 (+ (mod number 26) ?a))) 71 (number2 (/ number 26))) 72 (if (> number2 0) 73 (concat (mc--number-to-letters (- number2 1)) letter) 74 letter))) 75 76 (defvar mc--insert-letters-number 0) 77 78 (defun mc--insert-letter-and-increase () 79 (interactive) 80 (insert (mc--number-to-letters mc--insert-letters-number)) 81 (setq mc--insert-letters-number (1+ mc--insert-letters-number))) 82 83 (defvar mc--strings-to-replace nil) 84 85 (defun mc--replace-region-strings-1 () 86 (interactive) 87 (delete-region (region-beginning) (region-end)) 88 (save-excursion (insert (car mc--strings-to-replace))) 89 (setq mc--strings-to-replace (cdr mc--strings-to-replace))) 90 91 (defun mc--replace-region-strings () 92 (mc/for-each-cursor-ordered 93 (mc/execute-command-for-fake-cursor 'mc--replace-region-strings-1 cursor))) 94 95 ;;;###autoload 96 (defun mc/reverse-regions () 97 (interactive) 98 (if (not multiple-cursors-mode) 99 (progn 100 (mc/mark-next-lines 1) 101 (mc/reverse-regions) 102 (multiple-cursors-mode 0)) 103 (unless (use-region-p) 104 (mc/execute-command-for-all-cursors 'mark-sexp)) 105 (setq mc--strings-to-replace (nreverse (mc--ordered-region-strings))) 106 (mc--replace-region-strings))) 107 108 ;;;###autoload 109 (defun mc/sort-regions () 110 (interactive) 111 (unless (use-region-p) 112 (mc/execute-command-for-all-cursors 'mark-sexp)) 113 (setq mc--strings-to-replace (sort (mc--ordered-region-strings) 'string<)) 114 (mc--replace-region-strings)) 115 116 117 ;;;###autoload 118 (defun mc/vertical-align (character) 119 "Aligns all cursors vertically with a given CHARACTER to the one with the 120 highest colum number (the rightest). 121 Might not behave as intended if more than one cursors are on the same line." 122 (interactive "c") 123 (let ((rightest-column (current-column))) 124 (mc/execute-command-for-all-cursors 125 (lambda () "get the rightest cursor" 126 (interactive) 127 (setq rightest-column (max (current-column) rightest-column)) 128 )) 129 (mc/execute-command-for-all-cursors 130 (lambda () 131 (interactive) 132 (let ((missing-spaces (- rightest-column (current-column)))) 133 (save-excursion (insert (make-string missing-spaces character))) 134 (forward-char missing-spaces) 135 ) 136 )) 137 ) 138 ) 139 140 ;;;###autoload 141 (defun mc/vertical-align-with-space () 142 "Aligns all cursors with whitespace like `mc/vertical-align' does" 143 (interactive) 144 (mc/vertical-align 32) 145 ) 146 147 (provide 'mc-separate-operations) 148 ;;; mc-separate-operations.el ends here