Jay Taylor's notes
back to listing indexterryma/vim-multiple-cursors
[web search]Contents
- About
- Installation
- Quick Start
- Mapping
- Settings
- Interactions with other plugins
- Highlight
- FAQ
- Contributing
- Credit
About
There have been many attempts at bringing Sublime Text's awesome 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
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:
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_exit_from_visual_mode
(Default: 1)
If set to 0, then pressing g:multi_cursor_quit_key
in Visual mode will not quit and delete all existing cursors.
Useful if you want to go back to Normal mode, and still be able to operate on all the cursors.
g:multi_cursor_exit_from_insert_mode
(Default: 1)
If set to 0, then pressing g:multi_cursor_quit_key
in Insert mode will not quit and delete all existing cursors.
Useful if you want to go back to Normal mode, and still be able to operate on all the 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, 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
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:
" 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 ALT+n doesn't seem to work in VIM but works in gVIM, why?
A This is a well known terminal/Vim issue, 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 CTRL+n doesn't seem to work in gVIM?
A Try setting set selection=inclusive
in your ~/.gvimrc
Q is it also working on Mac?
A On Mac OS, 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:
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.
Issue Creation
Contributor's time is precious and limited. Please ensure it meets the requirements outlined in 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:
cd vim-multiple-cursors/spec/ bundle exec rake
Contributors
This is a community supported project. Here is the list of all the Contributors
Credit
Obviously inspired by Sublime Text's multiple selection feature, also encouraged by Emac's multiple cursors implementation by Magnar Sveen