git subrepo clone https://github.com/terryma/vim-multiple-cursors.git ./dotfiles/.vim/plugged/vim-multiple-cursors
subrepo: subdir: "dotfiles/.vim/plugged/vim-multiple-cursors" merged: "6456718e" upstream: origin: "https://github.com/terryma/vim-multiple-cursors.git" branch: "master" commit: "6456718e" git-subrepo: version: "0.4.3" origin: "???" commit: "???"
This commit is contained in:
parent
be93c28e01
commit
62e125f76e
21 changed files with 3318 additions and 0 deletions
1
dotfiles/.vim/plugged/vim-multiple-cursors/.gitignore
vendored
Normal file
1
dotfiles/.vim/plugged/vim-multiple-cursors/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/doc/tags
|
12
dotfiles/.vim/plugged/vim-multiple-cursors/.gitrepo
Normal file
12
dotfiles/.vim/plugged/vim-multiple-cursors/.gitrepo
Normal file
|
@ -0,0 +1,12 @@
|
|||
; DO NOT EDIT (unless you know what you are doing)
|
||||
;
|
||||
; This subdirectory is a git "subrepo", and this file is maintained by the
|
||||
; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
|
||||
;
|
||||
[subrepo]
|
||||
remote = https://github.com/terryma/vim-multiple-cursors.git
|
||||
branch = master
|
||||
commit = 6456718e1d30b42c04b920c5413ca44f68f08759
|
||||
parent = be93c28e01e7167e1a949059081d90dda1bd6330
|
||||
method = merge
|
||||
cmdver = 0.4.3
|
2
dotfiles/.vim/plugged/vim-multiple-cursors/.rspec
Normal file
2
dotfiles/.vim/plugged/vim-multiple-cursors/.rspec
Normal file
|
@ -0,0 +1,2 @@
|
|||
--color
|
||||
--format d
|
12
dotfiles/.vim/plugged/vim-multiple-cursors/.travis.yml
Normal file
12
dotfiles/.vim/plugged/vim-multiple-cursors/.travis.yml
Normal file
|
@ -0,0 +1,12 @@
|
|||
os: linux
|
||||
dist: bionic
|
||||
language: ruby
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- vim-gtk
|
||||
- xvfb
|
||||
|
||||
script:
|
||||
- xvfb-run bundle exec rake
|
109
dotfiles/.vim/plugged/vim-multiple-cursors/CHANGELOG.md
Normal file
109
dotfiles/.vim/plugged/vim-multiple-cursors/CHANGELOG.md
Normal file
|
@ -0,0 +1,109 @@
|
|||
## 2.2 (06/10/2013)
|
||||
Bugfixes:
|
||||
- Fix plugin break in PASTE mode. This fixes #44.
|
||||
|
||||
## 2.1 (04/26/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Fix 1 regression where cursors could potentially get out of sync in insert mode
|
||||
|
||||
Features:
|
||||
- Added some logic to debug latency. Fanning out to 30 cursors in insert mode with my vimrc took over 300ms. It's like than 20ms with a plain vimrc. Need to debug what setting is causing the slowing down in insert mode and inform users.
|
||||
|
||||
## 2.0 (04/24/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Fix inconsistent undo behavior. Changes made in multicursor insert mode are now undone together. This fixes #22.
|
||||
- Single key commands that do not terminate properly no longer cause ghostly cursors to linger on screen. An error message is now displayed informing the user the number of cursor locations that the input cannot be properly played back at. This fixes #28.
|
||||
|
||||
## 1.16 (04/23/2013)
|
||||
|
||||
Features:
|
||||
- Add integration tests using vimrunner. Hook up travis-ci to run continous integration on commit.
|
||||
|
||||
## 1.15 (04/22/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Fix plugin causing error bell. This fixes #29.
|
||||
|
||||
## 1.14 (04/22/2013)
|
||||
|
||||
Features:
|
||||
- Allow users to separate start key from next key. (credit: @xanderman)
|
||||
|
||||
## 1.13 (04/22/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Add support for switching to visual line mode from inside multicursor mode
|
||||
- Fix highlight issue where extra character at end of line is highlighted for visual selections covering more than 2 lines.
|
||||
|
||||
## 1.12 (04/19/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Fix tab character causing highlight errors. This fixes #18 and fixes #32
|
||||
|
||||
## 1.11 (04/18/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Fix regression where `C-n` doesn't exhibit correct behavior when all matches have been found
|
||||
- Clear echo messages when a new input is received
|
||||
|
||||
## 1.10 (04/17/2013)
|
||||
|
||||
Bugfixes:
|
||||
- `O` works now in normal mode. This fixes #24
|
||||
- Turn on `lazyredraw` during multicursor mode to prevent the sluggish screen redraws
|
||||
|
||||
Features:
|
||||
- Add command **MultipleCursorsFind** to add multiple virtual cursors using regexp. This closes #20
|
||||
|
||||
## 1.9 (04/17/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Fix starting multicursor mode in visual line mode. This fixes #25
|
||||
- Major refactoring to avoid getting in and out of visual mode as much as possible
|
||||
|
||||
## 1.8 (04/16/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Fix regression that causes call stack to explode with too many cursors
|
||||
|
||||
## 1.7 (04/15/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Finally fix the annoying highlighting problem when the last virtual cursor is on the last character of the line. The solution is a hack, but it should be harmless
|
||||
|
||||
## 1.6 (04/15/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Stop chaining dictionary function calls. This fixes #10 and #11
|
||||
|
||||
## 1.5 (04/15/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Exit Vim's visual mode before waiting for user's next input. This fixes #14
|
||||
|
||||
## 1.4 (04/14/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Don't use clearmatches(). It clears highlighting from other plugins. This fixes #13
|
||||
|
||||
## 1.3 (04/14/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Change mapping from using expression-quote syntax to using raw strings
|
||||
|
||||
## 1.2 (04/14/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Restore view when exiting from multicursor mode. This fixes #5
|
||||
- Remove the unnecessary user level mapping for 'prev' and 'skip' in visual mode, since we can purely detect those keys from multicursor mode
|
||||
|
||||
## 1.1 (04/14/2013)
|
||||
|
||||
Bugfixes:
|
||||
- Stop hijacking escape key in normal mode. This fixes #1, #2, and #3
|
||||
|
||||
## 1.0 (04/13/2013)
|
||||
|
||||
Initial release
|
23
dotfiles/.vim/plugged/vim-multiple-cursors/CONTRIBUTING.md
Normal file
23
dotfiles/.vim/plugged/vim-multiple-cursors/CONTRIBUTING.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Problems summary
|
||||
|
||||
## Expected
|
||||
|
||||
## Environment Information
|
||||
* OS:
|
||||
* Neovim/Vim/Gvim version:
|
||||
|
||||
## Provide a minimal .vimrc with less than 50 lines
|
||||
|
||||
" Your minimal.vimrc
|
||||
|
||||
## Generate a logfile if appropriate
|
||||
|
||||
1. export NVIM_PYTHON_LOG_FILE=/tmp/log
|
||||
2. export NVIM_PYTHON_LOG_LEVEL=DEBUG
|
||||
3. nvim -u minimal.vimrc
|
||||
4. recreate your issue
|
||||
5. cat /tmp/log_{PID}
|
||||
|
||||
## Screen shot (if possible)
|
||||
|
||||
## Upload the log file
|
4
dotfiles/.vim/plugged/vim-multiple-cursors/Gemfile
Normal file
4
dotfiles/.vim/plugged/vim-multiple-cursors/Gemfile
Normal file
|
@ -0,0 +1,4 @@
|
|||
source 'https://rubygems.org'
|
||||
gem 'vimrunner'
|
||||
gem 'rake'
|
||||
gem 'rspec'
|
30
dotfiles/.vim/plugged/vim-multiple-cursors/Gemfile.lock
Normal file
30
dotfiles/.vim/plugged/vim-multiple-cursors/Gemfile.lock
Normal file
|
@ -0,0 +1,30 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
diff-lcs (1.2.5)
|
||||
rake (10.4.2)
|
||||
rspec (3.4.0)
|
||||
rspec-core (~> 3.4.0)
|
||||
rspec-expectations (~> 3.4.0)
|
||||
rspec-mocks (~> 3.4.0)
|
||||
rspec-core (3.4.1)
|
||||
rspec-support (~> 3.4.0)
|
||||
rspec-expectations (3.4.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.4.0)
|
||||
rspec-mocks (3.4.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.4.0)
|
||||
rspec-support (3.4.1)
|
||||
vimrunner (0.3.1)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
rake
|
||||
rspec
|
||||
vimrunner
|
||||
|
||||
BUNDLED WITH
|
||||
1.10.6
|
20
dotfiles/.vim/plugged/vim-multiple-cursors/MIT-LICENSE.txt
Normal file
20
dotfiles/.vim/plugged/vim-multiple-cursors/MIT-LICENSE.txt
Normal file
|
@ -0,0 +1,20 @@
|
|||
Copyright 2013 Terry Ma
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
265
dotfiles/.vim/plugged/vim-multiple-cursors/README.md
Normal file
265
dotfiles/.vim/plugged/vim-multiple-cursors/README.md
Normal file
|
@ -0,0 +1,265 @@
|
|||
# **❗ This plugin is deprecated, use [vim-visual-multi](https://github.com/mg979/vim-visual-multi) instead ❗**
|
||||
|
||||
# vim-multiple-cursors
|
||||
[![Build Status](https://travis-ci.org/terryma/vim-multiple-cursors.svg?branch=master)](https://travis-ci.org/github/terryma/vim-multiple-cursors)
|
||||
|
||||
## Contents
|
||||
- [About](#about)
|
||||
- [Installation](#installation)
|
||||
- [Quick Start](#quick-start)
|
||||
- [Mapping](#mapping)
|
||||
- [Settings](#settings)
|
||||
- [Interactions with other plugins](#interactions-with-other-plugins)
|
||||
- [Highlight](#highlight)
|
||||
- [FAQ](#faq)
|
||||
- [Contributing](#contributing)
|
||||
- [Credit](#credit)
|
||||
|
||||
## About
|
||||
[There](https://github.com/paradigm/vim-multicursor) [have](https://github.com/felixr/vim-multiedit) [been](https://github.com/hlissner/vim-multiedit) [many](https://github.com/adinapoli/vim-markmultiple) [attempts](https://github.com/AndrewRadev/multichange.vim) at bringing Sublime Text's awesome [multiple selection][sublime-multiple-selection] feature into Vim, but none so far have been in my opinion a faithful port that is simplistic to use, yet powerful and intuitive enough for an existing Vim user. [vim-multiple-cursors] is yet another attempt at that.
|
||||
|
||||
### It's great for quick refactoring
|
||||
![Example1](assets/example1.gif?raw=true)
|
||||
|
||||
Vim command sequence: `fp<C-n><C-n><C-n>cname`
|
||||
|
||||
### Add a cursor to each line of your visual selection
|
||||
![Example2](assets/example2.gif?raw=true)
|
||||
|
||||
Vim command sequence: `vip<C-n>i"<Right><Right><Right>",<Esc>vipgJ$r]Idays = [`
|
||||
|
||||
### Match characters from visual selection
|
||||
![Example3](assets/example3.gif?raw=true)
|
||||
|
||||
Vim command sequence: `df[$r,0f,v<C-n>…<C-n>c<CR><Up><Del><Right><Right><Right><Del>`
|
||||
|
||||
### Use the command to match regexp
|
||||
![Example4](assets/example4.gif?raw=true)
|
||||
|
||||
To see what keystrokes are used for the above examples, see [the wiki page](https://github.com/terryma/vim-multiple-cursors/wiki/Keystrokes-for-example-gifs).
|
||||
|
||||
## Installation
|
||||
Install using [Pathogen], [Vundle], [Neobundle], [vim-plug], or your favorite Vim package manager.
|
||||
|
||||
Requires vim 7.4 or newer for full functionality.
|
||||
|
||||
### vim-plug instructions
|
||||
|
||||
1. Paste this block into the top of `~/.vimrc`.
|
||||
|
||||
```vim script
|
||||
call plug#begin()
|
||||
|
||||
Plug 'terryma/vim-multiple-cursors'
|
||||
|
||||
call plug#end()
|
||||
```
|
||||
|
||||
2. Start vim and execute `:PlugInstall`.
|
||||
|
||||
## Quick Start
|
||||
### normal mode / visual mode
|
||||
* start: `<C-n>` start multicursor and add a _virtual cursor + selection_ on the match
|
||||
* next: `<C-n>` add a new _virtual cursor + selection_ on the next match
|
||||
* skip: `<C-x>` skip the next match
|
||||
* prev: `<C-p>` remove current _virtual cursor + selection_ and go back on previous match
|
||||
* select all: `<A-n>` start multicursor and directly select all matches
|
||||
|
||||
You can now change the _virtual cursors + selection_ with **visual mode** commands.
|
||||
For instance: `c`, `s`, `I`, `A` work without any issues.
|
||||
You could also go to **normal mode** by pressing `v` and use normal commands there.
|
||||
|
||||
At any time, you can press `<Esc>` to exit back to regular Vim.
|
||||
|
||||
**NOTE**: start with `g<C-n>` to match without boundaries (behaves like `g*` instead of `*`)
|
||||
|
||||
### visual mode when multiple lines are selected
|
||||
* start: `<C-n>` add _virtual cursors_ on each line
|
||||
|
||||
You can now change the _virtual cursors_ with **normal mode** commands.
|
||||
For instance: `ciw`.
|
||||
|
||||
### command
|
||||
The command `MultipleCursorsFind` accepts a range and a pattern (regexp), it creates a _visual cursor_ at the end of each match.
|
||||
If no range is passed in, then it defaults to the entire buffer.
|
||||
|
||||
|
||||
## Mapping
|
||||
If you don't like the plugin taking over your key bindings, you can turn it off and reassign them the way you want:
|
||||
```viml
|
||||
let g:multi_cursor_use_default_mapping=0
|
||||
|
||||
" Default mapping
|
||||
let g:multi_cursor_start_word_key = '<C-n>'
|
||||
let g:multi_cursor_select_all_word_key = '<A-n>'
|
||||
let g:multi_cursor_start_key = 'g<C-n>'
|
||||
let g:multi_cursor_select_all_key = 'g<A-n>'
|
||||
let g:multi_cursor_next_key = '<C-n>'
|
||||
let g:multi_cursor_prev_key = '<C-p>'
|
||||
let g:multi_cursor_skip_key = '<C-x>'
|
||||
let g:multi_cursor_quit_key = '<Esc>'
|
||||
```
|
||||
|
||||
**NOTE:** Please make sure to always map something to `g:multi_cursor_quit_key`, otherwise you'll have a tough time quitting from multicursor mode.
|
||||
|
||||
## Settings
|
||||
Currently there are four additional global settings one can tweak:
|
||||
|
||||
### ```g:multi_cursor_support_imap``` (Default: 1)
|
||||
If set to 0, insert mappings won't be supported in _Insert_ mode anymore.
|
||||
|
||||
### ```g:multi_cursor_exit_from_visual_mode``` (Default: 0)
|
||||
If set to 1, then pressing `g:multi_cursor_quit_key` in _Visual_ mode will quit and
|
||||
delete all existing cursors, just skipping normal mode with multiple cursors.
|
||||
|
||||
### ```g:multi_cursor_exit_from_insert_mode``` (Default: 0)
|
||||
If set to 1, then pressing `g:multi_cursor_quit_key` in _Insert_ mode will quit and
|
||||
delete all existing cursors, just skipping normal mode with multiple cursors.
|
||||
|
||||
### ```g:multi_cursor_normal_maps``` (Default: see below)
|
||||
`{'@': 1, 'F': 1, 'T': 1, '[': 1, '\': 1, ']': 1, '!': 1, '"': 1, 'c': 1, 'd': 1, 'f': 1, 'g': 1, 'm': 1, 'q': 1, 'r': 1, 't': 1, 'y': 1, 'z': 1, '<': 1, '=': 1, '>': 1}`
|
||||
|
||||
Any key in this map (values are ignored) will cause multi-cursor _Normal_ mode
|
||||
to pause for map completion just like normal vim. Otherwise keys mapped in
|
||||
normal mode will "fail to replay" when multiple cursors are active.
|
||||
For example: `{'d':1}` makes normal-mode command `dw` work in multi-cursor mode.
|
||||
|
||||
The default list contents should work for anybody, unless they have remapped a
|
||||
key from an operator-pending command to a non-operator-pending command or
|
||||
vice versa.
|
||||
|
||||
These keys must be manually listed because vim doesn't provide a way to
|
||||
automatically see which keys _start_ mappings, and trying to run motion commands
|
||||
such as `j` as if they were operator-pending commands can break things.
|
||||
|
||||
### ```g:multi_cursor_visual_maps``` (Default: see below)
|
||||
`{'T': 1, 'a': 1, 't': 1, 'F': 1, 'f': 1, 'i': 1}`
|
||||
|
||||
Same principle as `g:multi_cursor_normal_maps`
|
||||
|
||||
### Interactions with other plugins
|
||||
|
||||
### ```Multiple_cursors_before/Multiple_cursors_after``` (Default: `nothing`)
|
||||
|
||||
Other plugins may be incompatible in insert mode.
|
||||
That is why we provide hooks to disable those plug-ins when vim-multiple-cursors is active:
|
||||
|
||||
For example, if you are using [Neocomplete](https://github.com/Shougo/neocomplete.vim),
|
||||
add this to your vimrc to prevent conflict:
|
||||
|
||||
```viml
|
||||
function! Multiple_cursors_before()
|
||||
if exists(':NeoCompleteLock')==2
|
||||
exe 'NeoCompleteLock'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! Multiple_cursors_after()
|
||||
if exists(':NeoCompleteUnlock')==2
|
||||
exe 'NeoCompleteUnlock'
|
||||
endif
|
||||
endfunction
|
||||
```
|
||||
|
||||
Plugins themselves can register `User` autocommands on `MultipleCursorsPre` and
|
||||
`MultipleCursorsPost` for automatic integration.
|
||||
|
||||
### Highlight
|
||||
The plugin uses the highlight group `multiple_cursors_cursor` and `multiple_cursors_visual` to highlight the virtual cursors and their visual selections respectively. You can customize them by putting something similar like the following in your vimrc:
|
||||
|
||||
```viml
|
||||
" Default highlighting (see help :highlight and help :highlight-link)
|
||||
highlight multiple_cursors_cursor term=reverse cterm=reverse gui=reverse
|
||||
highlight link multiple_cursors_visual Visual
|
||||
```
|
||||
|
||||
## FAQ
|
||||
|
||||
#### **Q** Pressing <kbd>i</kbd> after selecting words with <kbd>C-n</kbd> makes the plugin hang, why?
|
||||
**A** When selecting words with <kbd>C-n</kbd>, the plugin behaves like in **visual** mode.
|
||||
Once you pressed <kbd>i</kbd>, you can still press <kbd>I</kbd> to insert text.
|
||||
|
||||
#### **Q** <kbd>ALT</kbd>+<kbd>n</kbd> doesn't seem to work in VIM but works in gVIM, why?
|
||||
**A** This is a well known terminal/Vim [issue](http://vim.wikia.com/wiki/Get_Alt_key_to_work_in_terminal), different terminal have different ways to send ```Alt+key```.
|
||||
Try adding this in your `.vimrc` and **make sure to replace the string**:
|
||||
```vim
|
||||
if !has('gui_running')
|
||||
map "in Insert mode, type Ctrl+v Alt+n here" <A-n>
|
||||
endif
|
||||
```
|
||||
Or remap the following:
|
||||
```vim
|
||||
g:multi_cursor_start_key
|
||||
g:multi_cursor_select_all_key
|
||||
```
|
||||
|
||||
#### **Q** <kbd>CTRL</kbd>+<kbd>n</kbd> doesn't seem to work in gVIM?
|
||||
**A** Try setting `set selection=inclusive` in your `~/.gvimrc`
|
||||
|
||||
**A** Alternatively, you can just temporarily disable _exclusive_ selection whenever the plugin is active:
|
||||
```VimL
|
||||
augroup MultipleCursorsSelectionFix
|
||||
autocmd User MultipleCursorsPre if &selection ==# 'exclusive' | let g:multi_cursor_save_selection = &selection | set selection=inclusive | endif
|
||||
autocmd User MultipleCursorsPost if exists('g:multi_cursor_save_selection') | let &selection = g:multi_cursor_save_selection | unlet g:multi_cursor_save_selection | endif
|
||||
augroup END
|
||||
```
|
||||
|
||||
### **Q** deoplete insert giberrish, how to fix this?
|
||||
**A** use the `Multiple_cursors` functions, add this in your vimrc:
|
||||
|
||||
```VimL
|
||||
func! Multiple_cursors_before()
|
||||
if deoplete#is_enabled()
|
||||
call deoplete#disable()
|
||||
let g:deoplete_is_enable_before_multi_cursors = 1
|
||||
else
|
||||
let g:deoplete_is_enable_before_multi_cursors = 0
|
||||
endif
|
||||
endfunc
|
||||
func! Multiple_cursors_after()
|
||||
if g:deoplete_is_enable_before_multi_cursors
|
||||
call deoplete#enable()
|
||||
endif
|
||||
endfunc
|
||||
```
|
||||
|
||||
#### **Q** is it also working on Mac?
|
||||
**A** On Mac OS, [MacVim](https://code.google.com/p/macvim/) is known to work.
|
||||
|
||||
#### **Q** How can I select `n` keywords with several keystrokes? `200<C-n>` does not work.
|
||||
**A** You can use :MultipleCursorsFind keyword. I have this binding in my vimrc:
|
||||
|
||||
```VimL
|
||||
nnoremap <silent> <M-j> :MultipleCursorsFind <C-R>/<CR>
|
||||
vnoremap <silent> <M-j> :MultipleCursorsFind <C-R>/<CR>
|
||||
```
|
||||
|
||||
This allows one to search for the keyword using `*` and turn search results into cursors with `Alt-j`.
|
||||
|
||||
|
||||
## Contributing
|
||||
Patches and suggestions are always welcome! A list of open feature requests can be found [here](https://github.com/terryma/vim-multiple-cursors/labels/pull%20request%20welcome).
|
||||
|
||||
### Issue Creation
|
||||
Contributor's time is precious and limited. Please ensure it meets the requirements outlined in [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||
|
||||
### Pull Requests
|
||||
Running the test suite requires ruby and rake as well as vim of course. Before submitting PR, please ensure the checks are passing:
|
||||
```bash
|
||||
cd vim-multiple-cursors/spec/
|
||||
bundle exec rake
|
||||
```
|
||||
|
||||
### Contributors
|
||||
This is a community supported project. Here is the list of all the [Contributors](https://github.com/terryma/vim-multiple-cursors/graphs/contributors)
|
||||
|
||||
## Credit
|
||||
Obviously inspired by Sublime Text's [multiple selection][sublime-multiple-selection] feature, also encouraged by Emac's [multiple cursors][emacs-multiple-cursors] implementation by Magnar Sveen
|
||||
|
||||
[vim-multiple-cursors]:http://github.com/terryma/vim-multiple-cursors
|
||||
[sublime-multiple-selection]:http://www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html
|
||||
[Pathogen]:http://github.com/tpope/vim-pathogen
|
||||
[Vundle]:http://github.com/gmarik/vundle
|
||||
[Neobundle]:http://github.com/Shougo/neobundle.vim
|
||||
[vim-plug]:https://github.com/junegunn/vim-plug
|
||||
[emacs-multiple-cursors]:https://github.com/magnars/multiple-cursors.el
|
11
dotfiles/.vim/plugged/vim-multiple-cursors/Rakefile
Normal file
11
dotfiles/.vim/plugged/vim-multiple-cursors/Rakefile
Normal file
|
@ -0,0 +1,11 @@
|
|||
require 'rspec/core/rake_task'
|
||||
|
||||
RSpec::Core::RakeTask.new(:spec) do |t|
|
||||
t.pattern = 'spec/multiple_cursors_spec.rb'
|
||||
end
|
||||
|
||||
RSpec::Core::RakeTask.new(:benchmark) do |t|
|
||||
t.pattern = 'spec/benchmark_spec.rb'
|
||||
end
|
||||
|
||||
task :default => :spec
|
BIN
dotfiles/.vim/plugged/vim-multiple-cursors/assets/example1.gif
Normal file
BIN
dotfiles/.vim/plugged/vim-multiple-cursors/assets/example1.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 101 KiB |
BIN
dotfiles/.vim/plugged/vim-multiple-cursors/assets/example2.gif
Normal file
BIN
dotfiles/.vim/plugged/vim-multiple-cursors/assets/example2.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 265 KiB |
BIN
dotfiles/.vim/plugged/vim-multiple-cursors/assets/example3.gif
Normal file
BIN
dotfiles/.vim/plugged/vim-multiple-cursors/assets/example3.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 177 KiB |
BIN
dotfiles/.vim/plugged/vim-multiple-cursors/assets/example4.gif
Normal file
BIN
dotfiles/.vim/plugged/vim-multiple-cursors/assets/example4.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 532 KiB |
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,250 @@
|
|||
*vim-multiple-cursors.txt* True Sublime Text multiple selection in Vim
|
||||
|
||||
____ _ __
|
||||
____ ___ __ __/ / /_(_)___ / /__ _______ ________________ __________
|
||||
/ __ `__ \/ / / / / __/ / __ \/ / _ \ / ___/ / / / ___/ ___/ __ \/ ___/ ___/
|
||||
/ / / / / / /_/ / / /_/ / /_/ / / __/ / /__/ /_/ / / (__ ) /_/ / / (__ )
|
||||
/_/ /_/ /_/\__,_/_/\__/_/ .___/_/\___/ \___/\__,_/_/ /____/\____/_/ /____/
|
||||
/_/
|
||||
|
||||
|
||||
Reference Manual~
|
||||
|
||||
|
||||
==============================================================================
|
||||
|
||||
CONTENTS *multiple-cursors-contents*
|
||||
1.Intro...................................|multiple-cursors-intro|
|
||||
2.Usage...................................|multiple-cursors-usage|
|
||||
3.Mappings................................|multiple-cursors-mappings|
|
||||
4.Global Options..........................|multiple-cursors-global-options|
|
||||
5.Interactions with other plugins.........|multiple-cursors-other-plugins|
|
||||
6.Highlight...............................|multiple-cursors-highlight|
|
||||
7.FAQ.....................................|multiple-cursors-faq|
|
||||
8.Contributing............................|multiple-cursors-contributing|
|
||||
9.License.................................|multiple-cursors-license|
|
||||
10.Credit..................................|multiple-cursors-credit|
|
||||
11.References..............................|multiple-cursors-references|
|
||||
|
||||
==============================================================================
|
||||
1. Intro *multiple-cursors-intro*
|
||||
|
||||
There [1] have [2] been [3] many [4] attempts [5] at bringing Sublime Text's
|
||||
awesome multiple selection [6] feature into Vim, but none so far have been in
|
||||
my opinion a faithful port that is simplistic to use, yet powerful and
|
||||
intuitive enough for an existing Vim user. *vim-multiple-cursors* is yet
|
||||
another attempt at that.
|
||||
|
||||
==============================================================================
|
||||
2. Usage *multiple-cursors-usage*
|
||||
|
||||
normal mode / visual mode~
|
||||
|
||||
- start: `<C-n>` start multicursor and add a virtual cursor + visual selection on the match
|
||||
+ next: `<C-n>` add a new virtual cursor + visual selection on the next match
|
||||
+ skip: `<C-x>` skip the next match
|
||||
+ prev: `<C-p>` remove current virtual cursor + visual selection and go back on previous match
|
||||
- select all: `<A-n>` start muticursor and directly select all matches
|
||||
|
||||
You can now change the virtual cursors + visual selection with |visual-mode| commands.
|
||||
For instance: `c`, `s`, `I`, `A` work without any issues.
|
||||
You could also go to |normal-mode| by pressing `v` and use normal commands there.
|
||||
|
||||
At any time, you can press `<Esc>` to exit back to regular Vim.
|
||||
|
||||
NOTE: start with `g<C-n>` to match without boundaries (behaves like `g*` instead of `*`, see |gstar|)
|
||||
|
||||
visual mode when multiple lines are selected~
|
||||
|
||||
- start: `<C-n>` add virtual cursors on each line
|
||||
|
||||
You can now change the virtual cursors with |normal-mode| commands.
|
||||
For instance: `ciw`.
|
||||
|
||||
command~
|
||||
|
||||
The command `MultipleCursorsFind` accepts a range and a pattern (regexp), it
|
||||
creates a visual cursor at the end of each match.
|
||||
If no range is passed in, then it defaults to the entire buffer.
|
||||
|
||||
==============================================================================
|
||||
3. Mappings *multiple-cursors-mappings*
|
||||
|
||||
If you don't like the plugin taking over your favorite key bindings, you can
|
||||
turn off the default with >
|
||||
|
||||
let g:multi_cursor_use_default_mapping=0
|
||||
|
||||
" Default mapping
|
||||
let g:multi_cursor_start_word_key = '<C-n>'
|
||||
let g:multi_cursor_select_all_word_key = '<A-n>'
|
||||
let g:multi_cursor_start_key = 'g<C-n>'
|
||||
let g:multi_cursor_select_all_key = 'g<A-n>'
|
||||
let g:multi_cursor_next_key = '<C-n>'
|
||||
let g:multi_cursor_prev_key = '<C-p>'
|
||||
let g:multi_cursor_skip_key = '<C-x>'
|
||||
let g:multi_cursor_quit_key = '<Esc>'
|
||||
<
|
||||
|
||||
NOTE: Please make sure to always map something to |g:multi_cursor_quit_key|,
|
||||
otherwise you'll have a tough time quitting from multicursor mode.
|
||||
|
||||
==============================================================================
|
||||
4. Global Options *multiple-cursors-global-options*
|
||||
|
||||
Currently there are four additional global settings one can tweak:
|
||||
|
||||
*g:multi_cursor_support_imap* (Default: 1)
|
||||
|
||||
If set to 0, insert mappings won't be supported in |insert-mode| anymore.
|
||||
|
||||
*g:multi_cursor_exit_from_visual_mode* (Default: 0)
|
||||
|
||||
If set to 0, then pressing |g:multi_cursor_quit_key| in |visual-mode| will quit
|
||||
and delete all existing cursors, skipping normal mode with multiple cursors.
|
||||
|
||||
*g:multi_cursor_exit_from_insert_mode* (Default: 0)
|
||||
|
||||
If set to 1, then pressing |g:multi_cursor_quit_key| in |insert-mode| will quit
|
||||
and delete all existing cursors, skipping normal mode with multiple cursors.
|
||||
|
||||
*g:multi_cursor_normal_maps* (Default: see below)
|
||||
|
||||
`{'@': 1, 'F': 1, 'T': 1, '[': 1, '\': 1, ']': 1, '!': 1, '"': 1, 'c': 1, 'd': 1, 'f': 1, 'g': 1, 'm': 1, 'q': 1, 'r': 1, 't': 1, 'y': 1, 'z': 1, '<': 1, '=': 1, '>': 1}`
|
||||
|
||||
Any key in this map (values are ignored) will cause multi-cursor _Normal_ mode
|
||||
to pause for map completion just like normal vim. Otherwise keys mapped in
|
||||
normal mode will "fail to replay" when multiple cursors are active. For
|
||||
example: `{'d':1}` makes normal-mode command `dw` work in multi-cursor mode.
|
||||
|
||||
The default list contents should work for anybody, unless they have remapped a
|
||||
key from an operator-pending command to a non-operator-pending command or
|
||||
vice versa.
|
||||
|
||||
These keys must be manually listed because vim doesn't provide a way to
|
||||
automatically see which keys _start_ mappings, and trying to run motion commands
|
||||
such as `j` as if they were operator-pending commands can break things.
|
||||
|
||||
*g:multi_cursor_visual_maps* (Default: )
|
||||
|
||||
`{'T': 1, 'a': 1, 't': 1, 'F': 1, 'f': 1, 'i': 1}`
|
||||
|
||||
Same principle as |g:multi_cursor_normal_maps|
|
||||
|
||||
==============================================================================
|
||||
5. Interactions with other plugins *multiple-cursors-other-plugins*
|
||||
|
||||
Other plugins may be incompatible in insert mode. That is why we provide
|
||||
hooks to disable those plug-ins when vim-multiple-cursors is active:
|
||||
|
||||
For example, if you are using `Neocomplete`, add this to your vimrc to prevent
|
||||
conflict:
|
||||
>
|
||||
function! Multiple_cursors_before()
|
||||
if exists(':NeoCompleteLock')==2
|
||||
exe 'NeoCompleteLock'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! Multiple_cursors_after()
|
||||
if exists(':NeoCompleteUnlock')==2
|
||||
exe 'NeoCompleteUnlock'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
Plugins themselves can register |User| |autocommand| on `MultipleCursorsPre` and
|
||||
`MultipleCursorsPost` for automatic integration.
|
||||
|
||||
==============================================================================
|
||||
6. Highlight *multiple-cursors-highlight*
|
||||
>
|
||||
The plugin uses the highlight group `multiple_cursors_cursor` and
|
||||
`multiple_cursors_visual` to highlight the virtual cursors and their visual
|
||||
selections respectively. You can customize them by putting something similar
|
||||
like the following in your vimrc: >
|
||||
" Default highlighting (see help :highlight and help :highlight-link)
|
||||
highlight multiple_cursors_cursor term=reverse cterm=reverse gui=reverse
|
||||
highlight link multiple_cursors_visual Visual
|
||||
|
||||
==============================================================================
|
||||
7. FAQ *multiple-cursors-faq*
|
||||
|
||||
Q: Pressing <i> after selecting words with <C-n> makes the plugin hang, why?
|
||||
A: When selecting words with <C-n>, the plugin behaves like in `visual` mode.
|
||||
Once you pressed <i>, you can still press <I> to insert text.
|
||||
|
||||
Q: <A-n> doesn't seem to work in VIM but works in gVIM, why?
|
||||
A: This is a well known terminal/Vim [9], different terminal have different
|
||||
ways to send `Alt+key`. Try adding this in your `.vimrc` and make sure
|
||||
to replace the string: >
|
||||
if !has('gui_running')
|
||||
map "in Insert mode, type Ctrl+v Alt+n here" <A-n>
|
||||
endif
|
||||
Or remap the following: >
|
||||
g:multi_cursor_start_key
|
||||
g:multi_cursor_select_all_key
|
||||
|
||||
Q: <C-n> doesn't seem to work in gVIM?
|
||||
A: Try setting `set selection=inclusive` in your `~/.gvimrc`
|
||||
|
||||
Q: deoplete insert giberrish, how to fix this?
|
||||
A: use the `Multiple_cursors` functions, add this in your vimrc: >
|
||||
func! Multiple_cursors_before()
|
||||
if deoplete#is_enabled()
|
||||
call deoplete#disable()
|
||||
let g:deoplete_is_enable_before_multi_cursors = 1
|
||||
else
|
||||
let g:deoplete_is_enable_before_multi_cursors = 0
|
||||
endif
|
||||
endfunc
|
||||
func! Multiple_cursors_after()
|
||||
if g:deoplete_is_enable_before_multi_cursors
|
||||
call deoplete#enable()
|
||||
endif
|
||||
endfunc
|
||||
|
||||
Q: is it also working on Mac?
|
||||
A: On Mac OS, MacVim[10] is known to work.
|
||||
|
||||
Q: How can I select `n` keywords with several keystrokes? `200<C-n>` does not work.
|
||||
A: You can use :MultipleCursorsFind keyword. I have this binding in my vimrc: >
|
||||
nnoremap <silent> <M-j> :MultipleCursorsFind <C-R>/<CR>
|
||||
vnoremap <silent> <M-j> :MultipleCursorsFind <C-R>/<CR>
|
||||
This allows one to search for the keyword using `*` and turn search results into cursors with `Alt-j`.
|
||||
|
||||
==============================================================================
|
||||
8. Contributing *multiple-cursors-contributing*
|
||||
|
||||
The project is hosted on Github. Patches, feature requests and suggestions are
|
||||
always welcome!
|
||||
|
||||
Find the latest version of the plugin here:
|
||||
http://github.com/terryma/vim-multiple-cursors
|
||||
|
||||
==============================================================================
|
||||
9. License *multiple-cursors-license*
|
||||
|
||||
The project is licensed under the MIT license [7]. Copyright 2013 Terry Ma
|
||||
|
||||
==============================================================================
|
||||
10. Credit *multiple-cursors-credit*
|
||||
|
||||
The plugin is obviously inspired by Sublime Text's awesome multiple selection
|
||||
[6] feature. Some inspiration was also taken from Emac's multiple cursors [8]
|
||||
implementation.
|
||||
|
||||
==============================================================================
|
||||
10. References *multiple-cursors-references*
|
||||
|
||||
[1] https://github.com/paradigm/vim-multicursor
|
||||
[2] https://github.com/felixr/vim-multiedit
|
||||
[3] https://github.com/hlissner/vim-multiedit
|
||||
[4] https://github.com/adinapoli/vim-markmultiple
|
||||
[5] https://github.com/AndrewRadev/multichange.vim
|
||||
[6] http://www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html
|
||||
[7] http://opensource.org/licenses/MIT
|
||||
[8] https://github.com/magnars/multiple-cursors.el
|
||||
[9] http://vim.wikia.com/wiki/Get_Alt_key_to_work_in_terminal
|
||||
[10] https://code.google.com/p/macvim
|
||||
|
||||
vim:tw=78:sw=4:ft=help:norl:
|
|
@ -0,0 +1,104 @@
|
|||
"===============================================================================
|
||||
" File: multiple_cursors.vim
|
||||
" Author: Terry Ma
|
||||
" Description: Emulate Sublime Text's multi selection feature
|
||||
" Potential Features:
|
||||
" - Create a blinking cursor effect? Good place to do it would be instead of
|
||||
" waiting for user input, cycle through the highlight
|
||||
" - Integrate with the status line? Maybe show a special multicursor mode?
|
||||
" - Support mouse? Ctrl/Cmd click to set cursor?
|
||||
"===============================================================================
|
||||
let s:save_cpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
function! s:init_settings(settings)
|
||||
for [key, value] in items(a:settings)
|
||||
let sub = ''
|
||||
if type(value) == 0
|
||||
let sub = '%d'
|
||||
elseif type(value) == 1
|
||||
let sub = '"%s"'
|
||||
endif
|
||||
let fmt = printf("let g:multi_cursor_%%s=get(g:, 'multi_cursor_%%s', %s)",
|
||||
\ sub)
|
||||
exec printf(fmt, key, key, value)
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
" Settings
|
||||
let s:settings = {
|
||||
\ 'exit_from_visual_mode': 0,
|
||||
\ 'exit_from_insert_mode': 0,
|
||||
\ 'use_default_mapping': 1,
|
||||
\ 'debug_latency': 0,
|
||||
\ 'support_imap': 1,
|
||||
\ }
|
||||
|
||||
let s:settings_if_default = {
|
||||
\ 'quit_key': '<Esc>',
|
||||
\ 'start_key': 'g<C-n>',
|
||||
\ 'start_word_key': '<C-n>',
|
||||
\ 'next_key': '<C-n>',
|
||||
\ 'prev_key': '<C-p>',
|
||||
\ 'skip_key': '<C-x>',
|
||||
\ 'select_all_key': 'g<A-n>',
|
||||
\ 'select_all_word_key': '<A-n>',
|
||||
\ }
|
||||
|
||||
let s:default_normal_maps = {'!':1, '@':1, '=':1, 'q':1, 'r':1, 't':1, 'T':1, 'y':1, '[':1, ']':1, '\':1, 'd':1, 'f':1, 'F':1, 'g':1, '"':1, 'z':1, 'c':1, 'm':1, '<':1, '>':1}
|
||||
let s:default_visual_maps = {'i':1, 'a':1, 'f':1, 'F':1, 't':1, 'T':1}
|
||||
|
||||
let g:multi_cursor_normal_maps =
|
||||
\ get(g:, 'multi_cursor_normal_maps', s:default_normal_maps)
|
||||
let g:multi_cursor_visual_maps =
|
||||
\ get(g:, 'multi_cursor_visual_maps', s:default_visual_maps)
|
||||
|
||||
call s:init_settings(s:settings)
|
||||
|
||||
if g:multi_cursor_use_default_mapping
|
||||
call s:init_settings(s:settings_if_default)
|
||||
endif
|
||||
|
||||
if !exists('g:multi_cursor_start_word_key')
|
||||
if exists('g:multi_cursor_next_key')
|
||||
let g:multi_cursor_start_word_key = g:multi_cursor_next_key
|
||||
endif
|
||||
endif
|
||||
|
||||
" External mappings
|
||||
if exists('g:multi_cursor_start_key')
|
||||
exec 'nnoremap <silent> '.g:multi_cursor_start_key.
|
||||
\' :call multiple_cursors#new("n", 0)<CR>'
|
||||
exec 'xnoremap <silent> '.g:multi_cursor_start_key.
|
||||
\' :<C-u>call multiple_cursors#new("v", 0)<CR>'
|
||||
endif
|
||||
|
||||
if exists('g:multi_cursor_start_word_key')
|
||||
exec 'nnoremap <silent> '.g:multi_cursor_start_word_key.
|
||||
\' :call multiple_cursors#new("n", 1)<CR>'
|
||||
" In Visual mode word boundary is not used
|
||||
exec 'xnoremap <silent> '.g:multi_cursor_start_word_key.
|
||||
\' :<C-u>call multiple_cursors#new("v", 0)<CR>'
|
||||
endif
|
||||
|
||||
if exists('g:multi_cursor_select_all_key')
|
||||
exec 'nnoremap <silent> '.g:multi_cursor_select_all_key.
|
||||
\' :call multiple_cursors#select_all("n", 0)<CR>'
|
||||
exec 'xnoremap <silent> '.g:multi_cursor_select_all_key.
|
||||
\' :<C-u>call multiple_cursors#select_all("v", 0)<CR>'
|
||||
endif
|
||||
|
||||
if exists('g:multi_cursor_select_all_word_key')
|
||||
exec 'nnoremap <silent> '.g:multi_cursor_select_all_word_key.
|
||||
\' :call multiple_cursors#select_all("n", 1)<CR>'
|
||||
" In Visual mode word boundary is not used
|
||||
exec 'xnoremap <silent> '.g:multi_cursor_select_all_word_key.
|
||||
\' :<C-u>call multiple_cursors#select_all("v", 0)<CR>'
|
||||
endif
|
||||
|
||||
" Commands
|
||||
command! -nargs=1 -range=% MultipleCursorsFind
|
||||
\ call multiple_cursors#find(<line1>, <line2>, <q-args>)
|
||||
|
||||
let &cpo = s:save_cpo
|
||||
unlet s:save_cpo
|
|
@ -0,0 +1,142 @@
|
|||
require 'vimrunner'
|
||||
require 'vimrunner/rspec'
|
||||
|
||||
Vimrunner::RSpec.configure do |config|
|
||||
|
||||
# Use a single Vim instance for the test suite. Set to false to use an
|
||||
# instance per test (slower, but can be easier to manage).
|
||||
config.reuse_server = false
|
||||
|
||||
# Decide how to start a Vim instance. In this block, an instance should be
|
||||
# spawned and set up with anything project-specific.
|
||||
config.start_vim do
|
||||
# vim = Vimrunner.start
|
||||
# vim = Vimrunner::Server.new("/usr/local/bin/vim").start
|
||||
|
||||
# Or, start a GUI instance:
|
||||
vim = Vimrunner.start_gvim
|
||||
|
||||
# Setup your plugin in the Vim instance
|
||||
plugin_path = File.expand_path('../..', __FILE__)
|
||||
vim.add_plugin(plugin_path, 'plugin/multiple_cursors.vim')
|
||||
|
||||
# The returned value is the Client available in the tests.
|
||||
vim
|
||||
end
|
||||
end
|
||||
|
||||
def set_file_content(string)
|
||||
string = normalize_string_indent(string)
|
||||
File.open(filename, 'w'){ |f| f.write(string) }
|
||||
vim.edit filename
|
||||
end
|
||||
|
||||
def get_file_content()
|
||||
vim.write
|
||||
IO.read(filename).strip
|
||||
end
|
||||
|
||||
def before(string)
|
||||
set_file_content(string)
|
||||
end
|
||||
|
||||
def after(string)
|
||||
get_file_content().should eq normalize_string_indent(string)
|
||||
type ":q<CR>"
|
||||
end
|
||||
|
||||
def type(string)
|
||||
string.scan(/<.*?>|./).each do |key|
|
||||
if /<.*>/.match(key)
|
||||
vim.feedkeys "\\#{key}"
|
||||
else
|
||||
vim.feedkeys key
|
||||
end
|
||||
end
|
||||
sleep 0.2
|
||||
end
|
||||
|
||||
describe "Multiple Cursors" do
|
||||
let(:filename) { 'test.txt' }
|
||||
let(:options) { [] }
|
||||
|
||||
specify "#benchmark" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
# type ':profile start /tmp/test.result<CR>'
|
||||
# type ':profile! file *multiple_cursors.vim<CR>'
|
||||
type ':let g:multi_cursor_debug_latency=1<CR>'
|
||||
|
||||
type 'VG<C-n>Vchellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello<Esc>'
|
||||
|
||||
type ':echo multiple_cursors#get_latency_debug_file()<CR>'
|
||||
sleep 3
|
||||
latency_file = vim.command 'echo multiple_cursors#get_latency_debug_file()'
|
||||
puts 'latency file = ' + latency_file
|
||||
|
||||
after <<-EOF
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello
|
||||
EOF
|
||||
end
|
||||
|
||||
end
|
|
@ -0,0 +1,977 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
require 'spec_helper'
|
||||
|
||||
def set_file_content(string)
|
||||
string = normalize_string_indent(string)
|
||||
File.open(filename, 'w'){ |f| f.write(string) }
|
||||
vim.edit filename
|
||||
end
|
||||
|
||||
def get_file_content()
|
||||
vim.write
|
||||
IO.read(filename).strip
|
||||
end
|
||||
|
||||
def before(string)
|
||||
options.each { |x| vim.command(x) }
|
||||
set_file_content(string)
|
||||
end
|
||||
|
||||
def after(string)
|
||||
expect(get_file_content()).to eq normalize_string_indent(string)
|
||||
end
|
||||
|
||||
def type(string)
|
||||
string.scan(/<.*?>|./).each do |key|
|
||||
if /<.*>/.match(key)
|
||||
vim.feedkeys "\\#{key}"
|
||||
else
|
||||
vim.feedkeys key
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "Multiple Cursors op pending & exit from insert|visual mode" do
|
||||
let(:filename) { 'test.txt' }
|
||||
let(:options) { ['let g:multi_cursor_exit_from_insert_mode = 0',
|
||||
'let g:multi_cursor_exit_from_visual_mode = 0'] }
|
||||
# the default value of g:multi_cursor_normal_maps already works
|
||||
# for testing operator-pending
|
||||
|
||||
specify "#paste from unnamed register to 3 cursors" do
|
||||
before <<-EOF
|
||||
yankme
|
||||
a b c
|
||||
a b c
|
||||
a b c
|
||||
EOF
|
||||
|
||||
type 'yiwj<C-n><C-n><C-n>vwwp<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
yankme
|
||||
a b cyankme
|
||||
a b cyankme
|
||||
a b cyankme
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#paste buffer normal caw then p" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vwcaw<Esc>bP<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
jan hello world
|
||||
feb hello world
|
||||
mar hello world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#paste buffer normal C then ABC then p" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vwCABC <Esc>p<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello ABC jan world
|
||||
hello ABC feb world
|
||||
hello ABC mar world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#paste buffer normal daw then P" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vwdawbP<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
jan hello world
|
||||
feb hello world
|
||||
mar hello world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#paste buffer normal D then P" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vwwhDbhP<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello world jan
|
||||
hello world feb
|
||||
hello world mar
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#paste buffer normal s then p" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vws1<Esc>p<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello 1jan world
|
||||
hello 1feb world
|
||||
hello 1mar world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#normal mode '0': goes to 1st char of line" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vw0dw<Esc><Esc>'
|
||||
|
||||
after <<-EOF
|
||||
jan world
|
||||
feb world
|
||||
mar world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#normal mode 'd0': deletes backward to 1st char of line" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vwd0<Esc><Esc>'
|
||||
|
||||
after <<-EOF
|
||||
jan world
|
||||
feb world
|
||||
mar world
|
||||
EOF
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "Multiple Cursors when using insert mappings" do
|
||||
let(:filename) { 'test.txt' }
|
||||
let(:options) { ['set timeoutlen=10000',
|
||||
'imap jj <esc>',
|
||||
'imap jojo dude',
|
||||
'imap jk <esc>:%s/bla/hey/g<cr>',
|
||||
'let g:multi_cursor_exit_from_insert_mode = 1',
|
||||
'let g:multi_cursor_exit_from_visual_mode = 1'] }
|
||||
specify "#mapping doing <Esc>" do
|
||||
before <<-EOF
|
||||
hello world!
|
||||
hello world!
|
||||
bla bla bla
|
||||
bla bla bla
|
||||
EOF
|
||||
|
||||
type 'w<C-n><C-n>cjjidude<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello dude!
|
||||
hello !
|
||||
bla bla bla
|
||||
bla bla bla
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#mapping doing <Esc> and running a command" do
|
||||
before <<-EOF
|
||||
hello world!
|
||||
hello world!
|
||||
bla bla bla
|
||||
bla bla bla
|
||||
EOF
|
||||
|
||||
type 'w<C-n><C-n>ctherejk'
|
||||
|
||||
after <<-EOF
|
||||
hello there!
|
||||
hello there!
|
||||
hey hey hey
|
||||
hey hey hey
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#mapping using more than 2 characters" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
bla bla bla
|
||||
bla bla bla
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>A jojo<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello dude
|
||||
hello dude
|
||||
bla bla bla
|
||||
bla bla bla
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#unused mapping" do
|
||||
before <<-EOF
|
||||
hello world!
|
||||
hello world!
|
||||
bla bla bla
|
||||
bla bla bla
|
||||
EOF
|
||||
|
||||
type 'w<C-n><C-n>chey joseph blah blah blah<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello hey joseph blah blah blah!
|
||||
hello hey joseph blah blah blah!
|
||||
bla bla bla
|
||||
bla bla bla
|
||||
EOF
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "Multiple Cursors when normal_maps is empty" do
|
||||
let(:filename) { 'test.txt' }
|
||||
let(:options) { ['let g:multi_cursor_normal_maps = {}'] }
|
||||
|
||||
# Operator-pending commands are handled correctly thanks to their inclusion
|
||||
# in `g:multi_cursor_normal_maps`.
|
||||
#
|
||||
# When an operator-pending command like 'd' is missing from that setting's
|
||||
# value, then it should result in a no-op, but we should still remain in
|
||||
# multicursor mode.
|
||||
specify "#normal mode 'd'" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>vdx<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hell
|
||||
hell
|
||||
EOF
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "Multiple Cursors when visual_maps is empty" do
|
||||
let(:filename) { 'test.txt' }
|
||||
let(:options) { ['let g:multi_cursor_visual_maps = {}'] }
|
||||
|
||||
# Operator-pending commands are handled correctly thanks to their inclusion
|
||||
# in `g:multi_cursor_visual_maps`.
|
||||
#
|
||||
# When an operator-pending command like 'f' is missing from that setting's
|
||||
# value, then it should result in a no-op, but we should still remain in
|
||||
# multicursor mode.
|
||||
specify "#visual mode 'i'" do
|
||||
before <<-EOF
|
||||
hello world x
|
||||
hello world x
|
||||
EOF
|
||||
|
||||
type 'fw<C-n><C-n>fx<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello x
|
||||
hello x
|
||||
EOF
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "Multiple Cursors when changing the line count" do
|
||||
let(:filename) { 'test.txt' }
|
||||
let(:options) { ['set backspace=indent,eol,start'] }
|
||||
|
||||
specify "#backspace on first char of the line, then carriage return" do
|
||||
before <<-EOF
|
||||
madec
|
||||
|
||||
antoine
|
||||
andre
|
||||
joseph
|
||||
EOF
|
||||
|
||||
type 'Gvip<C-n>i<BS><cr>'
|
||||
|
||||
after <<-EOF
|
||||
madec
|
||||
|
||||
antoine
|
||||
andre
|
||||
joseph
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#del at EOL, then carriage return" do
|
||||
before <<-EOF
|
||||
madec
|
||||
antoine
|
||||
joseph
|
||||
|
||||
andre
|
||||
EOF
|
||||
|
||||
type 'vip<C-n>A<DEL><cr>'
|
||||
|
||||
after <<-EOF
|
||||
madec
|
||||
antoine
|
||||
joseph
|
||||
|
||||
andre
|
||||
EOF
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "Multiple Cursors misc" do
|
||||
let(:filename) { 'test.txt' }
|
||||
let(:options) { ['set autoindent'] }
|
||||
|
||||
specify "#paste buffer normal x then p" do
|
||||
before <<-EOF
|
||||
jan
|
||||
feb
|
||||
mar
|
||||
EOF
|
||||
|
||||
type '<C-v>jj<C-n>xp<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
ajn
|
||||
efb
|
||||
amr
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#paste buffer visual y then p" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vwvelywhp<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello jan jan world
|
||||
hello feb feb world
|
||||
hello mar mar world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#paste buffer initial visual y then P" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type 'wywb<C-n><C-n><C-n>p<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
jan jan world
|
||||
jan feb world
|
||||
jan mar world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#paste buffer visual y then P" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vwvely^P<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
jan hello jan world
|
||||
feb hello feb world
|
||||
mar hello mar world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#paste buffer visual Y then P" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>vwvY^P<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello jan world
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello feb world
|
||||
hello mar world
|
||||
hello mar world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#multiline replacement" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>cworld<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
world
|
||||
world
|
||||
world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#single line replacement" do
|
||||
before <<-EOF
|
||||
hello hello hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>cworld<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
world world world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#mixed line replacement" do
|
||||
before <<-EOF
|
||||
hello hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>cworld<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
world world
|
||||
world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#new line in insert mode" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>chello<CR>world<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello
|
||||
world
|
||||
hello
|
||||
world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#new line in insert mode middle of line" do
|
||||
before <<-EOF
|
||||
hello world
|
||||
hello world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>vlxi<cr><Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello
|
||||
world
|
||||
hello
|
||||
world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#multiple new lines on one line in insert mode" do
|
||||
before <<-EOF
|
||||
'a','b','c','d','e'
|
||||
EOF
|
||||
|
||||
type 'f,v<C-n><C-n><C-n>c<CR><Esc>'
|
||||
|
||||
after <<-EOF
|
||||
'a'
|
||||
'b'
|
||||
'c'
|
||||
'd'
|
||||
'e'
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#multiple new lines on one line in insert mode with indents" do
|
||||
before <<-EOF
|
||||
'a','b','c','d','e'
|
||||
EOF
|
||||
|
||||
type '4i<Space><Esc>f,v<C-n><C-n><C-n>c<CR><Esc>:%s/^/^<CR>'
|
||||
|
||||
after <<-EOF
|
||||
^ 'a'
|
||||
^ 'b'
|
||||
^ 'c'
|
||||
^ 'd'
|
||||
^ 'e'
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#normal mode 'o'" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>voworld<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello
|
||||
world
|
||||
hello
|
||||
world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#normal mode 'O'" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>vOworld<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
world
|
||||
hello
|
||||
world
|
||||
hello
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#find command basic" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
vim.normal ':MultipleCursorsFind hello<CR>'
|
||||
type 'cworld<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
world
|
||||
world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#find command start-of-line" do
|
||||
before <<-EOF
|
||||
hello
|
||||
world
|
||||
|
||||
hello
|
||||
world
|
||||
EOF
|
||||
|
||||
vim.normal ':MultipleCursorsFind ^<CR>'
|
||||
type 'Ibegin<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
beginhello
|
||||
beginworld
|
||||
begin
|
||||
beginhello
|
||||
beginworld
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#find command end-of-line" do
|
||||
before <<-EOF
|
||||
hello
|
||||
world
|
||||
|
||||
hello
|
||||
world
|
||||
EOF
|
||||
|
||||
vim.normal ':MultipleCursorsFind $<CR>'
|
||||
type 'Iend<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
helloend
|
||||
worldend
|
||||
end
|
||||
helloend
|
||||
worldend
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual line mode replacement" do
|
||||
before <<-EOF
|
||||
hello world
|
||||
hello world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>Vchi!<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hi!
|
||||
hi!
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#skip key" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-x>cworld<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
world
|
||||
hello
|
||||
world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#prev key" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n><C-p>cworld<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
world
|
||||
world
|
||||
hello
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual mode 'i'" do
|
||||
before <<-EOF
|
||||
hi (hello world jan) bye
|
||||
hi (hello world feb) bye
|
||||
hi (hello world mar) bye
|
||||
EOF
|
||||
|
||||
type 'fw<C-n><C-n><C-n>ibcone<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hi (one) bye
|
||||
hi (one) bye
|
||||
hi (one) bye
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual mode 'a'" do
|
||||
before <<-EOF
|
||||
hi (hello world jan) bye
|
||||
hi (hello world feb) bye
|
||||
hi (hello world mar) bye
|
||||
EOF
|
||||
|
||||
type 'fw<C-n><C-n><C-n>abcone<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hi one bye
|
||||
hi one bye
|
||||
hi one bye
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual mode 'f'" do
|
||||
before <<-EOF
|
||||
hi (hello world jan) bye
|
||||
hi (hello world feb) bye
|
||||
hi (hello world mar) bye
|
||||
EOF
|
||||
|
||||
type 'fw<C-n><C-n><C-n>f)cone<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hi (hello one bye
|
||||
hi (hello one bye
|
||||
hi (hello one bye
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual mode 'F'" do
|
||||
before <<-EOF
|
||||
hi (hello world jan) bye
|
||||
hi (hello world feb) bye
|
||||
hi (hello world mar) bye
|
||||
EOF
|
||||
|
||||
type 'fw<C-n><C-n><C-n>F(cbefore<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hi beforeorld jan) bye
|
||||
hi beforeorld feb) bye
|
||||
hi beforeorld mar) bye
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual mode 't'" do
|
||||
before <<-EOF
|
||||
hello.jan
|
||||
hello hi.feb
|
||||
hello hi bye.mar
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>t.cone<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
one.jan
|
||||
one.feb
|
||||
one.mar
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual mode 'T'" do
|
||||
before <<-EOF
|
||||
jan.world
|
||||
feb.hi world
|
||||
mar.bye hi world
|
||||
EOF
|
||||
|
||||
type 'fw<C-n><C-n><C-n>T.cbefore<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
jan.beforeorld
|
||||
feb.beforeorld
|
||||
mar.beforeorld
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual line mode 'f'" do
|
||||
before <<-EOF
|
||||
hello jan world
|
||||
hello feb world
|
||||
hello mar world
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n><C-n>VfwvAafter<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello jan wafterorld
|
||||
hello feb wafterorld
|
||||
hello mar wafterorld
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual mode 'I'" do
|
||||
before <<-EOF
|
||||
hello world jan
|
||||
hello world feb
|
||||
hello world mar
|
||||
EOF
|
||||
|
||||
type 'w<C-n><C-n><C-n>Ibefore<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello beforeworld jan
|
||||
hello beforeworld feb
|
||||
hello beforeworld mar
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#visual mode 'A'" do
|
||||
before <<-EOF
|
||||
hello world jan
|
||||
hello world feb
|
||||
hello world mar
|
||||
EOF
|
||||
|
||||
type 'w<C-n><C-n><C-n>Aafter<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello worldafter jan
|
||||
hello worldafter feb
|
||||
hello worldafter mar
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#resize regions visual mode 'I'" do
|
||||
before <<-EOF
|
||||
hello world jan
|
||||
hello world feb
|
||||
hello world mar
|
||||
EOF
|
||||
|
||||
type 'w<C-n><C-n><C-n>hhhIbefore<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello beforeworld jan
|
||||
hello beforeworld feb
|
||||
hello beforeworld mar
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#resize regions visual mode 'A'" do
|
||||
before <<-EOF
|
||||
hello world jan
|
||||
hello world feb
|
||||
hello world mar
|
||||
EOF
|
||||
|
||||
type 'w<C-n><C-n><C-n>hhhAbefore<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello wobeforerld jan
|
||||
hello wobeforerld feb
|
||||
hello wobeforerld mar
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#no word boundries visual mode 'I'" do
|
||||
before <<-EOF
|
||||
hello hibye world
|
||||
hello hibye world
|
||||
hello hibye world
|
||||
EOF
|
||||
|
||||
vim.normal ':MultipleCursorsFind bye<CR>'
|
||||
type 'Ibefore<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello hibeforebye world
|
||||
hello hibeforebye world
|
||||
hello hibeforebye world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#variable-length regions visual mode 'I'" do
|
||||
before <<-EOF
|
||||
hello hii world
|
||||
hello hiiii world
|
||||
hello hiiiiii world
|
||||
EOF
|
||||
|
||||
vim.normal ':MultipleCursorsFind \<hi*\><CR>'
|
||||
type 'Ibefore<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello beforehii world
|
||||
hello beforehiiii world
|
||||
hello beforehiiiiii world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#normal mode 'I'" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>vIworld <Esc>'
|
||||
|
||||
after <<-EOF
|
||||
world hello
|
||||
world hello
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#normal mode 'A'" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>vA world<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello world
|
||||
hello world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#undo" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type '<C-n><C-n>cworld<Esc>u'
|
||||
|
||||
after <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#multiline visual mode" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type 'Vj<C-n>A world<Esc>'
|
||||
|
||||
after <<-EOF
|
||||
hello world
|
||||
hello world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#set paste mode" do
|
||||
before <<-EOF
|
||||
hello
|
||||
hello
|
||||
EOF
|
||||
|
||||
type ':set paste<CR><C-n><C-n>cworld<Esc>:set nopaste<CR>'
|
||||
|
||||
after <<-EOF
|
||||
world
|
||||
world
|
||||
EOF
|
||||
end
|
||||
|
||||
specify "#multi-byte strings" do
|
||||
before <<-EOF
|
||||
こんにちわビム
|
||||
世界の中心でビムを叫ぶ
|
||||
ビム大好き
|
||||
EOF
|
||||
|
||||
type '/ビム<CR><C-n><C-n><C-n>cヴィム<ESC>'
|
||||
|
||||
after <<-EOF
|
||||
こんにちわヴィム
|
||||
世界の中心でヴィムを叫ぶ
|
||||
ヴィム大好き
|
||||
EOF
|
||||
end
|
||||
|
||||
end
|
|
@ -0,0 +1,25 @@
|
|||
require 'vimrunner'
|
||||
require 'vimrunner/rspec'
|
||||
|
||||
Vimrunner::RSpec.configure do |config|
|
||||
|
||||
# Use a single Vim instance for the test suite. Set to false to use an
|
||||
# instance per test (slower, but can be easier to manage).
|
||||
config.reuse_server = false
|
||||
|
||||
# Decide how to start a Vim instance. In this block, an instance should be
|
||||
# spawned and set up with anything project-specific.
|
||||
config.start_vim do
|
||||
# vim = Vimrunner.start
|
||||
|
||||
# Or, start a GUI instance:
|
||||
vim = Vimrunner.start_gvim
|
||||
|
||||
# Setup your plugin in the Vim instance
|
||||
plugin_path = File.expand_path('../..', __FILE__)
|
||||
vim.add_plugin(plugin_path, 'plugin/multiple_cursors.vim')
|
||||
|
||||
# The returned value is the Client available in the tests.
|
||||
vim
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue