summaryrefslogtreecommitdiffstats
path: root/vim/plugin/diff.vim
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2017-10-29 16:01:43 -0400
committerJesse Luehrs <doy@tozt.net>2017-10-29 19:03:53 -0400
commitd9fd53a62b8fe7698400610d81456e5e3d9461ef (patch)
treefb76c6f3a6da79ec38e693ecb10b346afe9557d6 /vim/plugin/diff.vim
parentc8b741e677788b77357c47ee1573f9ffd636c368 (diff)
downloadconf-d9fd53a62b8fe7698400610d81456e5e3d9461ef.tar.gz
conf-d9fd53a62b8fe7698400610d81456e5e3d9461ef.zip
pull a bunch of self-contained things out of my vimrc
Diffstat (limited to 'vim/plugin/diff.vim')
-rw-r--r--vim/plugin/diff.vim68
1 files changed, 68 insertions, 0 deletions
diff --git a/vim/plugin/diff.vim b/vim/plugin/diff.vim
new file mode 100644
index 0000000..8c4f44a
--- /dev/null
+++ b/vim/plugin/diff.vim
@@ -0,0 +1,68 @@
+let s:foldmethod = &foldmethod
+let s:foldenable = &foldenable
+let s:diffwindow = 0
+
+function! s:diffstart(read_cmd)
+ if s:diffwindow != 0
+ return
+ endif
+ let s:foldmethod = &foldmethod
+ let s:foldenable = &foldenable
+ let l:filetype = &filetype
+ vert new
+ let s:diffwindow = winnr()
+ set buftype=nofile
+ try
+ exe a:read_cmd
+ catch /.*/
+ echohl ErrorMsg
+ echo v:exception
+ echohl NONE
+ call s:diffstop()
+ return
+ endtry
+ let &filetype = l:filetype
+ diffthis
+ wincmd p
+ diffthis
+ " why does this not happen automatically?
+ normal! zM
+endfunction
+
+function! s:diffstop()
+ if s:diffwindow == 0
+ return
+ endif
+ diffoff!
+ exe s:diffwindow . 'wincmd w'
+ bdelete
+ let &foldmethod = s:foldmethod
+ let &foldenable = s:foldenable
+ if &foldenable
+ normal! zv
+ endif
+ let s:diffwindow = 0
+endfunction
+
+function! s:vcs_orig(file)
+ " XXX: would be nice to use a:file rather than # here...
+ let l:dir = expand('#:p:h')
+ if filewritable(l:dir . '/.svn') == 2
+ return system('svn cat ' . a:file)
+ elseif filewritable(l:dir . '/CVS') == 2
+ return system("AFILE=" . a:file . "; MODFILE=`tempfile`; DIFF=`tempfile`; cp $AFILE $MODFILE && cvs diff -u $AFILE > $DIFF; patch -R $MODFILE $DIFF 2>&1 > /dev/null && cat $MODFILE; rm $MODFILE $DIFF")
+ elseif finddir('_darcs', l:dir . ';') =~# '_darcs'
+ return system('darcs show contents ' . a:file)
+ elseif finddir('.git', l:dir . ';') =~# '.git'
+ let l:prefix = system('git rev-parse --show-prefix')
+ let l:prefix = substitute(l:prefix, '\n', '', 'g')
+ let l:cmd = 'git show HEAD:'.l:prefix.a:file
+ return system(l:cmd)
+ else
+ throw 'No VCS directory found'
+ endif
+endfunction
+
+nnoremap <silent>ds :call <SID>diffstart('read # <bar> normal! ggdd')<CR>
+nnoremap <silent>dc :call <SID>diffstart('call append(0, split(s:vcs_orig(expand("#:.")), "\n", 1)) <bar> normal! Gdddd')<CR>
+nnoremap <silent>de :call <SID>diffstop()<CR>