| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- *visualrepeat.txt* Repeat command extended to visual mode.
- VISUALREPEAT by Ingo Karkat
- *visualrepeat.vim*
- description |visualrepeat-description|
- usage |visualrepeat-usage|
- installation |visualrepeat-installation|
- integration |visualrepeat-integration|
- limitations |visualrepeat-limitations|
- known problems |visualrepeat-known-problems|
- todo |visualrepeat-todo|
- history |visualrepeat-history|
- ==============================================================================
- DESCRIPTION *visualrepeat-description*
- This plugin defines repetition of Vim built-in normal mode commands via |.|
- for visual mode. Additionally, it offers functions like the popular repeat.vim
- plugin that allow mappings to be repeated in visual mode, too.
- VISUAL MODE REPETITION *
- This extends the built-in normal mode repeat |.| to visual mode.
- VISUAL MODE MAPPING REPETITION *
- Like with repeat.vim for normal mode, visual mode mappings can register a
- <Plug> mapping to be used for visual mode repetition.
- Likewise, normal mode mappings can (in addition to the repeat.vim registration
- of a normal mode mapping) register a visual mode mapping with visualrepeat.vim
- that will be repeated in visual mode.
- Operator-pending mappings end with |g@| and repeat naturally; i.e. Vim
- re-applies the 'opfunc' on the equivalent text (but at the current cursor
- position). But without a call to repeat#set(), it is impossible to repeat this
- operator-pending mapping to the current visual selection. Plugins cannot call
- repeat#set() in their operator-pending mapping, because then Vim's built-in
- repeat would be circumvented, the full mapping ending with g@ would be
- re-executed, and the repetition would then wait for the {motion}, what is not
- wanted.
- Therefore, this plugin offers a separate visualrepeat#set() function that can
- be invoked for operator-pending mappings. It can also be invoked for
- normal-mode mappings that have already called repeat#set(), and may override
- that mapping with a special repeat mapping for visual mode repeats. Together
- with the remapped {Visual}. command, this allows repetition - similar to what
- the built-in Vim commands do - across normal, operator-pending and visual
- mode.
- SOURCE *
- - Based on vimtip #1142, Repeat last command and put cursor at start of change
- http://vim.wikia.com/wiki/Repeat_last_command_and_put_cursor_at_start_of_change
- - The client interface and implementation has been based on repeat.vim
- (vimscript #2136) by Tim Pope.
- RELATED WORKS *
- - repeat.vim (vimscript #2136) has been the basis for this plugin and should
- be used in conjunction with visualrepeat.vim. (Otherwise, you'd have visual
- mode repeat, but no repeat in normal mode.)
- ==============================================================================
- USAGE *visualrepeat-usage*
- *v_.*
- {Visual}. Repeat last change in all visually selected lines.
- - characterwise: Start from cursor position.
- - linewise: Each line separately, starting from the
- current column (usually the first in this mode).
- - blockwise: Only the selected text. This is
- implemented by temporarily duplicating the selection
- to separate lines and repeating over those, starting
- from the first column.
- Note: If the last normal mode command included a
- {motion} (e.g. g~e), the repetition will also move
- exactly over this {motion}, NOT the visual selection!
- It is thus best to repeat commands that work on the
- entire line (e.g. g~$).
- ==============================================================================
- INSTALLATION *visualrepeat-installation*
- This script is packaged as a |vimball|. If you have the "gunzip" decompressor
- in your PATH, simply edit the *.vmb.gz package in Vim; otherwise, decompress
- the archive first, e.g. using WinZip. Inside Vim, install by sourcing the
- vimball or via the |:UseVimball| command. >
- vim visualrepeat*.vmb.gz
- :so %
- To uninstall, use the |:RmVimball| command.
- DEPENDENCIES *visualrepeat-dependencies*
- - Requires Vim 7.0 or higher.
- - repeat.vim (vimscript #2136) plugin (highly recommended)
- - |ingo-library.vim| plugin (vimscript #4433), version 1.013 or higher;
- optional, for blockwise repeat only
- ==============================================================================
- INTEGRATION *visualrepeat-integration*
- This plugin is meant to be used together with repeat.vim.
- This plugin has helper functions that plugins with cross-repeat functionality
- can use in their normal mode repeat mappings of repeated visual mode mappings.
- With this, you save work and allow for a consistent user experience.
- Define your normal mode repeat mapping like this: >
- nnoremap <silent> <Plug>(MyPluginVisual)
- \ :<C-u>execute 'normal!' visualrepeat#reapply#VisualMode(0)<Bar>
- \call MyPlugin#Operator('visual', "\<lt>Plug>(MyPluginVisual)")<CR>
- If your plugin uses a passed [count] (i.e. the count is not only used to
- determine the text area the mapping is applied to), you need to define a
- mapping: >
- vnoremap <silent> <expr> <SID>(ReapplyRepeatCount) visualrepeat#reapply#RepeatCount()
- and apply the function followed by the mapping like this: >
- nnoremap <silent> <script> <Plug>(MyPluginVisual)
- \ :<C-u>execute 'normal!' visualrepeat#reapply#VisualMode(1)<CR>
- \<SID>(ReapplyRepeatCount)
- \:<C-u>call MyPlugin#Operator('visual', v:count, "\<lt>Plug>(MyPluginVisual)")<CR>
- If you want to support running without visualrepeat.vim, too, provide a
- wrapper that defaults to |1v|: >
- function! s:VisualMode()
- let l:keys = "1v\<Esc>"
- silent! let l:keys = visualrepeat#reapply#VisualMode(0)
- return l:keys
- endfunction
- nnoremap <silent> <Plug>(MyPluginVisual)
- \ :<C-u>execute 'normal!' <SID>VisualMode()<Bar>
- \call MyPlugin#Operator('visual', "\<lt>Plug>(MyPluginVisual)")<CR>
- <
- ==============================================================================
- LIMITATIONS *visualrepeat-limitations*
- KNOWN PROBLEMS *visualrepeat-known-problems*
- TODO *visualrepeat-todo*
- IDEAS *visualrepeat-ideas*
- ==============================================================================
- HISTORY *visualrepeat-history*
- 1.30 15-Nov-2013
- - ENH: When repeating over multiple lines / a blockwise selection, keep track
- of added or deleted lines, and only repeat exactly on the selected lines.
- Thanks to Israel Chauca for sending a patch!
- - When a repeat on a blockwise selection has introduced additional lines,
- append those properly indented instead of omitting them.
- - With linewise and blockwise repeat, set the change marks '[,'] to the
- changed selection. With the latter, one previously got "E19: Mark has
- invalid line number" due to the removed temporary range.
- 1.20 14-Nov-2013
- - ENH: Implement blockwise repeat through temporarily moving the block to a
- temporary range at the end of the buffer, like the vis.vim plugin. This
- feature requires the ingo-library. *** You need to separately install
- ingo-library (vimscript #4433) version 1.013 (or higher)! ***
- 1.10 05-Sep-2013
- - Check for existence of actual visual mode mapping; do not accept a select
- mode mapping, because we're applying it to a visual selection.
- - Pass through a [count] to the :normal . command.
- - Add visualrepeat#reapply#VisualMode() and visualrepeat#reapply#RepeatCount()
- helper functions that plugins can use in their normal mode repeat mappings
- of repeated visual mode mappings.
- - Minor: Make substitute() robust against 'ignorecase'.
- - ENH: Use the current cursor virtual column when repeating in linewise visual
- mode. Inspired by
- http://stackoverflow.com/questions/18610564/vim-is-possible-to-use-dot-command-in-visual-block-mode
- - Abort further commands on error by using echoerr inside the mapping.
- 1.03 21-Feb-2013
- REGRESSION: Fix in 1.02 does not repeat recorded register when the mappings in
- repeat.vim and visualrepeat.vim differ.
- 1.02 27-Dec-2012
- BUG: "E121: Undefined variable: g:repeat_sequence" when using visual repeat of
- a mapping using registers without having used repeat.vim beforehand.
- 1.01 05-Apr-2012
- FIX: Avoid error about undefined g:repeat_reg when (a proper version of)
- repeat.vim isn't available.
- 1.00 14-Dec-2011
- First published version.
- 0.01 17-Mar-2011
- Split off into dedicated plugin.
- 0.00 30-Jul-2008
- Started development.
- ==============================================================================
- Copyright: (C) 2008-2013 Ingo Karkat
- The VIM LICENSE applies to this plugin; see |copyright|.
- Maintainer: Ingo Karkat <ingo@karkat.de>
- ==============================================================================
- vim:tw=78:ts=8:ft=help:norl:
|