Vim Tips Wiki
Register
Advertisement
Tip 1508 Printable Monobook Previous Next

created June 18, 2007 · complexity basic · author Christian Brabandt · version 6.0


Sometimes one wants to create a unified patch from the file which is currently being edited. I have written a function that will create the patch and open it in a new buffer, so that it could possibly be further edited. In case the function cannot determine the unchanged reference file, it will ask the user to provide an alternative filename for diffing (by default it tries to open a file named like the current file with the suffix ".orig" appended.

It will create temporary files in case the current buffer is not modified or new. At the end it will delete the temporary files (but this works only on Linux).

For Windows this script relies on the command diff which must be in your path in order to be executed successfully. The diff command can be modified in the first line of the function.

fu! DiffUnified()
  let diffexpr="diff -Nuar"
  let bname=bufname("")
  let origtemp=0
  " Case 1: File has a filename and is not modified
  if !&modified && !empty(bname)
    let tempfile=0
    let origFile=bname.".orig"
  else
    " Case 2: File has a filename and is modified
    if &modified && !empty(bname)
      if !filereadable(bname.".orig")
        sp
        enew
        r #
        0d
        let tempfile2=tempname()
        exe ":sil w! " .tempfile2
        wincmd q
        let origtemp=1
        wincmd p
      endif
      let origFile=tempfile2
      " Case 2: File is new and is modified
    else
      if &modified
        let origFile=bname.".orig"
      else
        let origFile=""
      endif
    endif
    let bname=tempname()
    exe ":sil w! ".bname
    let tempfile=1
  endif
  try
    if !filereadable(origFile)
      let origFile=input("With which file to diff?: ","","file")
    endif
    if !filereadable(bname)
      exe ":sil w! ".bname
    endif
    if empty(origFile)
      throw "nofile"
    endif
    exe "sil sp"
    exe "enew"
    set bt=nofile
    exe "sil r!".diffexpr." ".origFile." ".bname
    exe "0d_"
    exe "set ft=diff"
    " Clean up temporary files
    if  tempfile == 1
      exe "sil :!rm -f ". bname
      let tempfile=0
    endif
    if origtemp == 1
      exe "sil :!rm -f ". origFile
      let origtemp=0
    endif
  catch
  endtry
endf

See also[]

(these tips may be related...verify after this tip is cleaned up)

Comments[]

 TO DO 

  • Need better explanation of purpose of tip, and how to use it.
  • Should better comment the script.
  • Should rename to improve the title.

Advertisement