Compare commits

..

No commits in common. "master" and "v1.2" have entirely different histories.
master ... v1.2

2 changed files with 44 additions and 49 deletions

View file

@ -1,4 +1,5 @@
# repeat.vim repeat.vim
==========
If you've ever tried using the `.` command after a plugin map, you were 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 likely disappointed to discover it only repeated the last native command
@ -10,30 +11,34 @@ The following plugins support repeat.vim:
* [surround.vim](https://github.com/tpope/vim-surround) * [surround.vim](https://github.com/tpope/vim-surround)
* [speeddating.vim](https://github.com/tpope/vim-speeddating) * [speeddating.vim](https://github.com/tpope/vim-speeddating)
* [abolish.vim](https://github.com/tpope/vim-abolish)
* [unimpaired.vim](https://github.com/tpope/vim-unimpaired) * [unimpaired.vim](https://github.com/tpope/vim-unimpaired)
* [commentary.vim](https://github.com/tpope/vim-commentary)
* [vim-easyclip](https://github.com/svermeulen/vim-easyclip) * [vim-easyclip](https://github.com/svermeulen/vim-easyclip)
* [vim-radical](https://github.com/glts/vim-radical)
Adding support to a plugin is generally as simple as the following Adding support to a plugin is generally as simple as the following
command at the end of your map functions. command at the end of your map functions.
silent! call repeat#set("\<Plug>MyWonderfulMap", v:count) silent! call repeat#set("\<Plug>MyWonderfulMap", v:count)
## Installation Installation
------------
Install using your favorite package manager, or use Vim's built-in package If you don't have a preferred installation method, I recommend
support: installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and
then simply copy and paste:
mkdir -p ~/.vim/pack/tpope/start cd ~/.vim/bundle
cd ~/.vim/pack/tpope/start git clone git://github.com/tpope/vim-repeat.git
git clone https://tpope.io/vim/repeat.git
## Contributing Contributing
------------
See the contribution guidelines for See the contribution guidelines for
[pathogen.vim](https://github.com/tpope/vim-pathogen#readme). [pathogen.vim](https://github.com/tpope/vim-pathogen#readme).
## Self-Promotion Self-Promotion
--------------
Like repeat.vim? Follow the repository on Like repeat.vim? Follow the repository on
[GitHub](https://github.com/tpope/vim-repeat) and vote for it on [GitHub](https://github.com/tpope/vim-repeat) and vote for it on
@ -42,7 +47,8 @@ you're feeling especially charitable, follow [tpope](http://tpo.pe/) on
[Twitter](http://twitter.com/tpope) and [Twitter](http://twitter.com/tpope) and
[GitHub](https://github.com/tpope). [GitHub](https://github.com/tpope).
## License License
-------
Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. Copyright (c) Tim Pope. Distributed under the same terms as Vim itself.
See `:help license`. See `:help license`.

View file

@ -40,11 +40,11 @@
" in your mapping will look like this: " in your mapping will look like this:
" "
" nnoremap <silent> <Plug>MyMap " nnoremap <silent> <Plug>MyMap
" \ :<C-U>execute 'silent! call repeat#setreg("\<lt>Plug>MyMap", v:register)'<Bar> " \ :<C-U>silent! call repeat#setreg("\<lt>Plug>MyMap", v:register)<Bar>
" \ call <SID>MyFunction(v:register, ...)<Bar> " \ call <SID>MyFunction(v:register, ...)<Bar>
" \ silent! call repeat#set("\<lt>Plug>MyMap")<CR> " \ silent! call repeat#set("\<lt>Plug>MyMap")<CR>
if exists("g:loaded_repeat") || &cp || v:version < 800 if exists("g:loaded_repeat") || &cp || v:version < 700
finish finish
endif endif
let g:loaded_repeat = 1 let g:loaded_repeat = 1
@ -73,66 +73,55 @@ function! repeat#setreg(sequence,register)
let g:repeat_reg = [a:sequence, a:register] let g:repeat_reg = [a:sequence, a:register]
endfunction endfunction
function! s:default_register()
let values = split(&clipboard, ',')
if index(values, 'unnamedplus') != -1
return '+'
elseif index(values, 'unnamed') != -1
return '*'
else
return '"'
endif
endfunction
function! repeat#run(count) function! repeat#run(count)
let s:errmsg = ''
try try
if g:repeat_tick == b:changedtick if g:repeat_tick == b:changedtick
let r = '' let r = ''
if g:repeat_reg[0] ==# g:repeat_sequence && !empty(g:repeat_reg[1]) if g:repeat_reg[0] ==# g:repeat_sequence && !empty(g:repeat_reg[1])
" Take the original register, unless another (non-default, we if g:repeat_reg[1] ==# '='
" unfortunately cannot detect no vs. a given default register)
" register has been supplied to the repeat command (as an
" explicit override).
let regname = v:register ==# s:default_register() ? g:repeat_reg[1] : v:register
if regname ==# '='
" This causes a re-evaluation of the expression on repeat, which " This causes a re-evaluation of the expression on repeat, which
" is what we want. " is what we want.
let r = '"=' . getreg('=', 1) . "\<CR>" let r = '"=' . getreg('=', 1) . "\<CR>"
else else
let r = '"' . regname let r = '"' . g:repeat_reg[1]
endif endif
endif endif
let c = g:repeat_count let c = g:repeat_count
let s = g:repeat_sequence let s = g:repeat_sequence
let cnt = c == -1 ? "" : (a:count ? a:count : (c ? c : '')) let cnt = c == -1 ? "" : (a:count ? a:count : (c ? c : ''))
call feedkeys(s, 'i') if ((v:version == 703 && has('patch100')) || (v:version == 704 && !has('patch601')))
call feedkeys(r . cnt, 'ni') exe 'norm ' . r . cnt . s
else
call feedkeys(s, 'i')
call feedkeys(r . cnt, 'ni')
endif
else else
call feedkeys((a:count ? a:count : '') . '.', 'ni') 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 endif
catch /^Vim(normal):/ catch /^Vim(normal):/
let s:errmsg = v:errmsg return 'echoerr v:errmsg'
return 0
endtry endtry
return 1 return ''
endfunction
function! repeat#errmsg()
return s:errmsg
endfunction endfunction
function! repeat#wrap(command,count) function! repeat#wrap(command,count)
let foldopen = &foldopen =~# 'undo\|all' ? 'zv' : '' let preserve = (g:repeat_tick == b:changedtick)
let preserve = g:repeat_tick == b:changedtick ? ":let g:repeat_tick = b:changedtick\r" : '' call feedkeys((a:count ? a:count : '').a:command, 'n')
return (a:count ? a:count : '') . a:command . preserve . foldopen exe (&foldopen =~# 'undo\|all' ? 'norm! zv' : '')
if preserve
let g:repeat_tick = b:changedtick
endif
endfunction endfunction
nnoremap <silent> <Plug>(RepeatDot) :<C-U>if !repeat#run(v:count)<Bar>echoerr repeat#errmsg()<Bar>endif<CR> nnoremap <silent> <Plug>(RepeatDot) :<C-U>exe repeat#run(v:count)<CR>
nmap <silent><expr><script> <Plug>(RepeatUndo) repeat#wrap('u',v:count) nnoremap <silent> <Plug>(RepeatUndo) :<C-U>call repeat#wrap('u',v:count)<CR>
nmap <silent><expr><script> <Plug>(RepeatUndoLine) repeat#wrap('U',v:count) nnoremap <silent> <Plug>(RepeatUndoLine) :<C-U>call repeat#wrap('U',v:count)<CR>
nmap <silent><expr><script> <Plug>(RepeatRedo) repeat#wrap("\022",v:count) nnoremap <silent> <Plug>(RepeatRedo) :<C-U>call repeat#wrap("\<Lt>C-R>",v:count)<CR>
if !hasmapto('<Plug>(RepeatDot)', 'n') if !hasmapto('<Plug>(RepeatDot)', 'n')
nmap . <Plug>(RepeatDot) nmap . <Plug>(RepeatDot)