46

How can I use vimdiff to view the differences described in a diff file?

user14437
  • 3,130
  • 5
  • 21
  • 13

4 Answers4

58

Instead of using /usr/bin/vimdiff command, try this:

$ vim file
:vertical diffpatch path/to/diff

(:vert diffpa for short.)
This is equivalent to calling vimdiff on the original file and the subsequently patched file, but vim calls patch on a temporary file for you.

Edit

If you want vim's diff-mode to be entered automatically, use this:

$ vim file +'vert diffpa path/to/diff'

where +command asks vim to execute "command". (+123 jumps to line 123, +/abc jumps to the first match for "abc", it's all documented.)

Regarding Ken's query: if the diff file includes hunks applying to files other than the file you're currently editing, no worries; vim calls the patch executable underneath, which will ask for the locations of these mysteriously missing files, and you can tell patch to just skip those hunks.

ephemient
  • 198,619
  • 38
  • 280
  • 391
  • 2
    nice! But you should maybe warn about the risk of side-effects if the file contains diffs for other files? – Ken Oct 29 '08 at 17:31
  • That works great for a single file. Thanks! I didn't know about diffpatch. – Adam Monsen Nov 12 '10 at 22:35
  • Is there a way to do this without having to save the diff file to disk? Something like: `:vert diffpatch - !git diff file`? (I know there are better solutions for `git diff` specifically, but I'm curious if this is possible in general) – mwcz Jun 07 '13 at 14:35
3

Coming from the other direction. I wrote a Vim plugin that shows the changes that have been made to a file since the last save in either vimdiff or unified diff format.

Get it here: diffchanges.vim

Jeremy Cantrell
  • 26,392
  • 13
  • 55
  • 78
2

Make a copy of the original file, apply the diff and then

vimdiff original_file patched_file

You could also look at vim.org scripts which have been written to deal with svn diff output. If you are generating your diff from a version control system then take a look at the vcscommand.vim : CVS/SVN/SVK/git integration plugin.

Ken
  • 77,016
  • 30
  • 84
  • 101
1

Would you say more about why you want to use vimdiff for this?

For instance, do you want to visualize per-character differences in a (unified) diff file?. If so, someone answered my question about same with a suggestion to basically just fire up emacs on the diff and hit ALT-n to cycle through hunks, nicely highlighting per-word or per-characters changes along the way (similar to vimdiff). It works well, but it's a bummer to fire up emacs just to do this. I only know enough emacs to do that then exit without mucking up the patch. :)

Anyway, the emacs answer gave me some ideas. I'm sure Vim can be cajoled into providing better highlighting for diff files, maybe something more like ediff. I looked into this a while back, and someone on the vim user list had the excellent suggestion to incorporate google-diff-match-patch. The Python interface could be used from a Python Vim ftplugin, for instance.

Sorry about using an "answer" to reply when this may not be a great answer, the formatting for "add comment" was too limited for what I wanted to say.

For posterity, here's a reference to another similar question (which already links here as well).

Community
  • 1
  • 1
Adam Monsen
  • 9,054
  • 6
  • 53
  • 82