Tip 492 Printable Monobook Previous Next
created 2003 · complexity basic · author daniel kullmann · version 6.0
I use :CVSDiff from cvscommand.vim quite often to get an overview of the changes I made to a file.
I always want to jump from the diff to the corresponding line in the original file.
So I wrote a small script that does that, and put it in .vim/after/ftplugin/diff.vim
Pressing Enter will execute that script.
function! DiffJumpToFile() let a=line(".") " current line number let b=search("^\\(---\\|\\*\\*\\*\\) ", "b") " search for line like *** 478,489 *** let c=getline(b) " get this line as string let d=strpart(c, 4, match(c, ",")-4) " get the first line number (478) from that string let f=search("^\\(---\\|\\*\\*\\*\\) .*\\t", "b") " search for line like *** fileincvs.c .... let g=getline(f) " get this line as string let h=match (g, "\\t", 4) " look for end of filename (terminated by tab) in string let i=strpart(g, 4, h-4) " get the filename execute ":b " . i | " change to that file execute "normal " . (d+a-b-1) . "G" | " go to right line number endfunction nmap <buffer> <CR> :call DiffJumpToFile()<CR>
For the reverse operation (get a diff for the current buffer), see VimTip1030.
Comments[]
Some time ago I wrote ftplugin which does exactly that. It can jump exactly to the place where you have been looking at the diff. It supports unified diffs only so far. It supports Mercurial's a/file b/file. script#1888