summaryrefslogtreecommitdiff
path: root/start/repeat
diff options
context:
space:
mode:
Diffstat (limited to 'start/repeat')
-rw-r--r--start/repeat/README.markdown47
-rw-r--r--start/repeat/autoload/repeat.vim145
2 files changed, 192 insertions, 0 deletions
diff --git a/start/repeat/README.markdown b/start/repeat/README.markdown
new file mode 100644
index 0000000..f8b4469
--- /dev/null
+++ b/start/repeat/README.markdown
@@ -0,0 +1,47 @@
+# repeat.vim
+
+If you've ever tried using the `.` command after a plugin map, you were
+likely disappointed to discover it only repeated the last native command
+inside that map, rather than the map as a whole. That disappointment
+ends today. Repeat.vim remaps `.` in a way that plugins can tap into
+it.
+
+The following plugins support repeat.vim:
+
+* [surround.vim](https://github.com/tpope/vim-surround)
+* [speeddating.vim](https://github.com/tpope/vim-speeddating)
+* [unimpaired.vim](https://github.com/tpope/vim-unimpaired)
+* [vim-easyclip](https://github.com/svermeulen/vim-easyclip)
+
+Adding support to a plugin is generally as simple as the following
+command at the end of your map functions.
+
+ silent! call repeat#set("\<Plug>MyWonderfulMap", v:count)
+
+## Installation
+
+Install using your favorite package manager, or use Vim's built-in package
+support:
+
+ mkdir -p ~/.vim/pack/tpope/start
+ cd ~/.vim/pack/tpope/start
+ git clone https://tpope.io/vim/repeat.git
+
+## Contributing
+
+See the contribution guidelines for
+[pathogen.vim](https://github.com/tpope/vim-pathogen#readme).
+
+## Self-Promotion
+
+Like repeat.vim? Follow the repository on
+[GitHub](https://github.com/tpope/vim-repeat) and vote for it on
+[vim.org](http://www.vim.org/scripts/script.php?script_id=2136). And if
+you're feeling especially charitable, follow [tpope](http://tpo.pe/) on
+[Twitter](http://twitter.com/tpope) and
+[GitHub](https://github.com/tpope).
+
+## License
+
+Copyright (c) Tim Pope. Distributed under the same terms as Vim itself.
+See `:help license`.
diff --git a/start/repeat/autoload/repeat.vim b/start/repeat/autoload/repeat.vim
new file mode 100644
index 0000000..ce2141b
--- /dev/null
+++ b/start/repeat/autoload/repeat.vim
@@ -0,0 +1,145 @@
+" repeat.vim - Let the repeat command repeat plugin maps
+" Maintainer: Tim Pope
+" Version: 1.2
+" GetLatestVimScripts: 2136 1 :AutoInstall: repeat.vim
+
+" Installation:
+" Place in either ~/.vim/plugin/repeat.vim (to load at start up) or
+" ~/.vim/autoload/repeat.vim (to load automatically as needed).
+"
+" License:
+" Copyright (c) Tim Pope. Distributed under the same terms as Vim itself.
+" See :help license
+"
+" Developers:
+" Basic usage is as follows:
+"
+" silent! call repeat#set("\<Plug>MappingToRepeatCommand",3)
+"
+" The first argument is the mapping that will be invoked when the |.| key is
+" pressed. Typically, it will be the same as the mapping the user invoked.
+" This sequence will be stuffed into the input queue literally. Thus you must
+" encode special keys by prefixing them with a backslash inside double quotes.
+"
+" The second argument is the default count. This is the number that will be
+" prefixed to the mapping if no explicit numeric argument was given. The
+" value of the v:count variable is usually correct and it will be used if the
+" second parameter is omitted. If your mapping doesn't accept a numeric
+" argument and you never want to receive one, pass a value of -1.
+"
+" Make sure to call the repeat#set function _after_ making changes to the
+" file.
+"
+" For mappings that use a register and want the same register used on
+" repetition, use:
+"
+" silent! call repeat#setreg("\<Plug>MappingToRepeatCommand", v:register)
+"
+" This function can (and probably needs to be) called before making changes to
+" the file (as those typically clear v:register). Therefore, the call sequence
+" in your mapping will look like this:
+"
+" nnoremap <silent> <Plug>MyMap
+" \ :<C-U>silent! call repeat#setreg("\<lt>Plug>MyMap", v:register)<Bar>
+" \ call <SID>MyFunction(v:register, ...)<Bar>
+" \ silent! call repeat#set("\<lt>Plug>MyMap")<CR>
+
+if exists("g:loaded_repeat") || &cp || v:version < 700
+ finish
+endif
+let g:loaded_repeat = 1
+
+let g:repeat_tick = -1
+let g:repeat_reg = ['', '']
+
+" Special function to avoid spurious repeats in a related, naturally repeating
+" mapping when your repeatable mapping doesn't increase b:changedtick.
+function! repeat#invalidate()
+ autocmd! repeat_custom_motion
+ let g:repeat_tick = -1
+endfunction
+
+function! repeat#set(sequence,...)
+ let g:repeat_sequence = a:sequence
+ let g:repeat_count = a:0 ? a:1 : v:count
+ let g:repeat_tick = b:changedtick
+ augroup repeat_custom_motion
+ autocmd!
+ autocmd CursorMoved <buffer> let g:repeat_tick = b:changedtick | autocmd! repeat_custom_motion
+ augroup END
+endfunction
+
+function! repeat#setreg(sequence,register)
+ let g:repeat_reg = [a:sequence, a:register]
+endfunction
+
+function! repeat#run(count)
+ try
+ if g:repeat_tick == b:changedtick
+ let r = ''
+ if g:repeat_reg[0] ==# g:repeat_sequence && !empty(g:repeat_reg[1])
+ if g:repeat_reg[1] ==# '='
+ " This causes a re-evaluation of the expression on repeat, which
+ " is what we want.
+ let r = '"=' . getreg('=', 1) . "\<CR>"
+ else
+ let r = '"' . g:repeat_reg[1]
+ endif
+ endif
+
+ let c = g:repeat_count
+ let s = g:repeat_sequence
+ let cnt = c == -1 ? "" : (a:count ? a:count : (c ? c : ''))
+ if ((v:version == 703 && has('patch100')) || (v:version == 704 && !has('patch601')))
+ exe 'norm ' . r . cnt . s
+ else
+ call feedkeys(s, 'i')
+ call feedkeys(r . cnt, 'ni')
+ endif
+ else
+ if ((v:version == 703 && has('patch100')) || (v:version == 704 && !has('patch601')))
+ exe 'norm! '.(a:count ? a:count : '') . '.'
+ else
+ call feedkeys((a:count ? a:count : '') . '.', 'ni')
+ endif
+ endif
+ catch /^Vim(normal):/
+ return 'echoerr v:errmsg'
+ endtry
+ return ''
+endfunction
+
+function! repeat#wrap(command,count)
+ let preserve = (g:repeat_tick == b:changedtick)
+ call feedkeys((a:count ? a:count : '').a:command, 'n')
+ exe (&foldopen =~# 'undo\|all' ? 'norm! zv' : '')
+ if preserve
+ let g:repeat_tick = b:changedtick
+ endif
+endfunction
+
+nnoremap <silent> <Plug>(RepeatDot) :<C-U>exe repeat#run(v:count)<CR>
+nnoremap <silent> <Plug>(RepeatUndo) :<C-U>call repeat#wrap('u',v:count)<CR>
+nnoremap <silent> <Plug>(RepeatUndoLine) :<C-U>call repeat#wrap('U',v:count)<CR>
+nnoremap <silent> <Plug>(RepeatRedo) :<C-U>call repeat#wrap("\<Lt>C-R>",v:count)<CR>
+
+if !hasmapto('<Plug>(RepeatDot)', 'n')
+ nmap . <Plug>(RepeatDot)
+endif
+if !hasmapto('<Plug>(RepeatUndo)', 'n')
+ nmap u <Plug>(RepeatUndo)
+endif
+if maparg('U','n') ==# '' && !hasmapto('<Plug>(RepeatUndoLine)', 'n')
+ nmap U <Plug>(RepeatUndoLine)
+endif
+if !hasmapto('<Plug>(RepeatRedo)', 'n')
+ nmap <C-R> <Plug>(RepeatRedo)
+endif
+
+augroup repeatPlugin
+ autocmd!
+ autocmd BufLeave,BufWritePre,BufReadPre * let g:repeat_tick = (g:repeat_tick == b:changedtick || g:repeat_tick == 0) ? 0 : -1
+ autocmd BufEnter,BufWritePost * if g:repeat_tick == 0|let g:repeat_tick = b:changedtick|endif
+augroup END
+
+" vim:set ft=vim et sw=4 sts=4: