From 0d23b6e515a01a5782532351821ebfa11f3d6cf2 Mon Sep 17 00:00:00 2001 From: Ben Beltran Date: Mon, 8 Oct 2012 11:44:10 -0500 Subject: Add vim again :) --- vim/plugin/unimpaired.vim | 315 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 vim/plugin/unimpaired.vim (limited to 'vim/plugin/unimpaired.vim') diff --git a/vim/plugin/unimpaired.vim b/vim/plugin/unimpaired.vim new file mode 100644 index 0000000..60b6c02 --- /dev/null +++ b/vim/plugin/unimpaired.vim @@ -0,0 +1,315 @@ +" unimpaired.vim - Pairs of handy bracket mappings +" Maintainer: Tim Pope +" Version: 1.1 +" GetLatestVimScripts: 1590 1 :AutoInstall: unimpaired.vim + +if exists("g:loaded_unimpaired") || &cp || v:version < 700 + finish +endif +let g:loaded_unimpaired = 1 + +" Next and previous {{{1 + +function! s:MapNextFamily(map,cmd) + let map = 'unimpaired'.toupper(a:map) + let end = ' ".(v:count ? v:count : "")' + execute 'nmap '.map.'Previous :exe "'.a:cmd.'previous'.end + execute 'nmap '.map.'Next :exe "'.a:cmd.'next'.end + execute 'nmap '.map.'First :exe "'.a:cmd.'first'.end + execute 'nmap '.map.'Last :exe "'.a:cmd.'last'.end + execute 'nmap ['. a:map .' '.map.'Previous' + execute 'nmap ]'. a:map .' '.map.'Next' + execute 'nmap ['.toupper(a:map).' '.map.'First' + execute 'nmap ]'.toupper(a:map).' '.map.'Last' +endfunction + +call s:MapNextFamily('a','') +call s:MapNextFamily('b','b') +call s:MapNextFamily('l','l') +call s:MapNextFamily('q','c') +call s:MapNextFamily('t','t') + +function! s:entries(path) + let path = substitute(a:path,'[\\/]$','','') + let files = split(glob(path."/.*"),"\n") + let files += split(glob(path."/*"),"\n") + call map(files,'substitute(v:val,"[\\/]$","","")') + call filter(files,'v:val !~# "[\\\\/]\\.\\.\\=$"') + call filter(files,'v:val[-4:-1] !=# ".swp" && v:val[-1:-1] !=# "~"') + return files +endfunction + +function! s:FileByOffset(num) + let file = expand('%:p') + let num = a:num + while num + let files = s:entries(fnamemodify(file,':h')) + if a:num < 0 + call reverse(sort(filter(files,'v:val < file'))) + else + call sort(filter(files,'v:val > file')) + endif + let temp = get(files,0,'') + if temp == '' + let file = fnamemodify(file,':h') + else + let file = temp + while isdirectory(file) + let files = s:entries(file) + if files == [] + " TODO: walk back up the tree and continue + break + endif + let file = files[num > 0 ? 0 : -1] + endwhile + let num += num > 0 ? -1 : 1 + endif + endwhile + return file +endfunction + +nnoremap unimpairedONext :edit `=FileByOffset(v:count1)` +nnoremap unimpairedOPrevious :edit `=FileByOffset(-v:count1)` + +nmap ]o unimpairedONext +nmap [o unimpairedOPrevious + +nmap [, :call search('^[<=>]\{7\}','bW') +nmap ], :call search('^[<=>]\{7\}','W') +omap [, V:call search('^[<=>]\{7\}','bW') +omap ], V:call search('^[<=>]\{7\}','W') +xmap [, :exe 'norm! gv'call search('^[<=>]\{7\}','bW') +xmap ], :exe 'norm! gv'call search('^[<=>]\{7\}','W') +nmap [< :call search('^<<<<<<<','bW') +nmap [= :call search('^=======','bW') +nmap [> :call search('^>>>>>>>','bW') +nmap ]< :call search('^<<<<<<<','W') +nmap ]= :call search('^=======','W') +nmap ]> :call search('^>>>>>>>','W') +xmap [< :exe 'norm! gv'call search('^<<<<<<<','bW') +xmap [= :exe 'norm! gv'call search('^=======','bW') +xmap [> :exe 'norm! gv'call search('^>>>>>>>','bW') +xmap ]< :exe 'norm! gv'call search('^<<<<<<<','W') +xmap ]= :exe 'norm! gv'call search('^=======','W') +xmap ]> :exe 'norm! gv'call search('^>>>>>>>','W') +omap [< V:call search('^<<<<<<<','bW') +omap [= V:call search('^=======','bW') +omap [> V:call search('^>>>>>>>','bW') +omap ]< V:call search('^<<<<<<<','W') +omap ]= V:call search('^=======','W') +omap ]> V:call search('^>>>>>>>','W') + +" }}}1 +" Line operations {{{1 + +function! s:BlankUp(count) abort + put!=repeat(nr2char(10), a:count) + ']+1 + silent! call repeat#set("\unimpairedBlankUp", a:count) +endfunction + +function! s:BlankDown(count) abort + put =repeat(nr2char(10), a:count) + '[-1 + silent! call repeat#set("\unimpairedBlankDown", a:count) +endfunction + +nnoremap unimpairedBlankUp :call BlankUp(v:count1) +nnoremap unimpairedBlankDown :call BlankDown(v:count1) + +nmap [ unimpairedBlankUp +nmap ] unimpairedBlankDown + +function! s:Move(cmd, count, map) abort + normal! m` + exe 'move'.a:cmd.a:count + norm! `` + call repeat#set("\unimpairedMove".a:map, a:count) +endfunction + +nnoremap unimpairedMoveUp :call Move('--',v:count1,'Up') +nnoremap unimpairedMoveDown :call Move('+',v:count1,'Down') +xnoremap unimpairedMoveUp :exe 'normal! m`'exe '''<,''>move--'.v:count1`` +xnoremap unimpairedMoveDown :exe 'normal! m`'exe '''<,''>move''>+'.v:count1`` + +nmap [e unimpairedMoveUp +nmap ]e unimpairedMoveDown +xmap [e unimpairedMoveUp +xmap ]e unimpairedMoveDown + +" }}}1 +" Encoding and decoding {{{1 + +function! s:StringEncode(str) + let map = {"\n": 'n', "\r": 'r', "\t": 't', "\b": 'b', "\f": '\f', '"': '"', '\': '\'} + return substitute(a:str,"[\001-\033\\\\\"]",'\="\\".get(map,submatch(0),printf("%03o",char2nr(submatch(0))))','g') +endfunction + +function! s:StringDecode(str) + let map = {'n': "\n", 'r': "\r", 't': "\t", 'b': "\b", 'f': "\f", 'e': "\e", 'a': "\001", 'v': "\013"} + let str = a:str + if str =~ '^\s*".\{-\}\\\@','\>','g') + let str = substitute(str,'"','\"','g') + return str +endfunction + +function! s:XmlEntityDecode(str) + let str = substitute(a:str,'\c&#\%(0*38\|x0*26\);','&','g') + let str = substitute(str,'\c&#\(\d\+\);','\=nr2char(submatch(1))','g') + let str = substitute(str,'\c&#\(x\x\+\);','\=nr2char("0".submatch(1))','g') + let str = substitute(str,'\c'',"'",'g') + let str = substitute(str,'\c"','"','g') + let str = substitute(str,'\c>','>','g') + let str = substitute(str,'\c<','<','g') + let str = substitute(str,'\C&\(\%(amp;\)\@!\w*\);','\=nr2char(get(g:unimpaired_html_entities,submatch(1),63))','g') + return substitute(str,'\c&','\&','g') +endfunction + +function! s:XmlDecode(str) + let str = substitute(a:str,'<\%([[:alnum:]-]\+=\%("[^"]*"\|''[^'']*''\)\|.\)\{-\}>','','g') + return s:XmlEntityDecode(str) +endfunction + +function! s:Transform(algorithm,type) + let sel_save = &selection + let cb_save = &clipboard + set selection=inclusive clipboard-=unnamed clipboard-=unnamedplus + let reg_save = @@ + if a:type =~ '^\d\+$' + silent exe 'norm! ^v'.a:type.'$hy' + elseif a:type =~ '^.$' + silent exe "normal! `<" . a:type . "`>y" + elseif a:type == 'line' + silent exe "normal! '[V']y" + elseif a:type == 'block' + silent exe "normal! `[\`]y" + else + silent exe "normal! `[v`]y" + endif + let @@ = s:{a:algorithm}(@@) + norm! gvp + let @@ = reg_save + let &selection = sel_save + let &clipboard = cb_save + if a:type =~ '^\d\+$' + silent! call repeat#set("\unimpairedLine".a:algorithm,a:type) + endif +endfunction + +function! s:TransformOpfunc(type) + return s:Transform(s:encode_algorithm, a:type) +endfunction + +function! s:TransformSetup(algorithm) + let s:encode_algorithm = a:algorithm + let &opfunc = matchstr(expand(''), '\d\+_').'TransformOpfunc' +endfunction + +function! s:MapTransform(algorithm, key) + exe 'nnoremap unimpaired' .a:algorithm.' :call TransformSetup("'.a:algorithm.'")g@' + exe 'xnoremap unimpaired' .a:algorithm.' :call Transform("'.a:algorithm.'",visualmode())' + exe 'nnoremap unimpairedLine'.a:algorithm.' :call Transform("'.a:algorithm.'",v:count1)' + exe 'nmap '.a:key.' unimpaired'.a:algorithm + exe 'xmap '.a:key.' unimpaired'.a:algorithm + exe 'nmap '.a:key.a:key[strlen(a:key)-1].' unimpairedLine'.a:algorithm +endfunction + +call s:MapTransform('StringEncode','[y') +call s:MapTransform('StringDecode',']y') +call s:MapTransform('UrlEncode','[u') +call s:MapTransform('UrlDecode',']u') +call s:MapTransform('XmlEncode','[x') +call s:MapTransform('XmlDecode',']x') + +" }}}1 + +" vim:set sw=2 sts=2: -- cgit