dotemacs

My Emacs configuration
git clone git://git.entf.net/dotemacs
Log | Files | Refs | LICENSE

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