Selaa lähdekoodia

added all the things

master
Paul Longtine 10 vuotta sitten
commit
ac5cbfaae7
74 muutettua tiedostoa jossa 6038 lisäystä ja 0 poistoa
  1. 32
    0
      emacs/.emacs
  2. 13
    0
      emacs/.emacs.d/.mc-lists.el
  3. 6
    0
      emacs/.emacs.d/auto-save-list/.saves-10991-warning.home~
  4. 6
    0
      emacs/.emacs.d/auto-save-list/.saves-13254-warning.home~
  5. 4
    0
      emacs/.emacs.d/auto-save-list/.saves-14224-warning~
  6. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-14744-warning~
  7. 2
    0
      emacs/.emacs.d/auto-save-list/.saves-16833-warning~
  8. 2
    0
      emacs/.emacs.d/auto-save-list/.saves-18580-warning~
  9. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-2250-home~
  10. 8
    0
      emacs/.emacs.d/auto-save-list/.saves-2269-warning~
  11. 2
    0
      emacs/.emacs.d/auto-save-list/.saves-22796-warning~
  12. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-2315-home~
  13. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-2357-home~
  14. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-2369-home~
  15. 16
    0
      emacs/.emacs.d/auto-save-list/.saves-2381-warning~
  16. 2
    0
      emacs/.emacs.d/auto-save-list/.saves-23863-warning~
  17. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-2396-home~
  18. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-2475-home~
  19. 4
    0
      emacs/.emacs.d/auto-save-list/.saves-24850-warning~
  20. 8
    0
      emacs/.emacs.d/auto-save-list/.saves-25053-warning.home~
  21. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-2831-home~
  22. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-28895-warning~
  23. 10
    0
      emacs/.emacs.d/auto-save-list/.saves-3084-warning~
  24. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-3197-home~
  25. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-3202-home~
  26. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-3850-home~
  27. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-3862-warning.home~
  28. 2
    0
      emacs/.emacs.d/auto-save-list/.saves-4030-warning.home~
  29. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-4213-warning~
  30. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-4325-warning~
  31. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-4396-warning~
  32. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-4657-warning.home~
  33. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-5180-home~
  34. 6
    0
      emacs/.emacs.d/auto-save-list/.saves-6206-warning~
  35. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-7875-home~
  36. 2
    0
      emacs/.emacs.d/auto-save-list/.saves-7906-warning~
  37. 4
    0
      emacs/.emacs.d/auto-save-list/.saves-8433-warning~
  38. 2
    0
      emacs/.emacs.d/auto-save-list/.saves-8788-warning~
  39. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-9494-warning~
  40. 0
    0
      emacs/.emacs.d/auto-save-list/.saves-9918-warning.home~
  41. 6
    0
      emacs/.emacs.d/auto-save-list/.saves-9969-warning~
  42. 1126
    0
      emacs/.emacs.d/autopair.el
  43. BIN
      emacs/.emacs.d/master.zip
  44. 2
    0
      emacs/.emacs.d/multiple-cursors/.gitignore
  45. 21
    0
      emacs/.emacs.d/multiple-cursors/.travis.yml
  46. 9
    0
      emacs/.emacs.d/multiple-cursors/Cask
  47. 199
    0
      emacs/.emacs.d/multiple-cursors/README.md
  48. 140
    0
      emacs/.emacs.d/multiple-cursors/features/edit-lines.feature
  49. 13
    0
      emacs/.emacs.d/multiple-cursors/features/insert-numbers.feature
  50. 94
    0
      emacs/.emacs.d/multiple-cursors/features/mark-all-dwim-html.feature
  51. 90
    0
      emacs/.emacs.d/multiple-cursors/features/mark-all-dwim.feature
  52. 144
    0
      emacs/.emacs.d/multiple-cursors/features/mark-more.feature
  53. 88
    0
      emacs/.emacs.d/multiple-cursors/features/mark-pop.feature
  54. 137
    0
      emacs/.emacs.d/multiple-cursors/features/mark-things.feature
  55. 188
    0
      emacs/.emacs.d/multiple-cursors/features/multiple-cursors-core.feature
  56. 73
    0
      emacs/.emacs.d/multiple-cursors/features/rectangular-region.feature
  57. 19
    0
      emacs/.emacs.d/multiple-cursors/features/sort-and-reverse.feature
  58. 139
    0
      emacs/.emacs.d/multiple-cursors/features/step-definitions/multiple-cursors-steps.el
  59. 45
    0
      emacs/.emacs.d/multiple-cursors/features/support/env.el
  60. 122
    0
      emacs/.emacs.d/multiple-cursors/mc-cycle-cursors.el
  61. 110
    0
      emacs/.emacs.d/multiple-cursors/mc-edit-lines.el
  62. 561
    0
      emacs/.emacs.d/multiple-cursors/mc-mark-more.el
  63. 22
    0
      emacs/.emacs.d/multiple-cursors/mc-mark-pop.el
  64. 90
    0
      emacs/.emacs.d/multiple-cursors/mc-separate-operations.el
  65. 729
    0
      emacs/.emacs.d/multiple-cursors/multiple-cursors-core.el
  66. 2
    0
      emacs/.emacs.d/multiple-cursors/multiple-cursors-pkg.el
  67. 191
    0
      emacs/.emacs.d/multiple-cursors/multiple-cursors.el
  68. 124
    0
      emacs/.emacs.d/multiple-cursors/rectangular-region-mode.el
  69. 2
    0
      emacs/.emacs.d/multiple-cursors/run-tests.sh
  70. 13
    0
      emacs/.emacs.d/multiple-cursors/run-travis-ci.sh
  71. 45
    0
      emacs/.emacs.d/multiple-cursors/watch-tests.watchr
  72. 1103
    0
      emacs/.emacs.d/php-mode.el
  73. 70
    0
      i3/.i3status.conf
  74. 190
    0
      i3/config

+ 32
- 0
emacs/.emacs Näytä tiedosto

@@ -0,0 +1,32 @@
; Young .emacs for the powerful

