Can I see changes before I save my file in Vim?

I use Vim. I open a file. I edit it and I want to see what I've edited before I save it.

How can I do this in Vim?


:w !diff % -

Because some people asked about an explanation for the command

:w !diff % -

Here is my attempt on writing a more detailed answer:

I am assuming that you are working on a system with cat and echo installed (e.g. almost any GNU/Linux, Mac OS, BSD and other UNIX-like systems).

The above command works as follows:

  1. The syntax for saving a file in vim is:

    :w <filename>
    
  2. The syntax for executing a shell command in vim is:

    :!<command>
    
  3. Inside the shell environment issued by vim % happens to point to the current filename. You can verify this by executing the following:

    :!echo %
    

    This should output the filename (or an error, if vim was run without a filename).

    Using cat we can also output the content of the file:

    :!cat %
    

    This should return the files content in its last saved state or an error if it has never been saved.

  4. The program diff is able to read from standard input (stdin). Its man page states the following:

    [...] If a FILE is '-', read standard input. [...]

  5. Executing the save command without a filename but rather a shell command behind it causes vim to write the files content to stdin of the shell instead of saving it in a physical file. You can verify this by executing

    :w !cat
    

    This should always print the files current content (which would have been written to a file instead).

Putting it together (or tl;dr): The file is "saved" to stdin, diff is run with the filename and stdin as input.

Knowing this one could also compare files with vimdiff doing something like this - this is just an idea you do not want to do this:

:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile

(Then open readonly and close vimdiff using :qall)


http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file

Here is a function and command to see a diff between the currently edited file and its unmodified version in the filesystem. Just put this in your vimrc or in the plugin directory, open a file, make some modifications without saving them, and do :DiffSaved.

function! s:DiffWithSaved()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction
com! DiffSaved call s:DiffWithSaved()

To get out of diff view you can use the :diffoff command.

Below is a similar function, adapted to mimic the 'cvs diff' command...


I've always likes diffchanges - nice, simple, works.