Permalink
Browse files

vim-repeat

  • Loading branch information...
1 parent a7087e8 commit d52330e732181ef4668fe80a133d4829c92f1810 @thomasritz committed Sep 11, 2011
Showing with 131 additions and 0 deletions.
  1. +53 −0 dot/vim/bundle/vim-repeat/README.markdown
  2. +77 −0 dot/vim/bundle/vim-repeat/autoload/repeat.vim
  3. +1 −0 dot/vim/bundles.txt
View
53 dot/vim/bundle/vim-repeat/README.markdown
@@ -0,0 +1,53 @@
+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)
+* [abolish.vim](https://github.com/tpope/vim-abolish)
+* [unimpaired.vim](https://github.com/tpope/vim-unimpaired)
+* [commentary.vim](https://github.com/tpope/vim-commentary)
+
+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
+------------
+
+If you don't have a preferred installation method, I recommend
+installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and
+then simply copy and paste:
+
+ cd ~/.vim/bundle
+ git clone git://github.com/tpope/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`.
View
77 dot/vim/bundle/vim-repeat/autoload/repeat.vim
@@ -0,0 +1,77 @@
+" repeat.vim - Let the repeat command repeat plugin maps
+" Maintainer: Tim Pope
+" Version: 1.0
+" 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.
+
+if exists("g:loaded_repeat") || &cp || v:version < 700
+ finish
+endif
+let g:loaded_repeat = 1
+
+let g:repeat_tick = -1
+
+function! repeat#set(sequence,...)
+ silent exe "norm! \"=''\<CR>p"
+ let g:repeat_sequence = a:sequence
+ let g:repeat_count = a:0 ? a:1 : v:count
+ let g:repeat_tick = b:changedtick
+endfunction
+
+function! s:repeat(count)
+ if g:repeat_tick == b:changedtick
+ let c = g:repeat_count
+ let s = g:repeat_sequence
+ let cnt = c == -1 ? "" : (a:count ? a:count : (c ? c : ''))
+ call feedkeys(cnt . s)
+ else
+ call feedkeys((a:count ? a:count : '') . '.', 'n')
+ endif
+endfunction
+
+function! s:wrap(command,count)
+ let preserve = (g:repeat_tick == b:changedtick)
+ exe 'norm! '.(a:count ? a:count : '').a:command
+ if preserve
+ let g:repeat_tick = b:changedtick
+ endif
+endfunction
+
+nnoremap <silent> . :<C-U>call <SID>repeat(v:count)<CR>
+nnoremap <silent> u :<C-U>call <SID>wrap('u',v:count)<CR>
+nnoremap <silent> U :<C-U>call <SID>wrap('U',v:count)<CR>
+nnoremap <silent> <C-R> :<C-U>call <SID>wrap("\<Lt>C-R>",v:count)<CR>
+
+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:
View
1 dot/vim/bundles.txt
@@ -7,3 +7,4 @@ git://github.com/tpope/vim-rails.git
git://github.com/tpope/vim-haml.git
git://github.com/tpope/vim-cucumber.git
git://github.com/tpope/vim-endwise.git
+git://github.com/tpope/vim-repeat.git

0 comments on commit d52330e

Please sign in to comment.