(custom-set-variables
'(make-backup-files nil)
'(scroll-bar-mode nil)
'(tool-bar-mode nil)
'(menu-bar-mode nil)
'(tooltip-mode nil))

(add-to-list 'load-path "~/.emacs.d/")

;; Multiple Cursor
(add-to-list 'load-path "~/.emacs.d/multiple-cursors")
(require 'multiple-cursors)
(global-set-key (kbd "C-c d") 'mc/edit-lines)
(global-set-key (kbd "C-c x") 'mc/mark-all-like-this)
(global-set-key (kbd "C-c n") 'mc/mark-next-like-this)
(global-set-key (kbd "C-c p") 'mc/mark-previous-like-this)

(require 'autopair)
(autopair-global-mode)

;; keybind yo

(global-set-key (kbd "C-c {") 'enlarge-window-horizontally)
(global-set-key (kbd "C-c }") 'shrink-window-horizontally)

;; make whitespace-mode use just basic coloring

(setq whitespace-style (quote (spaces tabs space-mark tab-mark)))

(global-whitespace-mode 1)

+ 13
- 0
emacs/.emacs.d/.mc-lists.el Näytä tiedosto

@@ -0,0 +1,13 @@
;; This file is automatically generated by the multiple-cursors extension.
;; It keeps track of your preferences for running commands with multiple cursors.

(setq mc/cmds-to-run-for-all
'(
kill-region
undefined
))

(setq mc/cmds-to-run-once
'(
write-file
))

+ 6
- 0
emacs/.emacs.d/auto-save-list/.saves-10991-warning.home~ Näytä tiedosto

@@ -0,0 +1,6 @@
/home/paul/.i3status.conf
/home/paul/#.i3status.conf#
/home/paul/.i3/config
/home/paul/.i3/#config#
/home/paul/.emacs
/home/paul/#.emacs#

+ 6
- 0
emacs/.emacs.d/auto-save-list/.saves-13254-warning.home~ Näytä tiedosto

@@ -0,0 +1,6 @@
/home/paul/Dropbox/stuffs/web/eport2/style/style.css
/home/paul/Dropbox/stuffs/web/eport2/style/#style.css#
/home/paul/Dropbox/stuffs/web/eport2/index.html
/home/paul/Dropbox/stuffs/web/eport2/#index.html#
/home/paul/.i3status.conf
/home/paul/#.i3status.conf#

+ 4
- 0
emacs/.emacs.d/auto-save-list/.saves-14224-warning~ Näytä tiedosto

@@ -0,0 +1,4 @@
/usr/share/themes/Ambiance/gtk-3.0/gtk.css
/usr/share/themes/Ambiance/gtk-3.0/#gtk.css#
/home/paul/.i3/config
/home/paul/.i3/#config#

+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-14744-warning~ Näytä tiedosto


+ 2
- 0
emacs/.emacs.d/auto-save-list/.saves-16833-warning~ Näytä tiedosto

@@ -0,0 +1,2 @@
/home/paul/.i3/config
/home/paul/.i3/#config#

+ 2
- 0
emacs/.emacs.d/auto-save-list/.saves-18580-warning~ Näytä tiedosto

@@ -0,0 +1,2 @@
/home/paul/.i3/config
/home/paul/.i3/#config#

+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-2250-home~ Näytä tiedosto


+ 8
- 0
emacs/.emacs.d/auto-save-list/.saves-2269-warning~ Näytä tiedosto

@@ -0,0 +1,8 @@
/home/paul/.config/user-dirs.dirs
/home/paul/.config/#user-dirs.dirs#
/home/paul/.dotfiles/source/command_prompt.sh
/home/paul/.dotfiles/source/#command_prompt.sh#
/home/paul/Desktop/pnbp/mod/blog.py
/home/paul/Desktop/pnbp/mod/#blog.py#
/home/paul/Desktop/pnbp/compile.py
/home/paul/Desktop/pnbp/#compile.py#

+ 2
- 0
emacs/.emacs.d/auto-save-list/.saves-22796-warning~ Näytä tiedosto

@@ -0,0 +1,2 @@
/usr/share/themes/Ambiance/gtk-2.0/gtkrc
/usr/share/themes/Ambiance/gtk-2.0/#gtkrc#

+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-2315-home~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-2357-home~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-2369-home~ Näytä tiedosto


+ 16
- 0
emacs/.emacs.d/auto-save-list/.saves-2381-warning~ Näytä tiedosto

@@ -0,0 +1,16 @@
/home/paul/desktop/pnbp/mod/blog.py
/home/paul/desktop/pnbp/mod/#blog.py#
/home/paul/desktop/pnbp/data/test.json
/home/paul/desktop/pnbp/data/#test.json#
/home/paul/desktop/pnbp/pages.json
/home/paul/desktop/pnbp/#pages.json#
/home/paul/desktop/pnbp/compile.py
/home/paul/desktop/pnbp/#compile.py#
/home/paul/desktop/pnbp/data/admin/post.php
/home/paul/desktop/pnbp/data/admin/#post.php#
/home/paul/desktop/pnbp/data/admin/index.php
/home/paul/desktop/pnbp/data/admin/#index.php#
/home/paul/desktop/pnbp/templates/std.html
/home/paul/desktop/pnbp/templates/#std.html#
/home/paul/desktop/pnbp/data/styles/style.css
/home/paul/desktop/pnbp/data/styles/#style.css#

+ 2
- 0
emacs/.emacs.d/auto-save-list/.saves-23863-warning~ Näytä tiedosto

@@ -0,0 +1,2 @@
/usr/share/themes/Ambiance/gtk-2.0/gtkrc
/usr/share/themes/Ambiance/gtk-2.0/#gtkrc#

+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-2396-home~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-2475-home~ Näytä tiedosto


+ 4
- 0
emacs/.emacs.d/auto-save-list/.saves-24850-warning~ Näytä tiedosto

@@ -0,0 +1,4 @@
/usr/share/themes/Ambiance/gtk-2.0/gtkrc
/usr/share/themes/Ambiance/gtk-2.0/#gtkrc#
/home/paul/.i3/config
/home/paul/.i3/#config#

+ 8
- 0
emacs/.emacs.d/auto-save-list/.saves-25053-warning.home~ Näytä tiedosto

@@ -0,0 +1,8 @@
/home/paul/Dropbox/stuffs/web/eport2/index.html
/home/paul/Dropbox/stuffs/web/eport2/#index.html#
/home/paul/Dropbox/stuffs/web/eport2/style/style.css
/home/paul/Dropbox/stuffs/web/eport2/style/#style.css#
/home/paul/Dropbox/stuffs/web/eport2/projects/index.html
/home/paul/Dropbox/stuffs/web/eport2/projects/#index.html#
/home/paul/Dropbox/stuffs/web/eport2/contact/index.html
/home/paul/Dropbox/stuffs/web/eport2/contact/#index.html#

+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-2831-home~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-28895-warning~ Näytä tiedosto


+ 10
- 0
emacs/.emacs.d/auto-save-list/.saves-3084-warning~ Näytä tiedosto

@@ -0,0 +1,10 @@
/home/paul/.i3status.conf
/home/paul/#.i3status.conf#
/home/paul/.i3/config
/home/paul/.i3/#config#
/home/paul/.conkyrc
/home/paul/#.conkyrc#
/home/paul/Dropbox/stuffs/config/.conkyrc
/home/paul/Dropbox/stuffs/config/#.conkyrc#
/home/paul/bin/conky-i3bar
/home/paul/bin/#conky-i3bar#

+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-3197-home~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-3202-home~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-3850-home~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-3862-warning.home~ Näytä tiedosto


+ 2
- 0
emacs/.emacs.d/auto-save-list/.saves-4030-warning.home~ Näytä tiedosto

@@ -0,0 +1,2 @@
/home/paul/.i3/config
/home/paul/.i3/#config#

+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-4213-warning~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-4325-warning~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-4396-warning~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-4657-warning.home~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-5180-home~ Näytä tiedosto


+ 6
- 0
emacs/.emacs.d/auto-save-list/.saves-6206-warning~ Näytä tiedosto

@@ -0,0 +1,6 @@
/home/paul/.chrome-ext/noflash/script.js
/home/paul/.chrome-ext/noflash/#script.js#
/home/paul/.chrome-ext/noflash/manifest.json
/home/paul/.chrome-ext/noflash/#manifest.json#
/home/paul/.i3/config
/home/paul/.i3/#config#

+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-7875-home~ Näytä tiedosto


+ 2
- 0
emacs/.emacs.d/auto-save-list/.saves-7906-warning~ Näytä tiedosto

@@ -0,0 +1,2 @@
/home/paul/.conkyrc
/home/paul/#.conkyrc#

+ 4
- 0
emacs/.emacs.d/auto-save-list/.saves-8433-warning~ Näytä tiedosto

@@ -0,0 +1,4 @@
/home/paul/.i3/config
/home/paul/.i3/#config#
/home/paul/.i3status.conf
/home/paul/#.i3status.conf#

+ 2
- 0
emacs/.emacs.d/auto-save-list/.saves-8788-warning~ Näytä tiedosto

@@ -0,0 +1,2 @@
/home/paul/.i3/config
/home/paul/.i3/#config#

+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-9494-warning~ Näytä tiedosto


+ 0
- 0
emacs/.emacs.d/auto-save-list/.saves-9918-warning.home~ Näytä tiedosto


+ 6
- 0
emacs/.emacs.d/auto-save-list/.saves-9969-warning~ Näytä tiedosto

@@ -0,0 +1,6 @@
/home/paul/desktop/pnbp/compile.py
/home/paul/desktop/pnbp/#compile.py#
/home/paul/desktop/pnbp/includes/header.html
/home/paul/desktop/pnbp/includes/#header.html#
/home/paul/desktop/pnbp/templates/post.html
/home/paul/desktop/pnbp/templates/#post.html#

+ 1126
- 0
emacs/.emacs.d/autopair.el
File diff suppressed because it is too large
Näytä tiedosto


BIN
emacs/.emacs.d/master.zip Näytä tiedosto


+ 2
- 0
emacs/.emacs.d/multiple-cursors/.gitignore Näytä tiedosto

@@ -0,0 +1,2 @@
elpa
*.elc

+ 21
- 0
emacs/.emacs.d/multiple-cursors/.travis.yml Näytä tiedosto

@@ -0,0 +1,21 @@
language: emacs-lisp
before_install:
- if [ "$EMACS" = 'emacs-snapshot' ]; then
sudo add-apt-repository -y ppa:cassou/emacs &&
sudo apt-get update -qq &&
sudo apt-get install -qq
emacs-snapshot-el emacs-snapshot-gtk emacs-snapshot;
fi
- if [ "$EMACS" = 'emacs24' ]; then
sudo add-apt-repository -y ppa:cassou/emacs &&
sudo apt-get update -qq &&
sudo apt-get install -qq
emacs24 emacs24-el emacs24-common-non-dfsg;
fi
- curl -fsSkL https://raw.github.com/cask/cask/master/go | python
- export PATH="/home/travis/.cask/bin:$PATH"
- cask
env:
- EMACS=emacs24 TAGS=""
script:
./run-travis-ci.sh

+ 9
- 0
emacs/.emacs.d/multiple-cursors/Cask Näytä tiedosto

@@ -0,0 +1,9 @@
(source gnu)
(source melpa)

(package-file "multiple-cursors.el")

(development
(depends-on "ecukes")
(depends-on "espuds")
(depends-on "wrap-region"))

+ 199
- 0
emacs/.emacs.d/multiple-cursors/README.md Näytä tiedosto

@@ -0,0 +1,199 @@
# multiple-cursors.el [![Build Status](https://secure.travis-ci.org/magnars/multiple-cursors.el.png)](http://travis-ci.org/magnars/multiple-cursors.el)

Multiple cursors for Emacs. This is some pretty crazy functionality, so yes,
there are kinks. Don't be afraid tho, I've been using it since 2011 with
great success and much merriment.

## Basic usage

Start out with:

(require 'multiple-cursors)

Then you have to set up your keybindings - multiple-cursors doesn't presume to
know how you'd like them laid out. Here are some examples:

When you have an active region that spans multiple lines, the following will
add a cursor to each line:

(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)

When you want to add multiple cursors not based on continuous lines, but based on
keywords in the buffer, use:

(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)

First mark the word, then add more cursors.

To get out of multiple-cursors-mode, press `<return>` or `C-g`. The latter will
first disable multiple regions before disabling multiple cursors. If you want to
insert a newline in multiple-cursors-mode, use `C-j`.

## Video

You can [watch an intro to multiple-cursors at Emacs Rocks](http://emacsrocks.com/e13.html).

## Command overview

### Mark one more occurrence

- `mc/mark-next-like-this`: Adds a cursor and region at the next part of the buffer forwards that matches the current region.
- `mc/mark-next-word-like-this`: Like `mc/mark-next-like-this` but only for whole words.
- `mc/mark-next-symbol-like-this`: Like `mc/mark-next-like-this` but only for whole symbols.
- `mc/mark-previous-like-this`: Adds a cursor and region at the next part of the buffer backwards that matches the current region.
- `mc/mark-previous-word-like-this`: Like `mc/mark-previous-like-this` but only for whole words.
- `mc/mark-previous-symbol-like-this`: Like `mc/mark-previous-like-this` but only for whole symbols.
- `mc/mark-more-like-this-extended`: Use arrow keys to quickly mark/skip next/previous occurances.
- `mc/add-cursor-on-click`: Bind to a mouse event to add cursors by clicking. See tips-section.
- `mc/mark-pop`: Set a cursor at the current point and move to the next (different) position on the mark stack. This allows for fine grained control over the placement of cursors.

### Juggle around with the current cursors

- `mc/unmark-next-like-this`: Remove the cursor furthest down in the buffer.
- `mc/unmark-previous-like-this`: Remove the cursor furthest up in the buffer.
- `mc/skip-to-next-like-this`: Remove the cursor furthest down, marking the next occurance down.
- `mc/skip-to-previous-like-this`: Remove the cursor furthest up, marking the next occurance up.
- `mc/mark-next-like-this-extended`: Temporarily bind the arrow keys to mark/unmark/skip cursors.

### Mark many occurrences

- `mc/edit-lines`: Adds one cursor to each line in the current region.
- `mc/edit-beginnings-of-lines`: Adds a cursor at the start of each line in the current region.
- `mc/edit-ends-of-lines`: Adds a cursor at the end of each line in the current region.
- `mc/mark-all-like-this`: Marks all parts of the buffer that matches the current region.
- `mc/mark-all-words-like-this`: Like `mc/mark-all-like-this` but only for whole words.
- `mc/mark-all-symbols-like-this`: Like `mc/mark-all-like-this` but only for whole symbols.
- `mc/mark-all-in-region`: Prompts for a string to match in the region, adding cursors to all of them.
- `mc/mark-all-like-this-in-defun`: Marks all parts of the current defun that matches the current region.
- `mc/mark-all-words-like-this-in-defun`: Like `mc/mark-all-like-this-in-defun` but only for whole words.
- `mc/mark-all-symbols-like-this-in-defun`: Like `mc/mark-all-like-this-in-defun` but only for whole symbols.
- `mc/mark-all-dwim`: Tries to be smart about marking everything you want. Can be pressed multiple times.

### Special

- `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

- To get out of multiple-cursors-mode, press `<return>` or `C-g`. The latter will
first disable multiple regions before disabling multiple cursors. If you want to
insert a newline in multiple-cursors-mode, use `C-j`.

- Sometimes you end up with cursors outside of your view. You can
scroll the screen to center on each cursor with `C-v` and `M-v`.

- Try pressing `mc/mark-next-like-this` with no region selected. It
will just add a cursor on the next line.

- Try pressing `mc/mark-all-like-this-dwim` on a tagname in html-mode.

- Notice that the number of cursors active can be seen in the modeline.

- If you get out of multiple-cursors-mode and yank - it will yank only
from the kill-ring of main cursor. To yank from the kill-rings of
every cursor use yank-rectangle, normally found at C-x r y.

- You can use `mc/reverse-regions` with nothing selected and just one cursor.
It will then flip the sexp at point and the one below it.

- When you use `mc/edit-lines`, you can give it a positive or negative
prefix to change how it behaves on too short lines.

- If you would like to keep the global bindings clean, and get custom keybindings
when the region is active, you can try [region-bindings-mode](https://github.com/fgallina/region-bindings-mode).

BTW, I highly recommend adding `mc/mark-next-like-this` to a key binding that's
right next to the key for `er/expand-region`.

### Binding mouse events

To override a mouse event, you will likely have to also unbind the
`down-mouse` part of the event. Like this:

(global-unset-key (kbd "M-<down-mouse-1>"))
(global-set-key (kbd "M-<mouse-1>") 'mc/add-cursor-on-click)

Or you can do like me and find an unused, but less convenient, binding:

(global-set-key (kbd "C-S-<mouse-1>") 'mc/add-cursor-on-click)

## Unknown commands

Multiple-cursors uses two lists of commands to know what to do: the run-once list
and the run-for-all list. It comes with a set of defaults, but it would be beyond silly
to try and include all the known Emacs commands.

So that's why multiple-cursors occasionally asks what to do about a command. It will
then remember your choice by saving it in `~/.emacs.d/.mc-lists.el`. You can change
the location with:

(setq mc/list-file "/my/preferred/file")

NB! Make sure to do so before requiring multiple-cursors.

## Known limitations

* isearch-forward and isearch-backward aren't supported with multiple cursors.
If you want this functionality, you can use [phi-search](https://github.com/zk-phi/phi-search).
* Commands run with `M-x` won't be repeated for all cursors.
* All key bindings that refer to lambdas are always run for all cursors. If you
need to limit it, you will have to give it a name.
* Redo might screw with your cursors. Undo works very well.


## Contribute

Yes, please do. There's a suite of tests, so remember to add tests for your
specific feature, or I might break it later.

You'll find the repo at:

https://github.com/magnars/multiple-cursors.el

To fetch the test dependencies, install
[cask](https://github.com/rejeep/cask.el) if you haven't already,
then:

$ cd /path/to/multiple-cursors
$ cask

Run the tests with:

$ ./run-tests.sh

## Contributors

* [Takafumi Arakaki](https://github.com/tkf) has contributed several small improvements
* [Marco Baringer](https://github.com/segv) contributed looping to `mc/cycle` and adding cursors without region for mark-more.
* [Ivan Andrus](https://github.com/gvol) added showing number of cursors in mode-line, and different options for how to handle short lines in `mc/edit-lines`.
* [Fuco](https://github.com/Fuco1) added the first version of `mc/mark-all-like-this-dwim`
* [Zach Kost-Smith](https://github.com/smithzvk) added `mc/mark-pop`
* [Maciej Katafiasz](https://github.com/mathrick) added `mc/mark-all-dwim`

Thanks!

## License

Copyright (C) 2012 Magnar Sveen

Author: Magnar Sveen <magnars@gmail.com>
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 <http://www.gnu.org/licenses/>.

+ 140
- 0
emacs/.emacs.d/multiple-cursors/features/edit-lines.feature Näytä tiedosto

@@ -0,0 +1,140 @@
Feature: Switching from a multiline region to multiple cursors

Scenario: Single line region
When I insert "hello there"
And I select "there"
And I press "C-S-c C-S-c"
Then I should have one cursor

Scenario: Edit lines
When I insert:
"""
hello
there
"""
And I go to the front of the word "hello"
And I set the mark
And I go to the front of the word "there"
And I press "C-S-c C-S-c"
Then I should have 2 cursors

Scenario: Edit lines from bottom up
When I insert:
"""
hello
there
"""
And I go to the front of the word "there"
And I set the mark
And I go to the front of the word "hello"
And I press "C-S-c C-S-c"
Then I should have one cursor

Scenario: Edit only real lines, even in visual-line-mode
Given I turn on visual-line-mode
And I insert:
"""
some very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very
long text
"""
And I go to the front of the word "some"
And I set the mark
And I go to the front of the word "long"
And I press "C-S-c C-S-c"
Then I should have 2 cursors

Scenario: Edit without using transient mark mode
Given I turn off transient-mark-mode
And I insert:
"""
hello
there
"""
And I go to the front of the word "hello"
And I set the mark
And I go to the front of the word "there"
And I press "C-S-c C-S-c"
Then I should have 2 cursors

Scenario: Edit default short lines
When I insert:
"""
hello

there
"""
And I go to the end of the word "hello"
And I set the mark
And I go to the end of the word "there"
And I press "C-S-c C-S-c"
And I press "you"
Then I should see:
"""
helloyou
you
thereyou
"""

Scenario: Pad short lines
When I insert:
"""
hello

there
"""
And I go to the end of the word "hello"
And I set the mark
And I go to the end of the word "there"
And I press "M-1 C-S-c C-S-c"
Then I should have 3 cursors

Scenario: Edit padding short lines
When I insert:
"""
hello

there
"""
And I go to the end of the word "hello"
And I set the mark
And I go to the end of the word "there"
And I press "M-1 C-S-c C-S-c"
And I press "you"
Then I should see:
"""
helloyou
you
thereyou
"""

Scenario: Skip short lines
When I insert:
"""
hello

there
"""
And I go to the end of the word "hello"
And I set the mark
And I go to the end of the word "there"
And I press "M-- M-1 C-S-c C-S-c"
Then I should have 2 cursors

Scenario: Edit skipping short lines
When I insert:
"""
hello

there
"""
And I go to the end of the word "hello"
And I set the mark
And I go to the end of the word "there"
And I press "M-- M-1 C-S-c C-S-c"
And I press "you"
Then I should see:
"""
helloyou

thereyou
"""

+ 13
- 0
emacs/.emacs.d/multiple-cursors/features/insert-numbers.feature Näytä tiedosto

@@ -0,0 +1,13 @@
Feature: Insert increasing numbers

Scenario: Three cursors, 0-1-2
Given I have cursors at "text" in "This text contains the word text thrice (text)"
When I press "H-0"
And I press "SPC"
Then I should see "This 0 text contains the word 1 text thrice (2 text)"

Scenario: Three cursors, 9-10-11
Given I have cursors at "text" in "This text contains the word text thrice (text)"
When I press "C-9 H-0"
And I press "SPC"
Then I should see "This 9 text contains the word 10 text thrice (11 text)"

+ 94
- 0
emacs/.emacs.d/multiple-cursors/features/mark-all-dwim-html.feature Näytä tiedosto

@@ -0,0 +1,94 @@
Feature: Mark all do-what-I-mean (html)

Background:
Given I turn on html-mode
And I turn on delete-selection-mode
And I insert:
"""
<body>
<div class="abc"> def </div>
<div class="ghi"> jkl </div>
</body>
"""

Scenario: Marks tags in html-mode, from front
When I go to the front of the word "abc"
And I press "M-b"
And I press "M-b"
And I press "M-$"
And I type "h1"
Then I should see:
"""
<body>
<h1 class="abc"> def </h1>
<div class="ghi"> jkl </div>
</body>
"""

Scenario: Marks tags in html-mode, from back
When I go to the end of the word "jkl"
And I press "M-f"
And I press "M-$"
And I type "h1"
Then I should see:
"""
<body>
<div class="abc"> def </div>
<h1 class="ghi"> jkl </h1>
</body>
"""

Scenario: Marks tags in html-mode, from outside front
When I go to the front of the word "abc"
And I press "M-b"
And I press "M-b"
And I press "C-b"
And I press "M-$"
And I type "h1"
Then I should see:
"""
<body>
<h1 class="abc"> def </h1>
<div class="ghi"> jkl </div>
</body>
"""

Scenario: Marks tags in html-mode, from outside back
When I go to the end of the word "jkl"
And I press "M-f"
And I press "C-f"
And I press "M-$"
And I type "h1"
Then I should see:
"""
<body>
<div class="abc"> def </div>
<h1 class="ghi"> jkl </h1>
</body>
"""

Scenario: Marks words in html-mode
When I go to the front of the word "abc"
And I press "M-$"
And I type "def"
Then I should see:
"""
<body>
<div class="def"> def </div>
<div class="ghi"> jkl </div>
</body>
"""

Scenario: Marks words in html-mode
When I go to the front of the word "abc"
And I press "M-$"
And I type "def"
And I press "M-$"
And I type "hah"
Then I should see:
"""
<body>
<div class="hah"> hah </div>
<div class="ghi"> jkl </div>
</body>
"""

+ 90
- 0
emacs/.emacs.d/multiple-cursors/features/mark-all-dwim.feature Näytä tiedosto

@@ -0,0 +1,90 @@
Feature: Mark all do-what-I-mean

Background:
Given I turn on emacs-lisp-mode
And I turn on delete-selection-mode
And I insert:
"""
(defun abc (ghi) (message ghi))
(defun def (ghi) (message some-other-ghi))

"""

Scenario: Mark symbols in defun
When I go to the end of the word "abc"
And I press "M-f"
And I press "M-$"
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (ghi) (message some-other-ghi))
"""
When I press "C-g"
And I go to the front of the word "hmm"
And I press "C-$"
And I type "foo"
Then I should see:
"""
(defun abc (foo) (message foo))
(defun def (ghi) (message some-other-ghi))
"""
Scenario: Mark all symbols by pressing twice
When I go to the end of the word "abc"
And I press "M-f"
And I press "M-$"
And I press "M-$"
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (hmm) (message some-other-hmm))
"""
When I press "C-g"
And I press "M->"
And I insert:
"""
(defun def (hmm-hmm) (message hmm))
"""
And I go to the front of the word "hmm"
And I press "C-$"
And I press "C-$"
And I type "humm"
Then I should see:
"""
(defun abc (humm) (message humm))
(defun def (humm) (message some-other-humm))
(defun def (humm-humm) (message humm))
"""

Scenario: Mark dwim from selection
When I press "M-<"
And I press "S-M->"
And I press "C-$ ghi RET"
And I type "xyz"
Then I should see:
"""
(defun abc (xyz) (message xyz))
(defun def (xyz) (message some-other-xyz))
"""
When I press "C-g"
And I go to the front of the word "xyz"
And I press "C-M-SPC"
And I press "C-$"
And I type "foo"
Then I should see:
"""
(defun abc (foo) (message foo))
(defun def (xyz) (message some-other-xyz))
"""
When I press "C-g"
And I press "M-<"
And I press "S-M->"
And I press "C-u C-$"
And I type ";;"
Then I should see:
"""
;;(defun abc (foo) (message foo))
;;(defun def (xyz) (message some-other-xyz))
"""

+ 144
- 0
emacs/.emacs.d/multiple-cursors/features/mark-more.feature Näytä tiedosto

@@ -0,0 +1,144 @@
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 "C->"
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 "C->"
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 "C->"
And I press "C-0 C->"
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 "C->"
And I press "C-- C->"
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 "C->"
And I press "C->"
And I press "C-- C->"
And I type "more"
Then I should see "Here's more, more and text"

Scenario: Marking prev like this, cursors
When I insert "This text has the word text in it"
And I select the last "text"
And I press "C-<"
Then I should have 2 cursors

Scenario: Marking prev like this, region
Given I turn on delete-selection-mode
When I insert "This text has the word text in it"
And I select the last "text"
And I press "C-<"
And I type "sentence"
Then I should see "This sentence has the word sentence in it"

Scenario: Skipping a prev mark
Given I turn on delete-selection-mode
When I insert "Here's text, text and text"
And I select the last "text"
And I press "C-<"
And I press "C-0 C-<"
And I type "more"
Then I should see "Here's more, text and more"

Scenario: Removing first fake
When I insert "Here's text, text and text"
And I select the last "text"
And I press "C-<"
And I press "C-- C-<"
Then I should have one cursor

Scenario: Removing first mark
Given I turn on delete-selection-mode
When I insert "Here's text, text and text"
And I select the last "text"
And I press "C-<"
And I press "C-<"
And I press "C-- C-<"
And I type "more"
Then I should see "Here's text, more and more"

Scenario: Marking all
When I insert "Here's text, text and text"
And I select "text"
And I press "M-!"
Then I should have 3 cursors

Scenario: Marking in region
Given I turn on delete-selection-mode
When I insert "Here's text, text and text"
And I select "text, text"
And I press "M-# text <return>"
And I type "more"
Then I should have 2 cursors
And I should see "Here's more, more and text"

Scenario: Marking without an active region
When I insert:
"""
aaa
bbb
ccc
"""
And I go to the front of the word "bbb"
And I press "C->"
And I type "_"
Then I should have 2 cursors
And I should see:
"""
aaa
_bbb
_ccc
"""

Scenario: Increasing number of cursors without an active region
When I insert:
"""
aaa
bbb
ccc
"""
And I go to the front of the word "bbb"
And I press "C->"
And I press "C-<"
And i press "C-f"
And I type "_"
Then I should have 3 cursors
And I should see:
"""
a_aa
b_bb
c_cc
"""

Scenario: Multiple cursor with shift selection
When I insert "This text contains the word text twice"
And I go to the front of the word "text"
And I press "M-S-f"
And I press "C->"
And I press "C-f"
And I press "<deletechar>"
Then I should see "This text ontains the word text wice"


+ 88
- 0
emacs/.emacs.d/multiple-cursors/features/mark-pop.feature Näytä tiedosto

@@ -0,0 +1,88 @@
Feature: Popping cursors off of the mark stack

Scenario: Single pop
Given I turn off transient-mark-mode
And I insert:
"""
hello
there
"""
And I go to the front of the word "hello"
And I set the mark
And I go to the front of the word "there"
And I press "M-x mc/mark-pop"
Then I should have 2 cursors

Scenario: Multiple pops
Given I turn off transient-mark-mode
And I insert:
"""
hello
there, my friend
"""
And I go to the front of the word "hello"
And I set the mark
And I go to the front of the word "my"
And I set the mark
And I go to the front of the word "friend"
And I press "M-x mc/mark-pop"
And I press "M-x mc/mark-pop"
Then I should have 3 cursors

Scenario: Discard identical mark and point
Given I turn off transient-mark-mode
And I insert:
"""
hello
there, my friend
"""
And I go to the front of the word "hello"
And I set the mark
And I go to the front of the word "my"
And I set the mark
And I go to the front of the word "friend"
And I set the mark
And I press "M-x mc/mark-pop"
And I press "M-x mc/mark-pop"
Then I should have 3 cursors

Scenario: Changing the text
Given I turn off transient-mark-mode
And I insert:
"""
hello
there, my friend
"""
And I go to the front of the word "hello"
And I set the mark
And I go to the front of the word "my"
And I set the mark
And I go to the front of the word "friend"
And I press "M-x mc/mark-pop"
And I press "M-x mc/mark-pop"
And I type "!"
Then I should see:
"""
!hello
there, !my !friend
"""

Scenario: With transient-mark-mode
And I insert:
"""
hello
there, my friend
"""
And I go to the front of the word "hello"
And I press "C-@ C-@"
And I go to the front of the word "my"
And I press "C-@ C-@"
And I go to the front of the word "friend"
And I press "M-x mc/mark-pop"
And I press "M-x mc/mark-pop"
And I type "!"
Then I should see:
"""
!hello
there, !my !friend
"""

+ 137
- 0
emacs/.emacs.d/multiple-cursors/features/mark-things.feature Näytä tiedosto

@@ -0,0 +1,137 @@
Feature: Mark things

Scenario: Mark all symbols like this with select
Given I turn on emacs-lisp-mode
And I turn on delete-selection-mode
And I insert:
"""
(defun abc (ghi) (message ghi))
(defun def (ghi) (message some-other-ghi))
"""
When I select "ghi"
And I mark all symbols like this
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (hmm) (message some-other-ghi))
"""

Scenario: Mark all words like this with select
Given I turn on emacs-lisp-mode
And I turn on delete-selection-mode
And I insert:
"""
(defun abc (ghi) (message ghi))
(defun def (ghi) (message some-other-ghi))
"""
When I select "ghi"
And I mark all words like this
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (hmm) (message some-other-hmm))
"""

Scenario: Mark all symbols like this in defun with select
Given I turn on emacs-lisp-mode
And I turn on delete-selection-mode
And I insert:
"""
(defun abc (ghi) (message ghi))
(defun def (ghi) (message some-other-ghi))
"""
When I select "ghi"
And I mark all symbols like this in defun
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (ghi) (message some-other-ghi))
"""

Scenario: Mark all words like this in defun with select
Given I turn on emacs-lisp-mode
And I turn on delete-selection-mode
And I insert:
"""
(defun abc (ghi) (message ghi))
(defun def (ghi) (message some-other-ghi))
"""
When I select "ghi"
And I mark all words like this in defun
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (ghi) (message some-other-ghi))
"""

Scenario: Mark all symbols like this with no select
Given I turn on emacs-lisp-mode
And I turn on delete-selection-mode
And I insert:
"""
(defun abc (ghi) (message ghi))
(defun def (ghi) (message some-other-ghi))
"""
When I go to word "ghi"
And I mark all symbols like this
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (hmm) (message some-other-ghi))
"""

Scenario: Mark all words like this with no select
Given I turn on emacs-lisp-mode
And I turn on delete-selection-mode
And I insert:
"""
(defun abc (ghi) (message ghi))
(defun def (ghi) (message some-other-ghi))
"""
When I go to word "ghi"
And I mark all words like this
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (hmm) (message some-other-hmm))
"""

Scenario: Mark all symbols like this in defun with no select
Given I turn on emacs-lisp-mode
And I turn on delete-selection-mode
And I insert:
"""
(defun abc (ghi) (message ghi))
(defun def (ghi) (message some-other-ghi))
"""
When I go to word "ghi"
And I mark all symbols like this in defun
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (ghi) (message some-other-ghi))
"""

Scenario: Mark all words like this in defun with no select
Given I turn on emacs-lisp-mode
And I turn on delete-selection-mode
And I insert:
"""
(defun abc (ghi) (message ghi))
(defun def (ghi) (message some-other-ghi))
"""
When I go to word "ghi"
And I mark all words like this in defun
And I type "hmm"
Then I should see:
"""
(defun abc (hmm) (message hmm))
(defun def (ghi) (message some-other-ghi))
"""

+ 188
- 0
emacs/.emacs.d/multiple-cursors/features/multiple-cursors-core.feature Näytä tiedosto

@@ -0,0 +1,188 @@
Feature: Multiple cursors core
In order to make efficient changes
As an Emacs user with multiple-cursors
I want to change multiple parts of the buffer at once

Scenario: Exiting multiple-cursors mode with return
Given I have cursors at "text" in "This text contains the word text twice"
And I press "<return>"
Then I should have one cursor

Scenario: Exiting multiple-cursors mode with C-g
Given I have cursors at "text" in "This text contains the word text twice"
And I press "C-g"
Then I should have one cursor

Scenario: Separate kill-rings
Given I have cursors at "text" in "This text contains the word text twice"
When I press "M-f"
And I press "M-d"
And I press "M-b"
And I press "C-y"
Then I should see "This containstext the word twicetext"

Scenario: Separate kill-rings, yank-pop
Given I have cursors at "text" in "This text contains the word text twice"
When I press "M-d"
And I press "C-f"
And I press "M-d"
And I press "C-y M-y"
Then I should see "This text the word text"

Scenario: Multiple lambdas
Given I have bound C-! to a lambda that inserts "a"
And I have cursors at "text" in "This text contains the word text twice"
When I press "C-!"
Then I should see "This atext contains the word atext twice"

Scenario: Multiple supported command (forward-word in this case)
Given I have cursors at "text" in "This text contains the word text twice"
And I type "("
And I press "M-f"
And I press "M-f"
And I type ")"
Then I should see "This (text contains) the word (text twice)"

Scenario: Unknown command: yes, do for all
Given I have bound C-! to a new command that inserts "a"
And I have cursors at "text" in "This text contains the word text twice"
When I press "C-! y"
And I press "C-!"
Then I should see "This aatext contains the word aatext twice"

Scenario: Unknown command: no, don't do for all
Given I have bound C-! to another new command that inserts "a"
And I have cursors at "text" in "This text contains the word text twice"
When I press "C-! n"
And I press "C-!"
Then I should see "This aatext contains the word text twice"

Scenario: Undo
Given I have cursors at "text" in "This text contains the word text twice"
When I press "M-f"
And I press "M-DEL"
And I press "C-_"
And I type "!"
Then I should see "This text! contains the word text! twice"

Scenario: Setting and popping mark
Given I have cursors at "text" in "This text contains the word text twice"
And I press "C-SPC"
And I press "M-f"
And I press "C-u C-SPC"
And I type "!"
Then I should see "This !text contains the word !text twice"

Scenario: delete-selection-mode (self-insert-command)
Given I turn on delete-selection-mode
And I have cursors at "text" in "This text contains the word text twice"
And I press "C-SPC"
And I press "M-f"
And I type "!"
Then I should see "This ! contains the word ! twice"

Scenario: delete-selection-mode (delete-char)
Given I turn on delete-selection-mode
And I have cursors at "text" in "This text contains the word text twice"
And I press "C-SPC"
And I press "M-f"
And I press "C-d"
Then I should see "This contains the word twice"

Scenario: delete-selection-mode (yank)
Given I turn on delete-selection-mode
And I have cursors at "text" in "This text contains the word text twice"
And I press "M-b"
And I press "C-SPC"
And I press "M-f"
And I press "M-w"
And I press "C-SPC"
And I press "M-f"
And I press "C-y"
Then I should see "ThisThis contains the wordword twice"

Scenario: subword-mode
Given I turn on subword-mode
And I have cursors at "textSnippet" in "This textSnippet contains the word textSnippet twice"
And I press "M-f"
And I type "_"
And I press "M-l"
Then I should see "This text_snippet contains the word text_snippet twice"

Scenario: cua-mode
Given I turn on cua-mode
And I insert "This text contains the word text twice"
And I go to the front of the word "text"
And I press "C-SPC"
And I press "M-f"
And I mark next like this
And I type "!"
Then I should see "This ! contains the word ! twice"

Scenario: wrap-region (function turns to keyboard macros)
Given I turn on wrap-region-mode
And I insert "This text contains the word text twice"
And I go to the front of the word "text"
And I press "C-M-SPC"
And I mark next like this
And I press "C-g"
And I type "("
Then I should see "This (text contains the word (text twice"

Scenario: Bound keyboard macros
Given I have bound C-! to a keyboard macro that insert "_"
And I have cursors at "text" in "This text contains the word text twice"
When I press "C-!"
When I press "C-!"
Then I should see "This __text contains the word __text twice"

Scenario: Interprogram paste
Given I have cursors at "text" in "This text contains the word text twice"
When I copy "external" in another program
And I press "C-y"
Then I should see "This externaltext contains the word externaltext twice"

Scenario: Added to killed-rectangle after exiting multiple-cursors-mode
Given I have cursors at "text" in "This text contains the word text twice"
When I press "M-f"
And I press "C-f"
And I press "C-SPC"
And I press "M-f"
And I press "M-w"
And I press "<return>"
And I press "C-a"
And I press "C-k"
And I press "C-x r y"
Then I should see:
"""
contains
twice
"""

Scenario: Looping forwards around cursors
Given I have cursors at "_" in "1_34567_9"
And I press "C-v"
And I press "C-v"
And I press "C-v"
Then the cursor should be at point "8"

Scenario: Looping forwards around cursors including one at point-max
Given I have cursors at "_" in "1_34_67_"
And I press "C-f"
And I press "C-v"
And I press "C-v"
And I press "C-v"
Then the cursor should be at point "3"

Scenario: Looping backwards around cursors
Given I have cursors at "_" in "1_34567_9"
And I press "M-v"
And I press "M-v"
Then the cursor should be at point "2"

Scenario: Looping backwards around cursors including one at point-min
Given I have cursors at "_" in "_234_67_9"
And I press "M-v"
And I press "M-v"
And I press "M-v"
Then the cursor should be at point "1"

+ 73
- 0
emacs/.emacs.d/multiple-cursors/features/rectangular-region.feature Näytä tiedosto

@@ -0,0 +1,73 @@
Feature: Rectangular region

Scenario: Works like regular region when on one line
When I insert "some text"
And I press "H-SPC"
And I press "M-b"
Then the region should be "text"
And rectangular-region-mode should be on

Scenario: Works like regular region when on one line, insert
Given I turn on delete-selection-mode
When I insert "some text"
And I press "H-SPC"
And I press "M-b"
And I type "replacement"
Then I should see "some replacement"
And rectangular-region-mode should be off

Scenario: Works like regular region when on one line, copy 1
Given I turn on delete-selection-mode
When I insert "some text"
And I press "H-SPC"
And I press "M-b"
And I press "M-w"
Then rectangular-region-mode should be off

Scenario: Works like regular region when on one line, copy 2
Given I turn on delete-selection-mode
When I insert "some text"
And I press "H-SPC"
And I press "M-b"
And I press "M-w"
And I press "C-y"
Then I should see "some texttext"

Scenario: Changing multiple lines
Given I turn on delete-selection-mode
When I insert:
"""
This is some text
This is more text
"""
And I go to point "6"
And I press "H-SPC"
And I press "M-f"
And I press "C-n"
And I type "was"
Then I should see:
"""
This was some text
This was more text
"""
And I should have 2 cursors

Scenario: Changing multiple lines with gaps
Given I turn on delete-selection-mode
When I insert:
"""
This is some text

This is more text
"""
And I go to point "6"
And I press "H-SPC"
And I go to the end of the word "more"
And I type "was"
Then I should see:
"""
This was text

This was text
"""
And I should have 2 cursors

+ 19
- 0
emacs/.emacs.d/multiple-cursors/features/sort-and-reverse.feature Näytä tiedosto

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

+ 139
- 0
emacs/.emacs.d/multiple-cursors/features/step-definitions/multiple-cursors-steps.el Näytä tiedosto

@@ -0,0 +1,139 @@
(When "^I mark next like this$"
(lambda () (call-interactively 'mc/mark-next-like-this)))

(When "^I mark previous like this$"
(lambda () (call-interactively 'mc/mark-previous-like-this)))

(When "^I mark all like this$"
(lambda () (call-interactively 'mc/mark-all-like-this)))

(When "^I mark all like this dwim$"
(lambda () (call-interactively 'mc/mark-all-like-this-dwim)))

(When "^I mark all in region$"
(lambda () (call-interactively 'mc/mark-all-in-region)))

(When "^I insert numbers$"
(lambda () (call-interactively 'mc/insert-numbers)))

(When "^I reverse regions$"
(lambda () (call-interactively 'mc/reverse-regions)))

(When "^I sort regions$"
(lambda () (call-interactively 'mc/sort-regions)))

(When "^I edit lines$"
(lambda () (call-interactively 'mc/edit-lines)))

(When "^I set rectangular region anchor$"
(lambda () (call-interactively 'set-rectangular-region-anchor)))

(And "^delete-selection-mode is active$"
(lambda ()
(delete-selection-mode 1)))

(Given "^I turn off transient-mark-mode$"
(lambda ()
(transient-mark-mode -1)))

(Then "^I should have \\([0-9]+\\) cursors$"
(lambda (num)
(let ((actual (mc/num-cursors)))
(assert (eq (string-to-number num) actual) nil
"Expected to have %s cursors, but was %d." num actual))))

(Then "^I should have one cursor$"
(lambda ()
(assert (not multiple-cursors-mode) nil
"Expected to have one cursor, but multiple-cursors-mode is still active.")
(assert (eq 1 (mc/num-cursors)) nil
"Expected to have one cursor, but there are still fake cursor overlays.")))

(Then "^rectangular-region-mode should be off$"
(lambda ()
(assert (not rectangular-region-mode) nil
"Expected rectangular-region-mode mode to be off, but wasn't.")))

(Then "^rectangular-region-mode should be on$"
(lambda ()
(assert rectangular-region-mode nil
"Expected rectangular-region-mode mode to be on, but wasn't.")))

(When "^I press \"\\(.+\\)\"$"
(lambda (keybinding)
(let ((macro (edmacro-parse-keys keybinding)))
(if espuds-chain-active
(setq espuds-action-chain (vconcat espuds-action-chain macro))
(if (and (equal keybinding "C-g")
(eq (key-binding (kbd "C-g")) 'keyboard-quit))
(espuds-quit)
(execute-kbd-macro macro))))))

(Given "^I have cursors at \"\\(.+\\)\" in \"\\(.+\\)\"$"
(lambda (needle haystack)
(insert haystack)
(goto-char (point-min))
(search-forward needle)
(set-mark (point))
(goto-char (match-beginning 0))
(mc/mark-all-like-this)
(mc/keyboard-quit)))

(When "^I copy \"\\(.+\\)\" in another program$"
(lambda (text)
(lexical-let ((text text))
(setq interprogram-paste-function
#'(lambda () (let ((r text)) (setq text nil) r))))))

(Given "^I have bound C-! to a lambda that inserts \"\\(.+\\)\"$"
(lambda (ins)
(lexical-let ((ins ins))
(global-set-key (kbd "C-!") #'(lambda () (interactive) (insert ins))))))

(Given "^I have bound C-! to a new command that inserts \"\\(.+\\)\"$"
(lambda (ins)
(lexical-let ((ins ins))
(defun mc-test-temp-command () (interactive) (insert ins))
(global-set-key (kbd "C-!") 'mc-test-temp-command))))

(Given "^I have bound C-! to another new command that inserts \"\\(.+\\)\"$"
(lambda (ins)
(lexical-let ((ins ins))
(defun mc-test-temp-command-2 () (interactive) (insert ins))
(global-set-key (kbd "C-!") 'mc-test-temp-command-2))))

(Given "^I have bound C-! to a keyboard macro that insert \"_\"$"
(lambda ()
(fset 'mc-test-temp-kmacro "\C-q_")
(global-set-key (kbd "C-!") 'mc-test-temp-kmacro)))

(When "^I go to character \"\\(.+\\)\"$"
(lambda (char)
(goto-char (point-min))
(let ((search (re-search-forward (format "%s" char) nil t))
(message "Can not go to character '%s' since it does not exist in the current buffer: %s"))
(assert search nil message char (espuds-buffer-contents)))))

(When "^I go to the \\(front\\|end\\) of the word \"\\(.+\\)\"$"
(lambda (pos word)
(goto-char (point-min))
(let ((search (re-search-forward (format "%s" word) nil t))
(message "Can not go to character '%s' since it does not exist in the current buffer: %s"))
(assert search nil message word (espuds-buffer-contents))
(if (string-equal "front" pos) (backward-word)))))

(When "^I select the last \"\\(.+\\)\"$"
(lambda (text)
(goto-char (point-max))
(let ((search (re-search-backward text nil t)))
(assert search nil "The text '%s' was not found in the current buffer." text))
(set-mark (point))
(re-search-forward text)))

(When "^I mark all \\(.+\\)$"
(lambda (rest)
(let ((func (intern (mapconcat 'identity
(cons "mc/mark-all"
(split-string rest))
"-"))))
(call-interactively func))))

+ 45
- 0
emacs/.emacs.d/multiple-cursors/features/support/env.el Näytä tiedosto

@@ -0,0 +1,45 @@
(let* ((current-directory (file-name-directory load-file-name))
(features-directory (expand-file-name ".." current-directory))
(project-directory (expand-file-name ".." features-directory)))
(setq multiple-cursors-root-path project-directory)
(setq multiple-cursors-util-path (expand-file-name "util" project-directory)))

(add-to-list 'load-path multiple-cursors-root-path)
(add-to-list 'load-path multiple-cursors-util-path)
(add-to-list 'load-path (expand-file-name "espuds" multiple-cursors-util-path))
(add-to-list 'load-path (expand-file-name "vendor" multiple-cursors-util-path))

(require 'multiple-cursors)
(require 'espuds)
(require 'ert)
(require 'wrap-region)

(defun mc/save-lists ()) ;; redefine to do nothing when running tests

(Before
(cua-mode 0)
(multiple-cursors-mode 0)
(rectangular-region-mode 0)
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "M-!") 'mc/mark-all-like-this)
(global-set-key (kbd "M-$") 'mc/mark-all-like-this-dwim)
(global-set-key (kbd "C-$") 'mc/mark-all-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
(get-buffer-create "*multiple-cursors*"))
(erase-buffer)
(transient-mark-mode 1)
(cua-mode 0)
(delete-selection-mode 0)
(subword-mode 0)
(wrap-region-mode 0)
(setq set-mark-default-inactive nil)
(deactivate-mark))

(After)

+ 122
- 0
emacs/.emacs.d/multiple-cursors/mc-cycle-cursors.el Näytä tiedosto

@@ -0,0 +1,122 @@
;;; mc-cycle-cursors.el

;; Copyright (C) 2012 Magnar Sveen

;; Author: Magnar Sveen <magnars@gmail.com>
;; 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 <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This scrolls the buffer to center each cursor in turn.
;; Scroll down with C-v, scroll up with M-v
;; This is nice when you have cursors that's outside of your view.

;;; Code:

(require 'multiple-cursors-core)

(eval-when-compile (require 'cl))

(defun mc/next-fake-cursor-after-point ()
(let ((pos (point))
(next-pos (1+ (point-max)))
next)
(mc/for-each-fake-cursor
(let ((cursor-pos (overlay-get cursor 'point)))
(when (and (< pos cursor-pos)
(< cursor-pos next-pos))
(setq next-pos cursor-pos)
(setq next cursor))))
next))

(defun mc/prev-fake-cursor-before-point ()
(let ((pos (point))
(prev-pos (1- (point-min)))
prev)
(mc/for-each-fake-cursor
(let ((cursor-pos (overlay-get cursor 'point)))
(when (and (> pos cursor-pos)
(> cursor-pos prev-pos))
(setq prev-pos cursor-pos)
(setq prev cursor))))
prev))

(defcustom mc/cycle-looping-behaviour 'continue
"What to do if asked to cycle beyond the last cursor or before the first cursor."
:type '(radio (const :tag "Loop around to beginning/end of document." continue)
(const :tag "Warn and then loop around." warn)
(const :tag "Signal an error." error)
(const :tag "Don't loop." stop))
:group 'multiple-cursors)

(defun mc/handle-loop-condition (error-message)
(ecase mc/cycle-looping-behaviour
(error (error error-message))
(warn (message error-message))
(continue 'continue)
(stop 'stop)))

(defun mc/first-fake-cursor-after (point)
"Very similar to mc/furthest-cursor-before-point, but ignores (mark) and (point)."
(let* ((cursors (mc/all-fake-cursors))
(cursors-after-point (remove-if (lambda (cursor)
(< (mc/cursor-beg cursor) point))
cursors))
(cursors-in-order (sort* cursors-after-point '< :key 'mc/cursor-beg)))
(first cursors-in-order)))

(defun mc/last-fake-cursor-before (point)
"Very similar to mc/furthest-cursor-before-point, but ignores (mark) and (point)."
(let* ((cursors (mc/all-fake-cursors))
(cursors-before-point (remove-if (lambda (cursor)
(> (mc/cursor-end cursor) point))
cursors))
(cursors-in-order (sort* cursors-before-point '> :key 'mc/cursor-end)))
(first cursors-in-order)))

(defun* mc/cycle (next-cursor fallback-cursor loop-message)
(when (null next-cursor)
(when (eql 'stop (mc/handle-loop-condition loop-message))
(return-from mc/cycle nil))
(setf next-cursor fallback-cursor))
(mc/create-fake-cursor-at-point)
(mc/pop-state-from-overlay next-cursor)
(recenter))

(defun mc/cycle-forward ()
(interactive)
(mc/cycle (mc/next-fake-cursor-after-point)
(mc/first-fake-cursor-after (point-min))
"We're already at the last cursor."))

(defun mc/cycle-backward ()
(interactive)
(mc/cycle (mc/prev-fake-cursor-before-point)
(mc/last-fake-cursor-before (point-max))
"We're already at the last cursor"))

(define-key mc/keymap (kbd "C-v") 'mc/cycle-forward)
(define-key mc/keymap (kbd "M-v") 'mc/cycle-backward)

(provide 'mc-cycle-cursors)


;; Local Variables:
;; coding: utf-8
;; byte-compile-warnings: (not cl-functions)
;; End:

;;; mc-cycle-cursors.el ends here

+ 110
- 0
emacs/.emacs.d/multiple-cursors/mc-edit-lines.el Näytä tiedosto

@@ -0,0 +1,110 @@
;;; mc-edit-lines.el

;; Copyright (C) 2012 Magnar Sveen

;; Author: Magnar Sveen <magnars@gmail.com>
;; 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 <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This file contains functions to add multiple cursors to consecutive lines
;; given an active region.

;; Please see multiple-cursors.el for more commentary.

;;; Code:

(require 'multiple-cursors-core)

(defcustom mc/edit-lines-empty-lines nil
"What should be done by `mc/edit-lines' when a line is not long enough."
:type '(radio (const :tag "Pad the line with spaces." pad)
(const :tag "Ignore the line." ignore)
(const :tag "Signal an error." error)
(const :tag "Nothing. Cursor is at end of line." nil))
:group 'multiple-cursors)

;;;###autoload
(defun mc/edit-lines (&optional arg)
"Add one cursor to each line of the active region.
Starts from mark and moves in straight down or up towards the
line point is on.

What is done with lines which are not long enough is governed by
`mc/edit-lines-empty-lines'. The prefix argument ARG can be used
to override this. If ARG is a symbol (when called from Lisp),
that symbol is used instead of `mc/edit-lines-empty-lines'.
Otherwise, if ARG negative, short lines will be ignored. Any
other non-nil value will cause short lines to be padded."
(interactive "P")
(when (not (and mark-active (/= (point) (mark))))
(error "Mark a set of lines first"))
(mc/remove-fake-cursors)
(let* ((col (current-column))
(point-line (line-number-at-pos))
(mark-line (progn (exchange-point-and-mark) (line-number-at-pos)))
(direction (if (< point-line mark-line) :up :down))
(style (cond
;; called from lisp
((and arg (symbolp arg))
arg)
;; negative argument
((< (prefix-numeric-value arg) 0)
'ignore)
(arg 'pad)
(t mc/edit-lines-empty-lines))))
(deactivate-mark)
(when (and (eq direction :up) (bolp))
(previous-logical-line 1 nil)
(move-to-column col))
;; Add the cursors
(while (not (eq (line-number-at-pos) point-line))
;; Pad the line
(when (eq style 'pad)
(while (< (current-column) col)
(insert " ")))
;; Error
(when (and (eq style 'error)
(not (equal col (current-column))))
(error "Short line encountered in `mc/edit-lines'"))
;; create the cursor
(unless (and (eq style 'ignore)
(not (equal col (current-column))))
(mc/create-fake-cursor-at-point))
;; proceed to next
(if (eq direction :up)
(previous-logical-line 1 nil)
(next-logical-line 1 nil))
(move-to-column col))
(multiple-cursors-mode)))

;;;###autoload
(defun mc/edit-ends-of-lines ()
"Add one cursor to the end of each line in the active region."
(interactive)
(mc/edit-lines)
(mc/execute-command-for-all-cursors 'end-of-line))

;;;###autoload
(defun mc/edit-beginnings-of-lines ()
"Add one cursor to the beginning of each line in the active region."
(interactive)
(mc/edit-lines)
(mc/execute-command-for-all-cursors 'beginning-of-line))

(provide 'mc-edit-lines)

;;; mc-edit-lines.el ends here

+ 561
- 0
emacs/.emacs.d/multiple-cursors/mc-mark-more.el Näytä tiedosto

@@ -0,0 +1,561 @@
;;; mc-mark-more.el

;; Copyright (C) 2012 Magnar Sveen

;; Author: Magnar Sveen <magnars@gmail.com>
;; 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 <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This file contains functions to mark more parts of the buffer.
;; See ./features/mark-more.feature for examples.

;; Please see multiple-cursors.el for more commentary.

;;; Code:

(require 'multiple-cursors-core)
(require 'thingatpt)

(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/first-region-start ()
(let ((beg (min (mark) (point))))
(mc/for-each-fake-cursor
(setq beg (min beg (mc/cursor-beg cursor))))
beg))

(defun mc/furthest-cursor-before-point ()
(let ((beg (min (mark) (point)))
furthest)
(mc/for-each-fake-cursor
(when (< (mc/cursor-beg cursor) beg)
(setq beg (mc/cursor-beg cursor))
(setq furthest cursor)))
furthest))

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

(defvar mc/enclose-search-term nil
"How should mc/mark-more-* search for more matches?

Match everything: nil
Match only whole words: 'words
Match only whole symbols: 'symbols

Use like case-fold-search, don't recommend setting it globally.")

(defun mc/mark-more-like-this (skip-last direction)
(let ((case-fold-search nil)
(re (regexp-opt (mc/region-strings) mc/enclose-search-term))
(point-out-of-order (ecase direction
(forwards (< (point) (mark)))
(backwards (not (< (point) (mark))))))
(furthest-cursor (ecase direction
(forwards (mc/furthest-cursor-after-point))
(backwards (mc/furthest-cursor-before-point))))
(start-char (ecase direction
(forwards (mc/furthest-region-end))
(backwards (mc/first-region-start))))
(search-function (ecase direction
(forwards 'search-forward-regexp)
(backwards 'search-backward-regexp)))
(match-point-getter (ecase direction
(forwards 'match-beginning)
(backwards 'match-end))))
(if (and skip-last (not furthest-cursor))
(error "No cursors to be skipped")
(mc/save-excursion
(goto-char start-char)
(when skip-last
(mc/remove-fake-cursor furthest-cursor))
(if (funcall search-function re nil t)
(progn
(push-mark (funcall match-point-getter 0))
(when point-out-of-order
(exchange-point-and-mark))
(mc/create-fake-cursor-at-point))
(error "no more matches found."))))))

;;;###autoload
(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")
(if (region-active-p)
(if (< arg 0)
(let ((cursor (mc/furthest-cursor-after-point)))
(if cursor
(mc/remove-fake-cursor cursor)
(error "No cursors to be unmarked")))
(mc/mark-more-like-this (= arg 0) 'forwards))
(mc/mark-lines arg 'forwards))
(mc/maybe-multiple-cursors-mode))

;;;###autoload
(defun mc/mark-next-word-like-this (arg)
(interactive "p")
(let ((mc/enclose-search-term 'words))
(mc/mark-next-like-this arg)))

;;;###autoload
(defun mc/mark-next-symbol-like-this (arg)
(interactive "p")
(let ((mc/enclose-search-term 'symbols))
(mc/mark-next-like-this arg)))

;;;###autoload
(defun mc/mark-previous-like-this (arg)
"Find and mark the previous 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")
(if (region-active-p)
(if (< arg 0)
(let ((cursor (mc/furthest-cursor-before-point)))
(if cursor
(mc/remove-fake-cursor cursor)
(error "No cursors to be unmarked")))
(mc/mark-more-like-this (= arg 0) 'backwards))
(mc/mark-lines arg 'backwards))
(mc/maybe-multiple-cursors-mode))

;;;###autoload
(defun mc/mark-previous-word-like-this (arg)
(interactive "p")
(let ((mc/enclose-search-term 'words))
(mc/mark-previous-like-this arg)))

;;;###autoload
(defun mc/mark-previous-symbol-like-this (arg)
(interactive "p")
(let ((mc/enclose-search-term 'symbols))
(mc/mark-previous-like-this arg)))

(defun mc/mark-lines (num-lines direction)
(dotimes (i num-lines)
(mc/create-fake-cursor-at-point)
(ecase direction
(forwards (loop do (next-logical-line 1 nil)
while (mc/all-fake-cursors (point) (1+ (point)))))
(backwards (loop do (previous-logical-line 1 nil)
while (mc/all-fake-cursors (point) (1+ (point))))))))

;;;###autoload
(defun mc/mark-next-lines (arg)
(interactive "p")
(mc/mark-lines arg 'forwards)
(mc/maybe-multiple-cursors-mode))

;;;###autoload
(defun mc/mark-previous-lines (arg)
(interactive "p")
(mc/mark-lines arg 'backwards)
(mc/maybe-multiple-cursors-mode))

;;;###autoload
(defun mc/unmark-next-like-this ()
"Deselect next part of the buffer matching the currently active region."
(interactive)
(mc/mark-next-like-this -1))

;;;###autoload
(defun mc/unmark-previous-like-this ()
"Deselect prev part of the buffer matching the currently active region."
(interactive)
(mc/mark-previous-like-this -1))

;;;###autoload
(defun mc/skip-to-next-like-this ()
"Skip the current one and select the next part of the buffer matching the currently active region."
(interactive)
(mc/mark-next-like-this 0))

;;;###autoload
(defun mc/skip-to-previous-like-this ()
"Skip the current one and select the prev part of the buffer matching the currently active region."
(interactive)
(mc/mark-previous-like-this 0))

;;;###autoload
(defun mc/mark-all-like-this ()
"Find and mark all the parts of the buffer matching the currently active region"
(interactive)
(unless (region-active-p)
(error "Mark a region to match first."))
(mc/remove-fake-cursors)
(let ((master (point))
(case-fold-search nil)
(point-first (< (point) (mark)))
(re (regexp-opt (mc/region-strings) mc/enclose-search-term)))
(mc/save-excursion
(goto-char 0)
(while (search-forward-regexp re nil t)
(push-mark (match-beginning 0))
(when point-first (exchange-point-and-mark))
(unless (= master (point))
(mc/create-fake-cursor-at-point))
(when point-first (exchange-point-and-mark)))))
(if (> (mc/num-cursors) 1)
(multiple-cursors-mode 1)
(multiple-cursors-mode 0)))

(defun mc--select-thing-at-point (thing)
(let ((bound (bounds-of-thing-at-point thing)))
(when bound
(set-mark (car bound))
(goto-char (cdr bound))
bound)))

(defun mc--select-thing-at-point-or-bark (thing)
(unless (or (region-active-p) (mc--select-thing-at-point thing))
(error "Mark a region or set cursor on a %s." thing)))

;;;###autoload
(defun mc/mark-all-words-like-this ()
(interactive)
(mc--select-thing-at-point-or-bark 'word)
(let ((mc/enclose-search-term 'words))
(mc/mark-all-like-this)))

;;;###autoload
(defun mc/mark-all-symbols-like-this ()
(interactive)
(mc--select-thing-at-point-or-bark 'symbol)
(let ((mc/enclose-search-term 'symbols))
(mc/mark-all-like-this)))

;;;###autoload
(defun mc/mark-all-in-region (beg end)
"Find and mark all the parts in the region matching the given search"
(interactive "r")
(let ((search (read-from-minibuffer "Mark all in region: "))
(case-fold-search nil))
(if (string= search "")
(message "Mark aborted")
(progn
(mc/remove-fake-cursors)
(goto-char beg)
(while (search-forward search end t)
(push-mark (match-beginning 0))
(mc/create-fake-cursor-at-point))
(let ((first (mc/furthest-cursor-before-point)))
(if (not first)
(error "Search failed for %S" search)
(mc/pop-state-from-overlay first)))
(if (> (mc/num-cursors) 1)
(multiple-cursors-mode 1)
(multiple-cursors-mode 0))))))

(when (not (fboundp 'set-temporary-overlay-map))
;; Backport this function from newer emacs versions
(defun set-temporary-overlay-map (map &optional keep-pred)
"Set a new keymap that will only exist for a short period of time.
The new keymap to use must be given in the MAP variable. When to
remove the keymap depends on user input and KEEP-PRED:

- if KEEP-PRED is nil (the default), the keymap disappears as
soon as any key is pressed, whether or not the key is in MAP;

- if KEEP-PRED is t, the keymap disappears as soon as a key *not*
in MAP is pressed;

- otherwise, KEEP-PRED must be a 0-arguments predicate that will
decide if the keymap should be removed (if predicate returns
nil) or kept (otherwise). The predicate will be called after
each key sequence."

(let* ((clearfunsym (make-symbol "clear-temporary-overlay-map"))
(overlaysym (make-symbol "t"))
(alist (list (cons overlaysym map)))
(clearfun
`(lambda ()
(unless ,(cond ((null keep-pred) nil)
((eq t keep-pred)
`(eq this-command
(lookup-key ',map
(this-command-keys-vector))))
(t `(funcall ',keep-pred)))
(remove-hook 'pre-command-hook ',clearfunsym)
(setq emulation-mode-map-alists
(delq ',alist emulation-mode-map-alists))))))
(set overlaysym overlaysym)
(fset clearfunsym clearfun)
(add-hook 'pre-command-hook clearfunsym)

(push alist emulation-mode-map-alists))))

;;;###autoload
(defun mc/mark-more-like-this-extended ()
"Like mark-more-like-this, but then lets you adjust with arrows key.
The adjustments work like this:

<up> Mark previous like this and set direction to 'up
<down> Mark next like this and set direction to 'down

If direction is 'up:

<left> Skip past the cursor furthest up
<right> Remove the cursor furthest up

If direction is 'down:

<left> Remove the cursor furthest down
<right> Skip past the cursor furthest down

The bindings for these commands can be changed. See `mc/mark-more-like-this-extended-keymap'."
(interactive)
(mc/mmlte--down)
(set-temporary-overlay-map mc/mark-more-like-this-extended-keymap t))

(defvar mc/mark-more-like-this-extended-direction nil
"When using mc/mark-more-like-this-extended are we working on the next or previous cursors?")

(make-variable-buffer-local 'mc/mark-more-like-this-extended)

(defun mc/mmlte--message ()
(if (eq mc/mark-more-like-this-extended-direction 'up)
(message "<up> to mark previous, <left> to skip, <right> to remove, <down> to mark next")
(message "<down> to mark next, <right> to skip, <left> to remove, <up> to mark previous")))

(defun mc/mmlte--up ()
(interactive)
(mc/mark-previous-like-this 1)
(setq mc/mark-more-like-this-extended-direction 'up)
(mc/mmlte--message))

(defun mc/mmlte--down ()
(interactive)
(mc/mark-next-like-this 1)
(setq mc/mark-more-like-this-extended-direction 'down)
(mc/mmlte--message))

(defun mc/mmlte--left ()
(interactive)
(if (eq mc/mark-more-like-this-extended-direction 'down)
(mc/unmark-next-like-this)
(mc/skip-to-previous-like-this))
(mc/mmlte--message))

(defun mc/mmlte--right ()
(interactive)
(if (eq mc/mark-more-like-this-extended-direction 'up)
(mc/unmark-previous-like-this)
(mc/skip-to-next-like-this))
(mc/mmlte--message))

(defvar mc/mark-more-like-this-extended-keymap (make-sparse-keymap))

(define-key mc/mark-more-like-this-extended-keymap (kbd "<up>") 'mc/mmlte--up)
(define-key mc/mark-more-like-this-extended-keymap (kbd "<down>") 'mc/mmlte--down)
(define-key mc/mark-more-like-this-extended-keymap (kbd "<left>") 'mc/mmlte--left)
(define-key mc/mark-more-like-this-extended-keymap (kbd "<right>") 'mc/mmlte--right)

(defvar mc--restrict-mark-all-to-symbols nil)

;;;###autoload
(defun mc/mark-all-like-this-dwim (arg)
"Tries to guess what you want to mark all of.
Can be pressed multiple times to increase selection.

With prefix, it behaves the same as original `mc/mark-all-like-this'"
(interactive "P")
(if arg
(mc/mark-all-like-this)
(if (and (not (use-region-p))
(derived-mode-p 'sgml-mode)
(mc--on-tag-name-p))
(mc/mark-sgml-tag-pair)
(let ((before (mc/num-cursors)))
(unless (eq last-command 'mc/mark-all-like-this-dwim)
(setq mc--restrict-mark-all-to-symbols nil))
(unless (use-region-p)
(mc--mark-symbol-at-point)
(setq mc--restrict-mark-all-to-symbols t))
(if mc--restrict-mark-all-to-symbols
(mc/mark-all-symbols-like-this-in-defun)
(mc/mark-all-like-this-in-defun))
(when (<= (mc/num-cursors) before)
(if mc--restrict-mark-all-to-symbols
(mc/mark-all-symbols-like-this)
(mc/mark-all-like-this)))
(when (<= (mc/num-cursors) before)
(mc/mark-all-like-this))))))

;;;###autoload
(defun mc/mark-all-dwim (arg)
"Tries even harder to guess what you want to mark all of.

If the region is active and spans multiple lines, it will behave
as if `mc/mark-all-in-region'. With the prefix ARG, it will call
`mc/edit-lines' instead.

If the region is inactive or on a single line, it will behave like
`mc/mark-all-like-this-dwim'."
(interactive "P")
(if (and (use-region-p)
(not (> (mc/num-cursors) 1))
(not (= (line-number-at-pos (region-beginning))
(line-number-at-pos (region-end)))))
(if arg
(call-interactively 'mc/edit-lines)
(call-interactively 'mc/mark-all-in-region))
(progn
(setq this-command 'mc/mark-all-like-this-dwim)
(mc/mark-all-like-this-dwim arg))))

(defun mc--in-defun ()
(bounds-of-thing-at-point 'defun))

;;;###autoload
(defun mc/mark-all-like-this-in-defun ()
"Mark all like this in defun."
(interactive)
(if (mc--in-defun)
(save-restriction
(widen)
(narrow-to-defun)
(mc/mark-all-like-this))
(mc/mark-all-like-this)))

;;;###autoload
(defun mc/mark-all-words-like-this-in-defun ()
"Mark all words like this in defun."
(interactive)
(mc--select-thing-at-point-or-bark 'word)
(if (mc--in-defun)
(save-restriction
(widen)
(narrow-to-defun)
(mc/mark-all-words-like-this))
(mc/mark-all-words-like-this)))

;;;###autoload
(defun mc/mark-all-symbols-like-this-in-defun ()
"Mark all symbols like this in defun."
(interactive)
(mc--select-thing-at-point-or-bark 'symbol)
(if (mc--in-defun)
(save-restriction
(widen)
(narrow-to-defun)
(mc/mark-all-symbols-like-this))
(mc/mark-all-symbols-like-this)))

(defun mc--mark-symbol-at-point ()
"Select the symbol under cursor"
(interactive)
(when (not (use-region-p))
(let ((b (bounds-of-thing-at-point 'symbol)))
(goto-char (car b))
(set-mark (cdr b)))))

(defun mc--get-nice-sgml-context ()
(car
(last
(progn
(when (looking-at "<") (forward-char 1))
(when (looking-back ">") (forward-char -1))
(sgml-get-context)))))

(defun mc--on-tag-name-p ()
(let* ((context (save-excursion (mc--get-nice-sgml-context)))
(tag-name-len (length (aref context 4)))
(beg (aref context 2))
(end (+ beg tag-name-len (if (eq 'open (aref context 1)) 1 3))))
(and context
(>= (point) beg)
(<= (point) end))))

;;;###autoload
(defun mc/add-cursor-on-click (event)
"Add a cursor where you click."
(interactive "e")
(mouse-minibuffer-check event)
;; Use event-end in case called from mouse-drag-region.
;; If EVENT is a click, event-end and event-start give same value.
(let ((position (event-end event)))
(if (not (windowp (posn-window position)))
(error "Position not in text area of window"))
(select-window (posn-window position))
(if (numberp (posn-point position))
(save-excursion
(goto-char (posn-point position))
(mc/create-fake-cursor-at-point)))
(mc/maybe-multiple-cursors-mode)))

;;;###autoload
(defun mc/mark-sgml-tag-pair ()
"Mark the tag we're in and its pair for renaming."
(interactive)
(when (not (mc--inside-tag-p))
(error "Place point inside tag to rename."))
(let ((context (mc--get-nice-sgml-context)))
(if (looking-at "</")
(setq context (car (last (sgml-get-context)))))
(goto-char (aref context 2))
(let* ((tag-name (aref context 4))
(num-chars (length tag-name))
(master-start (1+ (point)))
(mirror-end (save-excursion
(sgml-skip-tag-forward 1)
(1- (point)))))
(goto-char (- mirror-end num-chars))
(set-mark mirror-end)
(mc/create-fake-cursor-at-point)
(goto-char master-start)
(set-mark (+ (point) num-chars))))
(mc/maybe-multiple-cursors-mode))

(defun mc--inside-tag-p ()
(save-excursion
(not (null (sgml-get-context)))))

(provide 'mc-mark-more)

;;; mc-mark-more.el ends here

+ 22
- 0
emacs/.emacs.d/multiple-cursors/mc-mark-pop.el Näytä tiedosto

@@ -0,0 +1,22 @@
;;; mc-mark-pop.el --- Pop cursors off of the mark stack

(require 'multiple-cursors-core)

;;;###autoload
(defun mc/mark-pop ()
"Add a cursor at the current point, pop off mark ring and jump
to the popped mark."
(interactive)
;; If the mark happens to be at the current point, just pop that one off.
(while (eql (mark) (point))
(pop-mark))
(mc/create-fake-cursor-at-point)
(exchange-point-and-mark)
(pop-mark)
(mc/maybe-multiple-cursors-mode))

;; A good key binding for this feature is perhaps "C-S-p" ('p' for pop).

(provide 'mc-mark-pop)

;;; mc-mark-pop.el ends here

+ 90
- 0
emacs/.emacs.d/multiple-cursors/mc-separate-operations.el Näytä tiedosto

@@ -0,0 +1,90 @@
;;; mc-separate-operations.el - functions that work differently on each cursor

;; Copyright (C) 2012 Magnar Sveen

;; Author: Magnar Sveen <magnars@gmail.com>
;; 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 <http://www.gnu.org/licenses/>.

;;; 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
(setq strings (cons (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))
(save-excursion (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 multiple-cursors-mode)
(progn
(mc/mark-next-lines 1)
(mc/reverse-regions)
(multiple-cursors-mode 0))
(unless (use-region-p)
(mc/execute-command-for-all-cursors 'mark-sexp))
(setq mc--strings-to-replace (nreverse (mc--ordered-region-strings)))
(mc--replace-region-strings)))

;;;###autoload
(defun mc/sort-regions ()
(interactive)
(unless (use-region-p)
(mc/execute-command-for-all-cursors 'mark-sexp))
(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

+ 729
- 0
emacs/.emacs.d/multiple-cursors/multiple-cursors-core.el Näytä tiedosto

@@ -0,0 +1,729 @@
;;; multiple-cursors-core.el --- An experiment in multiple cursors for emacs.

;; Copyright (C) 2012 Magnar Sveen

;; Author: Magnar Sveen <magnars@gmail.com>
;; 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 <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This file contains the core functionality of multiple-cursors.
;; Please see multiple-cursors.el for more commentary.

;;; Code:

(require 'cl)

(require 'rect)

(defvar mc--read-char)

(defface mc/cursor-face
'((t (:inverse-video t)))
"The face used for fake cursors"
:group 'multiple-cursors)

(defface mc/region-face
'((t :inherit region))
"The face used for fake regions"
:group 'multiple-cursors)

(defmacro mc/add-fake-cursor-to-undo-list (&rest forms)
"Make sure point is in the right place when undoing"
(let ((uc (make-symbol "undo-cleaner")))
`(let ((,uc (cons 'apply (cons 'deactivate-cursor-after-undo (list id)))))
(setq buffer-undo-list (cons ,uc buffer-undo-list))
,@forms
(if (eq ,uc (car buffer-undo-list)) ;; if nothing has been added to the undo-list
(setq buffer-undo-list (cdr buffer-undo-list)) ;; then pop the cleaner right off again
(setq buffer-undo-list ;; otherwise add a function to activate this cursor
(cons (cons 'apply (cons 'activate-cursor-for-undo (list id))) buffer-undo-list))))))

(defun mc/all-fake-cursors (&optional start end)
(remove-if-not 'mc/fake-cursor-p
(overlays-in (or start (point-min))
(or end (point-max)))))

(defmacro mc/for-each-fake-cursor (&rest forms)
"Runs the body for each fake cursor, bound to the name cursor"
`(mapc #'(lambda (cursor) ,@forms)
(mc/all-fake-cursors)))

(defmacro mc/save-excursion (&rest forms)
"Saves and restores all the state that multiple-cursors cares about."
(let ((cs (make-symbol "current-state")))
`(let ((,cs (mc/store-current-state-in-overlay
(make-overlay (point) (point) nil nil t))))
(overlay-put ,cs 'type 'original-cursor)
(save-excursion ,@forms)
(mc/pop-state-from-overlay ,cs))))

(defun mc--compare-by-overlay-start (o1 o2)
(< (overlay-start o1) (overlay-start o2)))

(defmacro mc/for-each-cursor-ordered (&rest forms)
"Runs the body for each cursor, fake and real, bound to the name cursor"
(let ((rci (make-symbol "real-cursor-id")))
`(let ((,rci (overlay-get (mc/create-fake-cursor-at-point) 'mc-id)))
(mapc #'(lambda (cursor)
(when (mc/fake-cursor-p cursor)
,@forms))
(sort (overlays-in (point-min) (point-max)) 'mc--compare-by-overlay-start))
(mc/pop-state-from-overlay (mc/cursor-with-id ,rci)))))

(defmacro mc/save-window-scroll (&rest forms)
"Saves and restores the window scroll position"
(let ((p (make-symbol "p"))
(s (make-symbol "start"))
(h (make-symbol "hscroll")))
`(let ((,p (set-marker (make-marker) (point)))
(,s (set-marker (make-marker) (window-start)))
(,h (window-hscroll)))
,@forms
(goto-char ,p)
(set-window-start nil ,s t)
(set-window-hscroll nil ,h)
(set-marker ,p nil)
(set-marker ,s nil))))

(defun mc/make-cursor-overlay-at-eol (pos)
"Create overlay to look like cursor at end of line."
(let ((overlay (make-overlay pos pos nil nil nil)))
(overlay-put overlay 'after-string (propertize " " 'face 'mc/cursor-face))
overlay))

(defun mc/make-cursor-overlay-inline (pos)
"Create overlay to look like cursor inside text."
(let ((overlay (make-overlay pos (1+ pos) nil nil nil)))
(overlay-put overlay 'face 'mc/cursor-face)
overlay))

(defun mc/make-cursor-overlay-at-point ()
"Create overlay to look like cursor.
Special case for end of line, because overlay over a newline
highlights the entire width of the window."
(if (eolp)
(mc/make-cursor-overlay-at-eol (point))
(mc/make-cursor-overlay-inline (point))))

(defun mc/make-region-overlay-between-point-and-mark ()
"Create overlay to look like active region."
(let ((overlay (make-overlay (mark) (point) nil nil t)))
(overlay-put overlay 'face 'mc/region-face)
(overlay-put overlay 'type 'additional-region)
overlay))

(defvar mc/cursor-specific-vars '(transient-mark-mode
kill-ring
kill-ring-yank-pointer
mark-ring
mark-active
yank-undo-function
autopair-action
autopair-wrap-action
er/history)
"A list of vars that need to be tracked on a per-cursor basis.")

(defun mc/store-current-state-in-overlay (o)
"Store relevant info about point and mark in the given overlay."
(overlay-put o 'point (set-marker (make-marker) (point)))
(overlay-put o 'mark (set-marker (make-marker) (mark)))
(dolist (var mc/cursor-specific-vars)
(when (boundp var) (overlay-put o var (symbol-value var))))
o)

(defun mc/restore-state-from-overlay (o)
"Restore point and mark from stored info in the given overlay."
(goto-char (overlay-get o 'point))
(set-marker (mark-marker) (overlay-get o 'mark))
(dolist (var mc/cursor-specific-vars)
(when (boundp var) (set var (overlay-get o var)))))

(defun mc/remove-fake-cursor (o)
"Delete overlay with state, including dependent overlays and markers."
(set-marker (overlay-get o 'point) nil)
(set-marker (overlay-get o 'mark) nil)
(mc/delete-region-overlay o)
(delete-overlay o))

(defun mc/pop-state-from-overlay (o)
"Restore the state stored in given overlay and then remove the overlay."
(mc/restore-state-from-overlay o)
(mc/remove-fake-cursor o))

(defun mc/delete-region-overlay (o)
"Remove the dependent region overlay for a given cursor overlay."
(ignore-errors
(delete-overlay (overlay-get o 'region-overlay))))

(defvar mc--current-cursor-id 0
"Var to store increasing id of fake cursors, used to keep track of them for undo.")

(defun mc/create-cursor-id ()
"Returns a unique cursor id"
(incf mc--current-cursor-id))

(defun mc/create-fake-cursor-at-point (&optional id)
"Add a fake cursor and possibly a fake active region overlay based on point and mark.
Saves the current state in the overlay to be restored later."
(let ((overlay (mc/make-cursor-overlay-at-point)))
(overlay-put overlay 'mc-id (or id (mc/create-cursor-id)))
(overlay-put overlay 'type 'fake-cursor)
(overlay-put overlay 'priority 100)
(mc/store-current-state-in-overlay overlay)
(when (use-region-p)
(overlay-put overlay 'region-overlay
(mc/make-region-overlay-between-point-and-mark)))
overlay))

(defun mc/execute-command (cmd)
"Run command, simulating the parts of the command loop that makes sense for fake cursors."
(setq this-command cmd)
(run-hooks 'pre-command-hook)
(unless (eq this-command 'ignore)
(call-interactively cmd))
(run-hooks 'post-command-hook)
(when deactivate-mark (deactivate-mark)))

(defvar mc--executing-command-for-fake-cursor nil)

(defun mc/execute-command-for-fake-cursor (cmd cursor)
(let ((mc--executing-command-for-fake-cursor t)
(id (overlay-get cursor 'mc-id))
(annoying-arrows-mode nil)
(smooth-scroll-margin 0))
(mc/add-fake-cursor-to-undo-list
(mc/pop-state-from-overlay cursor)
(ignore-errors
(mc/execute-command cmd)
(mc/create-fake-cursor-at-point id)))))

(defun mc/execute-command-for-all-fake-cursors (cmd)
"Calls CMD interactively for each cursor.
It works by moving point to the fake cursor, setting
up the proper environment, and then removing the cursor.
After executing the command, it sets up a new fake
cursor with updated info."
(mc/save-excursion
(mc/save-window-scroll
(mc/for-each-fake-cursor
(save-excursion
(mc/execute-command-for-fake-cursor cmd cursor)))))
(mc--reset-read-prompts))

(defun mc/execute-command-for-all-cursors (cmd)
"Calls CMD interactively for the real cursor and all fakes."
(call-interactively cmd)
(mc/execute-command-for-all-fake-cursors cmd))

;; Intercept some reading commands so you won't have to
;; answer them for every single cursor

(defvar mc--read-char nil)
(defvar multiple-cursors-mode nil)
(defadvice read-char (around mc-support activate)
(if (not multiple-cursors-mode)
ad-do-it
(unless mc--read-char
(setq mc--read-char ad-do-it))
(setq ad-return-value mc--read-char)))

(defvar mc--read-quoted-char nil)
(defadvice read-quoted-char (around mc-support activate)
(if (not multiple-cursors-mode)
ad-do-it
(unless mc--read-quoted-char
(setq mc--read-quoted-char ad-do-it))
(setq ad-return-value mc--read-quoted-char)))

(defun mc--reset-read-prompts ()
(setq mc--read-char nil)
(setq mc--read-quoted-char nil))

(mc--reset-read-prompts)

(defun mc/fake-cursor-p (o)
"Predicate to check if an overlay is a fake cursor"
(eq (overlay-get o 'type) 'fake-cursor))

(defun mc/cursor-with-id (id)
"Find the first cursor with the given id, or nil"
(find-if #'(lambda (o) (and (mc/fake-cursor-p o)
(= id (overlay-get o 'mc-id))))
(overlays-in (point-min) (point-max))))

(defvar mc--stored-state-for-undo nil
"Variable to keep the state of the real cursor while undoing a fake one")

(defun activate-cursor-for-undo (id)
"Called when undoing to temporarily activate the fake cursor which action is being undone."
(let ((cursor (mc/cursor-with-id id)))
(when cursor
(setq mc--stored-state-for-undo (mc/store-current-state-in-overlay
(make-overlay (point) (point) nil nil t)))
(mc/pop-state-from-overlay cursor))))

(defun deactivate-cursor-after-undo (id)
"Called when undoing to reinstate the real cursor after undoing a fake one."
(when mc--stored-state-for-undo
(mc/create-fake-cursor-at-point id)
(mc/pop-state-from-overlay mc--stored-state-for-undo)
(setq mc--stored-state-for-undo nil)))

(defun mc/prompt-for-inclusion-in-whitelist (original-command)
"Asks the user, then adds the command either to the once-list or the all-list."
(let ((all-p (y-or-n-p (format "Do %S for all cursors?" original-command))))
(if all-p
(add-to-list 'mc/cmds-to-run-for-all original-command)
(add-to-list 'mc/cmds-to-run-once original-command))
(mc/save-lists)
all-p))

(defun mc/num-cursors ()
"The number of cursors (real and fake) in the buffer."
(1+ (count-if 'mc/fake-cursor-p
(overlays-in (point-min) (point-max)))))

(defvar mc--this-command nil
"Used to store the original command being run.")
(make-variable-buffer-local 'mc--this-command)

(defun mc/make-a-note-of-the-command-being-run ()
"Used with pre-command-hook to store the original command being run.
Since that cannot be reliably determined in the post-command-hook.

Specifically, this-original-command isn't always right, because it could have
been remapped. And certain modes (cua comes to mind) will change their
remapping based on state. So a command that changes the state will afterwards
not be recognized through the command-remapping lookup."
(unless mc--executing-command-for-fake-cursor
(let ((cmd (or (command-remapping this-original-command)
this-original-command)))
(setq mc--this-command (and (not (eq cmd 'god-mode-self-insert))
cmd)))))

(defun mc/execute-this-command-for-all-cursors ()
"Wrap around `mc/execute-this-command-for-all-cursors-1' to protect hook."
(condition-case error
(mc/execute-this-command-for-all-cursors-1)
(error
(message "[mc] problem in `mc/execute-this-command-for-all-cursors': %s"
(error-message-string error)))))

;; execute-kbd-macro should never be run for fake cursors. The real cursor will
;; execute the keyboard macro, resulting in new commands in the command loop,
;; and the fake cursors can pick up on those instead.
(defadvice execute-kbd-macro (around skip-fake-cursors activate)
(unless mc--executing-command-for-fake-cursor
ad-do-it))

(defun mc/execute-this-command-for-all-cursors-1 ()
"Used with post-command-hook to execute supported commands for all cursors.

It uses two lists of commands to know what to do: the run-once
list and the run-for-all list. If a command is in neither of these lists,
it will prompt for the proper action and then save that preference.

Some commands are so unsupported that they are even prevented for
the original cursor, to inform about the lack of support."
(unless mc--executing-command-for-fake-cursor

(if (eq 1 (mc/num-cursors)) ;; no fake cursors? disable mc-mode
(multiple-cursors-mode 0)
(when this-original-command
(let ((original-command (or mc--this-command
(command-remapping this-original-command)
this-original-command)))

;; skip keyboard macros, since they will generate actual commands that are
;; also run in the command loop - we'll handle those later instead.
(when (functionp original-command)

;; if it's a lambda, we can't know if it's supported or not
;; - so go ahead and assume it's ok, because we're just optimistic like that
(if (or (not (symbolp original-command))
;; lambda registered by smartrep
(string-prefix-p "(" (symbol-name original-command)))
(mc/execute-command-for-all-fake-cursors original-command)

;; smartrep `intern's commands into own obarray to help
;; `describe-bindings'. So, let's re-`intern' here to
;; make the command comparable by `eq'.
(setq original-command (intern (symbol-name original-command)))

;; otherwise it's a symbol, and we can be more thorough
(if (get original-command 'mc--unsupported)
(message "%S is not supported with multiple cursors%s"
original-command
(get original-command 'mc--unsupported))
(when (and original-command
(not (memq original-command mc--default-cmds-to-run-once))
(not (memq original-command mc/cmds-to-run-once))
(or (memq original-command mc--default-cmds-to-run-for-all)
(memq original-command mc/cmds-to-run-for-all)
(mc/prompt-for-inclusion-in-whitelist original-command)))
(mc/execute-command-for-all-fake-cursors original-command))))))))))

(defun mc/remove-fake-cursors ()
"Remove all fake cursors.
Do not use to conclude editing with multiple cursors. For that
you should disable multiple-cursors-mode."
(mc/for-each-fake-cursor
(mc/remove-fake-cursor cursor)))

(defun mc/keyboard-quit ()
"Deactivate mark if there are any active, otherwise exit multiple-cursors-mode."
(interactive)
(if (not (use-region-p))
(multiple-cursors-mode 0)
(deactivate-mark)))

(defvar mc/keymap nil
"Keymap while multiple cursors are active.
Main goal of the keymap is to rebind C-g and <return> to conclude
multiple cursors editing.")
(unless mc/keymap
(setq mc/keymap (make-sparse-keymap))
(define-key mc/keymap (kbd "C-g") 'mc/keyboard-quit)
(define-key mc/keymap (kbd "<return>") 'multiple-cursors-mode)
(when (fboundp 'phi-search)
(define-key mc/keymap (kbd "C-s") 'phi-search))
(when (fboundp 'phi-search-backward)
(define-key mc/keymap (kbd "C-r") 'phi-search-backward)))

(defun mc--all-equal (list)
"Are all the items in LIST equal?"
(let ((first (car list))
(all-equal t))
(while (and all-equal list)
(setq all-equal (equal first (car list)))
(setq list (cdr list)))
all-equal))

(defun mc--kill-ring-entries ()
"Return the latest kill-ring entry for each cursor.
The entries are returned in the order they are found in the buffer."
(let (entries)
(mc/for-each-cursor-ordered
(setq entries (cons (car (overlay-get cursor 'kill-ring)) entries)))
(reverse entries)))

(defun mc--maybe-set-killed-rectangle ()
"Add the latest kill-ring entry for each cursor to killed-rectangle.
So you can paste it in later with `yank-rectangle'."
(let ((entries (mc--kill-ring-entries)))
(unless (mc--all-equal entries)
(setq killed-rectangle entries))))

(defvar mc/unsupported-minor-modes '(auto-complete-mode flyspell-mode)
"List of minor-modes that does not play well with multiple-cursors.
They are temporarily disabled when multiple-cursors are active.")

(defvar mc/temporarily-disabled-minor-modes nil
"The list of temporarily disabled minor-modes.")
(make-variable-buffer-local 'mc/temporarily-disabled-minor-modes)

(defun mc/temporarily-disable-minor-mode (mode)
"If MODE is available and turned on, remember that and turn it off."
(when (and (boundp mode) (eval mode))
(add-to-list 'mc/temporarily-disabled-minor-modes mode)
(funcall mode -1)))

(defun mc/temporarily-disable-unsupported-minor-modes ()
(mapc 'mc/temporarily-disable-minor-mode mc/unsupported-minor-modes))

(defun mc/enable-minor-mode (mode)
(funcall mode 1))

(defun mc/enable-temporarily-disabled-minor-modes ()
(mapc 'mc/enable-minor-mode mc/temporarily-disabled-minor-modes)
(setq mc/temporarily-disabled-minor-modes nil))

(defcustom mc/mode-line
`(" mc:" (:eval (format ,(propertize "%d" 'face 'font-lock-warning-face)
(mc/num-cursors))))
"What to display in the mode line while multiple-cursors-mode is active."
:group 'multiple-cursors)
(put 'mc/mode-line 'risky-local-variable t)

(define-minor-mode multiple-cursors-mode
"Mode while multiple cursors are active."
nil mc/mode-line mc/keymap
(if multiple-cursors-mode
(progn
(mc/temporarily-disable-unsupported-minor-modes)
(add-hook 'pre-command-hook 'mc/make-a-note-of-the-command-being-run nil t)
(add-hook 'post-command-hook 'mc/execute-this-command-for-all-cursors t t)
(run-hooks 'multiple-cursors-mode-enabled-hook))
(remove-hook 'post-command-hook 'mc/execute-this-command-for-all-cursors t)
(remove-hook 'pre-command-hook 'mc/make-a-note-of-the-command-being-run t)
(setq mc--this-command nil)
(mc--maybe-set-killed-rectangle)
(mc/remove-fake-cursors)
(mc/enable-temporarily-disabled-minor-modes)
(run-hooks 'multiple-cursors-mode-disabled-hook)))

(add-hook 'after-revert-hook #'(lambda () (multiple-cursors-mode 0)))

(defun mc/maybe-multiple-cursors-mode ()
"Enable multiple-cursors-mode if there is more than one currently active cursor."
(if (> (mc/num-cursors) 1)
(multiple-cursors-mode 1)
(multiple-cursors-mode 0)))

(defmacro unsupported-cmd (cmd msg)
"Adds command to list of unsupported commands and prevents it
from being executed if in multiple-cursors-mode."
`(progn
(put (quote ,cmd) 'mc--unsupported ,msg)
(defadvice ,cmd (around unsupported-advice activate)
"command isn't supported with multiple cursors"
(unless (and multiple-cursors-mode (called-interactively-p 'any))
ad-do-it))))

;; Commands that does not work with multiple-cursors
(unsupported-cmd isearch-forward ". Feel free to add a compatible version.")
(unsupported-cmd isearch-backward ". Feel free to add a compatible version.")

;; Make sure pastes from other programs are added to all kill-rings when yanking
(defadvice current-kill (before interprogram-paste-for-all-cursors activate)
(let ((interprogram-paste (and (= n 0)
interprogram-paste-function
(funcall interprogram-paste-function))))
(when interprogram-paste
;; Add interprogram-paste to normal kill ring, just
;; like current-kill usually does for itself.
;; We have to do the work for it tho, since the funcall only returns
;; something once. It is not a pure function.
(let ((interprogram-cut-function nil))
(if (listp interprogram-paste)
(mapc 'kill-new (nreverse interprogram-paste))
(kill-new interprogram-paste))
;; And then add interprogram-paste to the kill-rings
;; of all the other cursors too.
(mc/for-each-fake-cursor
(let ((kill-ring (overlay-get cursor 'kill-ring))
(kill-ring-yank-pointer (overlay-get cursor 'kill-ring-yank-pointer)))
(if (listp interprogram-paste)
(mapc 'kill-new (nreverse interprogram-paste))
(kill-new interprogram-paste))
(overlay-put cursor 'kill-ring kill-ring)
(overlay-put cursor 'kill-ring-yank-pointer kill-ring-yank-pointer)))))))

(defvar mc/list-file "~/.emacs.d/.mc-lists.el"
"The position of the file that keeps track of your preferences
for running commands with multiple cursors.")

(defun mc/dump-list (list-symbol)
"Insert (setq 'LIST-SYMBOL LIST-VALUE) to current buffer."
(symbol-macrolet ((value (symbol-value list-symbol)))
(insert "(setq " (symbol-name list-symbol) "\n"
" '(")
(newline-and-indent)
(set list-symbol
(sort value (lambda (x y) (string-lessp (symbol-name x)
(symbol-name y)))))
(mapc #'(lambda (cmd) (insert (format "%S" cmd)) (newline-and-indent))
value)
(insert "))")
(newline)))

(defun mc/save-lists ()
"Saves preferences for running commands with multiple cursors to `mc/list-file'"
(with-temp-file mc/list-file
(emacs-lisp-mode)
(insert ";; This file is automatically generated by the multiple-cursors extension.")
(newline)
(insert ";; It keeps track of your preferences for running commands with multiple cursors.")
(newline)
(newline)
(mc/dump-list 'mc/cmds-to-run-for-all)
(newline)
(mc/dump-list 'mc/cmds-to-run-once)))

(defvar mc/cmds-to-run-once nil
"Commands to run only once in multiple-cursors-mode.")

(defvar mc--default-cmds-to-run-once nil
"Default set of commands to run only once in multiple-cursors-mode.")

(setq mc--default-cmds-to-run-once '(mc/edit-lines
mc/edit-ends-of-lines
mc/edit-beginnings-of-lines
mc/mark-next-like-this
mc/mark-next-word-like-this
mc/mark-next-symbol-like-this
mc/mark-previous-like-this
mc/mark-previous-word-like-this
mc/mark-previous-symbol-like-this
mc/mark-all-like-this
mc/mark-all-words-like-this
mc/mark-all-symbols-like-this
mc/mark-more-like-this-extended
mc/mark-all-like-this-in-defun
mc/mark-all-words-like-this-in-defun
mc/mark-all-symbols-like-this-in-defun
mc/mark-all-like-this-dwim
mc/mark-all-dwim
mc/mark-sgml-tag-pair
mc/insert-numbers
mc/sort-regions
mc/reverse-regions
mc/cycle-forward
mc/cycle-backward
mc/add-cursor-on-click
mc/mark-pop
mc/add-cursors-to-all-matches
mc/mmlte--left
mc/mmlte--right
mc/mmlte--up
mc/mmlte--down
mc/unmark-next-like-this
mc/unmark-previous-like-this
mc/skip-to-next-like-this
mc/skip-to-previous-like-this
rrm/switch-to-multiple-cursors
save-buffer
ido-exit-minibuffer
exit-minibuffer
minibuffer-complete-and-exit
execute-extended-command
undo
redo
undo-tree-undo
undo-tree-redo
universal-argument
universal-argument-more
universal-argument-other-key
negative-argument
digit-argument
top-level
recenter-top-bottom
describe-mode
describe-key-1
describe-function
describe-bindings
describe-prefix-bindings
view-echo-area-messages
other-window
kill-buffer-and-window
split-window-right
split-window-below
delete-other-windows
toggle-window-split
mwheel-scroll
scroll-up-command
scroll-down-command
mouse-set-point
mouse-drag-region
quit-window
toggle-read-only
windmove-left
windmove-right
windmove-up
windmove-down))

(defvar mc--default-cmds-to-run-for-all nil
"Default set of commands that should be mirrored by all cursors")

(setq mc--default-cmds-to-run-for-all '(mc/keyboard-quit
self-insert-command
quoted-insert
previous-line
next-line
newline
newline-and-indent
open-line
delete-blank-lines
transpose-chars
transpose-lines
transpose-paragraphs
transpose-regions
join-line
right-char
right-word
forward-char
forward-word
left-char
left-word
backward-char
backward-word
forward-paragraph
backward-paragraph
upcase-word
downcase-word
capitalize-word
forward-list
backward-list
hippie-expand
hippie-expand-lines
yank
yank-pop
append-next-kill
kill-word
kill-line
kill-whole-line
backward-kill-word
backward-delete-char-untabify
delete-char delete-forward-char
delete-backward-char
py-electric-backspace
c-electric-backspace
org-delete-backward-char
python-indent-dedent-line-backspace
paredit-backward-delete
autopair-backspace
just-one-space
zap-to-char
end-of-line
set-mark-command
exchange-point-and-mark
cua-set-mark
cua-replace-region
move-end-of-line
beginning-of-line
move-beginning-of-line
kill-ring-save
back-to-indentation
subword-forward
subword-backward
subword-mark
subword-kill
subword-backward-kill
subword-transpose
subword-capitalize
subword-upcase
subword-downcase
er/expand-region
er/contract-region
smart-forward
smart-backward
smart-up
smart-down))

(defvar mc/cmds-to-run-for-all nil
"Commands to run for all cursors in multiple-cursors-mode")

(load mc/list-file t) ;; load, but no errors if it does not exist yet please

(provide 'multiple-cursors-core)

;; Local Variables:
;; coding: utf-8
;; byte-compile-warnings: (not cl-functions)
;; End:

;;; multiple-cursors-core.el ends here

+ 2
- 0
emacs/.emacs.d/multiple-cursors/multiple-cursors-pkg.el Näytä tiedosto

@@ -0,0 +1,2 @@
(define-package "multiple-cursors" "1.3.0"
"Multiple cursors for Emacs.")

+ 191
- 0
emacs/.emacs.d/multiple-cursors/multiple-cursors.el Näytä tiedosto

@@ -0,0 +1,191 @@
;;; multiple-cursors.el --- Multiple cursors for emacs.

;; Copyright (C) 2012-2013 Magnar Sveen

;; Author: Magnar Sveen <magnars@gmail.com>
;; Version: 1.2.2
;; 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 <http://www.gnu.org/licenses/>.

;;; Commentary:

;; Multiple cursors for Emacs. This is some pretty crazy functionality, so yes,
;; there are kinks. Don't be afraid tho, I've been using it since 2011 with
;; great success and much merriment.

;; ## Basic usage

;; Start out with:

;; (require 'multiple-cursors)

;; Then you have to set up your keybindings - multiple-cursors doesn't presume to
;; know how you'd like them laid out. Here are some examples:

;; When you have an active region that spans multiple lines, the following will
;; add a cursor to each line:

;; (global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)

;; When you want to add multiple cursors not based on continuous lines, but based on
;; keywords in the buffer, use:

;; (global-set-key (kbd "C->") 'mc/mark-next-like-this)
;; (global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
;; (global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)

;; First mark the word, then add more cursors.

;; To get out of multiple-cursors-mode, press `<return>` or `C-g`. The latter will
;; first disable multiple regions before disabling multiple cursors. If you want to
;; insert a newline in multiple-cursors-mode, use `C-j`.

;; ## Video

;; You can [watch an intro to multiple-cursors at Emacs Rocks](http://emacsrocks.com/e13.html).

;; ## Command overview

;; ### Mark one more occurrence

;; - `mc/mark-next-like-this`: Adds a cursor and region at the next part of the buffer forwards that matches the current region.
;; - `mc/mark-next-word-like-this`: Like `mc/mark-next-like-this` but only for whole words.
;; - `mc/mark-next-symbol-like-this`: Like `mc/mark-next-like-this` but only for whole symbols.
;; - `mc/mark-previous-like-this`: Adds a cursor and region at the next part of the buffer backwards that matches the current region.
;; - `mc/mark-previous-word-like-this`: Like `mc/mark-previous-like-this` but only for whole words.
;; - `mc/mark-previous-symbol-like-this`: Like `mc/mark-previous-like-this` but only for whole symbols.
;; - `mc/mark-more-like-this-extended`: Use arrow keys to quickly mark/skip next/previous occurances.
;; - `mc/add-cursor-on-click`: Bind to a mouse event to add cursors by clicking. See tips-section.

;; ### Mark many occurrences

;; - `mc/mark-all-like-this`: Marks all parts of the buffer that matches the current region.
;; - `mc/mark-all-words-like-this`: Like `mc/mark-all-like-this` but only for whole words.
;; - `mc/mark-all-symbols-like-this`: Like `mc/mark-all-like-this` but only for whole symbols.
;; - `mc/mark-all-in-region`: Prompts for a string to match in the region, adding cursors to all of them.
;; - `mc/mark-all-like-this-in-defun`: Marks all parts of the current defun that matches the current region.
;; - `mc/mark-all-words-like-this-in-defun`: Like `mc/mark-all-like-this-in-defun` but only for whole words.
;; - `mc/mark-all-symbols-like-this-in-defun`: Like `mc/mark-all-like-this-in-defun` but only for whole symbols.
;; - `mc/mark-all-like-this-dwim`: Tries to be smart about marking everything you want. Can be pressed multiple times.

;; ### Special

;; - `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

;; - To get out of multiple-cursors-mode, press `<return>` or `C-g`. The latter will
;; first disable multiple regions before disabling multiple cursors. If you want to
;; insert a newline in multiple-cursors-mode, use `C-j`.
;;
;; - Sometimes you end up with cursors outside of your view. You can
;; scroll the screen to center on each cursor with `C-v` and `M-v`.
;;
;; - Try pressing `mc/mark-next-like-this` with no region selected. It will just add a cursor
;; on the next line.
;;
;; - Try pressing `mc/mark-all-like-this-dwim` on a tagname in html-mode.
;;
;; - Notice that the number of cursors active can be seen in the modeline.
;;
;; - If you get out of multiple-cursors-mode and yank - it will yank only
;; from the kill-ring of main cursor. To yank from the kill-rings of
;; every cursor use yank-rectangle, normally found at C-x r y.
;;
;; - You can use `mc/reverse-regions` with nothing selected and just one cursor.
;; It will then flip the sexp at point and the one below it.
;;
;; - If you would like to keep the global bindings clean, and get custom keybindings
;; when the region is active, you can try [region-bindings-mode](https://github.com/fgallina/region-bindings-mode).
;;
;; BTW, I highly recommend adding `mc/mark-next-like-this` to a key binding that's
;; right next to the key for `er/expand-region`.

;; ### Binding mouse events

;; To override a mouse event, you will likely have to also unbind the
;; `down-mouse` part of the event. Like this:
;;
;; (global-unset-key (kbd "M-<down-mouse-1>"))
;; (global-set-key (kbd "M-<mouse-1>") 'mc/add-cursor-on-click)
;;
;; Or you can do like me and find an unused, but less convenient, binding:
;;
;; (global-set-key (kbd "C-S-<mouse-1>") 'mc/add-cursor-on-click)

;; ## Unknown commands

;; Multiple-cursors uses two lists of commands to know what to do: the run-once list
;; and the run-for-all list. It comes with a set of defaults, but it would be beyond silly
;; to try and include all the known Emacs commands.

;; So that's why multiple-cursors occasionally asks what to do about a command. It will
;; then remember your choice by saving it in `~/.emacs.d/.mc-lists.el`. You can change
;; the location with:

;; (setq mc/list-file "/my/preferred/file")

;; ## Known limitations

;; * isearch-forward and isearch-backward aren't supported with multiple cursors.
;; You should feel free to add a simplified version that can work with it.
;; * Commands run with `M-x` won't be repeated for all cursors.
;; * All key bindings that refer to lambdas are always run for all cursors. If you
;; need to limit it, you will have to give it a name.
;; * Redo might screw with your cursors. Undo works very well.

;; ## Contribute

;; Yes, please do. There's a suite of tests, so remember to add tests for your
;; specific feature, or I might break it later.

;; You'll find the repo at:

;; https://github.com/magnars/multiple-cursors.el

;; To fetch the test dependencies:

;; $ cd /path/to/multiple-cursors
;; $ git submodule update --init

;; Run the tests with:

;; $ ./util/ecukes/ecukes --graphical

;; ## Contributors

;; * [Takafumi Arakaki](https://github.com/tkf) made .mc-lists.el diff friendly
;; * [Marco Baringer](https://github.com/segv) contributed looping to mc/cycle and adding cursors without region for mark-more.
;; * [Ivan Andrus](https://github.com/gvol) added showing number of cursors in mode-line
;; * [Fuco](https://github.com/Fuco1) added the first version of `mc/mark-all-like-this-dwim`

;; Thanks!

;;; Code:

(require 'mc-edit-lines)
(require 'mc-cycle-cursors)
(require 'mc-mark-more)
(require 'mc-mark-pop)
(require 'rectangular-region-mode)
(require 'mc-separate-operations)

(provide 'multiple-cursors)

;;; multiple-cursors.el ends here

+ 124
- 0
emacs/.emacs.d/multiple-cursors/rectangular-region-mode.el Näytä tiedosto

@@ -0,0 +1,124 @@
;;; rectangular-region-mode.el

;; Copyright (C) 2012 Magnar Sveen

;; Author: Magnar Sveen <magnars@gmail.com>
;; 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 <http://www.gnu.org/licenses/>.

;;; Commentary:

;; (global-set-key (kbd "H-SPC") 'set-rectangular-region-anchor)

;; Think of this one as `set-mark` except you're marking a rectangular region. It is
;; an exceedingly quick way of adding multiple cursors to multiple lines.

;;; Code:

(require 'multiple-cursors-core)

(defvar rrm/anchor (make-marker)
"The position in the buffer that anchors the rectangular region.")

(defvar rectangular-region-mode-map (make-sparse-keymap)
"Keymap for rectangular region is mainly for rebinding C-g")

(define-key rectangular-region-mode-map (kbd "C-g") 'rrm/keyboard-quit)
(define-key rectangular-region-mode-map (kbd "<return>") 'rrm/switch-to-multiple-cursors)

(defvar rectangular-region-mode nil)

(defun rrm/keyboard-quit ()
"Exit rectangular-region-mode."
(interactive)
(rectangular-region-mode 0)
(rrm/remove-rectangular-region-overlays)
(deactivate-mark))

;; Bind this to a key (for instance H-SPC) to start rectangular-region-mode
;;;###autoload
(defun set-rectangular-region-anchor ()
"Anchors the rectangular region at point.

Think of this one as `set-mark' except you're marking a rectangular region. It is
an exceedingly quick way of adding multiple cursors to multiple lines."
(interactive)
(set-marker rrm/anchor (point))
(push-mark (point))
(rectangular-region-mode 1))

(defun rrm/remove-rectangular-region-overlays ()
"Remove all rectangular-region overlays."
(mc/remove-fake-cursors)
(mapc #'(lambda (o)
(when (eq (overlay-get o 'type) 'additional-region)
(delete-overlay o)))
(overlays-in (point-min) (point-max))))

(defun rrm/repaint ()
"Start from the anchor and draw a rectangle between it and point."
(if (not rectangular-region-mode)
(remove-hook 'post-command-hook 'rrm/repaint t)
;; else
(rrm/remove-rectangular-region-overlays)
(let* ((annoying-arrows-mode nil)
(point-column (current-column))
(point-line (line-number-at-pos))
(anchor-column (save-excursion (goto-char rrm/anchor) (current-column)))
(anchor-line (save-excursion (goto-char rrm/anchor) (line-number-at-pos)))
(left-column (if (< point-column anchor-column) point-column anchor-column))
(right-column (if (> point-column anchor-column) point-column anchor-column))
(navigation-step (if (< point-line anchor-line) 1 -1)))
(move-to-column anchor-column)
(set-mark (point))
(move-to-column point-column)
(mc/save-excursion
(while (not (= anchor-line (line-number-at-pos)))
(forward-line navigation-step)
(move-to-column anchor-column)
(when (= anchor-column (current-column))
(set-mark (point))
(move-to-column point-column)
(when (= point-column (current-column))
(mc/create-fake-cursor-at-point))))))))

(defun rrm/switch-to-multiple-cursors (&rest forms)
"Switch from rectangular-region-mode to multiple-cursors-mode."
(interactive)
(rectangular-region-mode 0)
(multiple-cursors-mode 1))

(defadvice er/expand-region (before switch-from-rrm-to-mc activate)
(when rectangular-region-mode
(rrm/switch-to-multiple-cursors)))

(defadvice kill-ring-save (before switch-from-rrm-to-mc activate)
(when rectangular-region-mode
(rrm/switch-to-multiple-cursors)))

(define-minor-mode rectangular-region-mode
"A mode for creating a rectangular region to edit"
nil " rr" rectangular-region-mode-map
(if rectangular-region-mode
(progn
(add-hook 'after-change-functions 'rrm/switch-to-multiple-cursors t t)
(add-hook 'post-command-hook 'rrm/repaint t t))
(remove-hook 'after-change-functions 'rrm/switch-to-multiple-cursors t)
(remove-hook 'post-command-hook 'rrm/repaint t)
(set-marker rrm/anchor nil)))

(provide 'rectangular-region-mode)

;;; rectangular-region-mode.el ends here

+ 2
- 0
emacs/.emacs.d/multiple-cursors/run-tests.sh Näytä tiedosto

@@ -0,0 +1,2 @@
#!/bin/sh -e
cask exec ecukes "$@" --no-win

+ 13
- 0
emacs/.emacs.d/multiple-cursors/run-travis-ci.sh Näytä tiedosto

@@ -0,0 +1,13 @@
#!/bin/sh -e

cd "$(dirname "$0")"

ECUKES_EMACS=${EMACS:-$(which emacs)}
export ECUKES_EMACS

echo "*** Emacs version ***"
echo "ECUKES_EMACS = $ECUKES_EMACS"
"$ECUKES_EMACS" --version
echo

exec ./run-tests.sh $TAGS

+ 45
- 0
emacs/.emacs.d/multiple-cursors/watch-tests.watchr Näytä tiedosto

@@ -0,0 +1,45 @@
ENV["WATCHR"] = "1"
system 'clear'

def run(cmd)
`#{cmd}`
end

def run_all_tests
system('clear')
result = run "./run-tests.sh"
puts result
end

def run_test(file)
system('clear')
result = run "./run-tests.sh #{file} --verbose"
puts result
end

run_all_tests
watch('.*.feature') { |file| run_test file }
watch('.*.el') { run_all_tests }

# Ctrl-\
Signal.trap 'QUIT' do
puts " --- Running all tests ---\n\n"
run_all_tests
end

@interrupted = false

# Ctrl-C
Signal.trap 'INT' do
if @interrupted then
@wants_to_quit = true
abort("\n")
else
puts "Interrupt a second time to quit"
@interrupted = true
Kernel.sleep 1.5
# raise Interrupt, nil # let the run loop catch it
run_all_tests
@interrupted = false
end
end

+ 1103
- 0
emacs/.emacs.d/php-mode.el
File diff suppressed because it is too large
Näytä tiedosto


+ 70
- 0
i3/.i3status.conf Näytä tiedosto

@@ -0,0 +1,70 @@
general {
colors = true
color_good = '#88b090'
color_degraded = '#ccdc90'
color_bad = '#e89393'
interval = 1
}

order += "volume master"
#order += "ipv6"
order += "disk /"
#order += "run_watch DHCP"
#order += "run_watch VPN"
#order += "wireless wlan0"
#order += "ethernet eth0"
#order += "battery 0"
#order += "cpu_temperature 0"
order += "load"
order += "cpu_usage 0"
order += "time"

wireless wlan0 {
format_up = "W: (%quality at %essid) %ip"
format_down = "W: down"
}

ethernet eth0 {
# if you use %speed, i3status requires root privileges
format_up = "%ip"
format_down = "E: down"
}

battery 0 {
format = "%status %percentage %remaining"
}

run_watch DHCP {
pidfile = "/var/run/dhclient*.pid"
}

run_watch VPN {
pidfile = "/var/run/vpnc/pid"
}

time {
format = " %a, %m %e %l:%M %p"
}

load {
format = " %1min "
}

cpu_usage {
format = " %usage "
}

cpu_temperature 0 {
format = " %degrees °C"
}

disk "/" {
format = " %free "
}

volume master {
format = " %volume "
device = "default"
mixer = "Master"
mixer_idx = 0
}

+ 190
- 0
i3/config Näytä tiedosto

@@ -0,0 +1,190 @@
# This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout somewhen, delete
# this file and re-run i3-config-wizard(1).
#

# i3 config file (v4)
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!

set $mod Mod4

exec gnome-settings-daemon

exec ~/.dropbox-dist/dropboxd

exec compton --backend glx --vsync opengl-swc --paint-on-overlay

exec feh --bg-tile ~/pictures/dimension.png

# hide dem borders
hide_edge_borders both

# hide dem titles
for_window [class="^.*"] border pixel 0
for_window [title="^float$"] floating enable
for_window [title="^float$"] border pixel 3

# class border backgr. text indicator
client.focused #303031 #303031 #B7B7B7 #31392F
client.focused_inactive #303031 #303031 #B7B7B7 #676767
client.unfocused #303031 #303031 #404041 #515151
client.urgent #471A19 #521414 #ffffff #900000

# font for window titles. ISO 10646 = Unicode
#apt-get install xfonts-terminus
font xft:Terminus 8

# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod

# start a terminal
bindsym $mod+Return exec i3-sensible-terminal
bindsym $mod+t exec i3-sensible-terminal -T float

# kill focused window
bindsym $mod+shift+Q kill

# start dmenu (a program launcher)
bindsym $mod+d exec dmenu_run

bindsym $mod+shift+d exec i3-dmenu-desktop

# change focus
bindsym $mod+b focus left
bindsym $mod+n focus down
bindsym $mod+p focus up
bindsym $mod+f focus right

# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# move focused window
bindsym $mod+Shift+b move left
bindsym $mod+Shift+n move down
bindsym $mod+Shift+p move up
bindsym $mod+Shift+f move right

# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

# split in horizontal orientation
bindsym $mod+h split h

# split in vertical orientation
bindsym $mod+v split v

# enter fullscreen mode for the focused container
bindsym $mod+Shfit+f fullscreen

# change container layout (stacked, tabbed, default)
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout default

# toggle tiling / floating
bindsym $mod+Shift+space floating toggle

# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle

# focus the parent container
bindsym $mod+a focus parent

# focus the child container
#bindcode $mod+d focus child

# switch to workspace
bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3
bindsym $mod+4 workspace 4
bindsym $mod+5 workspace 5
bindsym $mod+6 workspace 6
bindsym $mod+7 workspace 7
bindsym $mod+8 workspace 8
bindsym $mod+9 workspace 9
bindsym $mod+0 workspace 10

# move focused container to workspace
bindsym $mod+Shift+exclam move workspace 1
bindsym $mod+Shift+at move workspace 2
bindsym $mod+Shift+numbersign move workspace 3
bindsym $mod+Shift+dollar move workspace 4
bindsym $mod+Shift+percent move workspace 5
bindsym $mod+Shift+asciicircum move workspace 6
bindsym $mod+Shift+ampersand move workspace 7
bindsym $mod+Shift+asterisk move workspace 8
bindsym $mod+Shift+parenleft move workspace 9
bindsym $mod+Shift+parenright move workspace 10

# reload the configuration file
bindsym $mod+Shift+C reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+R restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+E exit

# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode

# They resize the border in the direction you pressed, e.g.
# when pressing left, the window is resized so that it has
# more space on its left

bindsym j resize shrink left 10 px or 10 ppt
bindsym Shift+J resize grow left 10 px or 10 ppt

bindsym k resize shrink down 10 px or 10 ppt
bindsym Shift+K resize grow down 10 px or 10 ppt

bindsym l resize shrink up 10 px or 10 ppt
bindsym Shift+L resize grow up 10 px or 10 ppt

bindsym semicolon resize shrink right 10 px or 10 ppt
bindsym Shift+colon resize grow right 10 px or 10 ppt

# same bindings, but for the arrow keys
bindsym Left resize shrink left 10 px or 10 ppt
bindsym Shift+Left resize grow left 10 px or 10 ppt

bindsym Down resize shrink down 10 px or 10 ppt
bindsym Shift+Down resize grow down 10 px or 10 ppt

bindsym Up resize shrink up 10 px or 10 ppt
bindsym Shift+Up resize grow up 10 px or 10 ppt

bindsym Right resize shrink right 10 px or 10 ppt
bindsym Shift+Right resize grow right 10 px or 10 ppt

# back to normal: Enter or Escape
bindsym Return mode "default"
bindsym Escape mode "default"
}

bindsym $mod+r mode "resize"

# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
output DFP2
status_command i3status
colors {
background #131313
statusline #B7B7B7

focused_workspace #303031 #303031 #D78A0C
active_workspace #303031 #303031 #9A9A9A
inactive_workspace #303031 #303031 #9A9A9A
urgent_workspace #303031 #303031 #FF0000
}
}

Loading…
Peruuta
Tallenna