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?
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?
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
:diffoffcommand.Below is a similar function, adapted to mimic the
'cvs diff'command...
git supports the following command
:w !git diff --no-index -- % -
map it to a command by adding the following to your ~/.vimrc
command GitDiff execute "w !git diff --no-index -- % -"
Now executing :GitDiff becomes a handy little command to quickly show the diff before each save.
Source the following and use :DIFF command
function! s:diff()
let tmpa = tempname()
let tmpb = tempname()
earlier 100h
exec 'w '.tmpa
later 100h
exec 'w '.tmpb
update
exec 'tabnew '.tmpa
diffthis
vert split
exec 'edit '.tmpb
diffthis
endfunction
command! -nargs=0 DIFF call <SID>diff()
Not exactly what you're looking for but SCMDiff.vim is really cool. One keypress, and it diff-highlights your current file with the head revision in a source control repo. It's meant to work with many SCMS. I use it with perforce.
Changes you just edited [buffer], i.e. those that differ from last saved version (in working directory), these may differ with last index version (Git). I mapped both:
" Find diff inbetween currrent buffer and ... A{last index version} vs B{last saved version in working directory}
" - A{last index version}: the file as you last commited it
" git diff to vimdiff against the index version of the file:
nnoremap <leader>gd <Esc>:Gvdiff<CR><Esc>:echo "currentBuffer vs lastIndexVersion (last commited)"<CR>
" - B{last saved version in working directory}: the file you last :w,
" not neccesary commited it (not commited for sure if it is in NO git project)
" https://vim.fandom.com/wiki/Diff_current_buffer_and_the_original_file
nnoremap <leader>gd2 <Esc>:DiffSaved<CR><Esc>:echo "currentBuffer vs lastSaved (not neccesary equal to last commited)"<CR>
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()
Example of vimdiff vs Gdiff.

Commiting changes, you see only Gdiff, what might, or might have same changes as vimdiff:

Furthermore, to easy vimdiff homonym file in other path:
" vimdiff homonym file
nnoremap <leader>dh <Esc>:vsplit %:p:h/../__/%:t <bar> :windo diffthis<Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left>
"E.g."$ vim /path01/proj02_pg064/processorder.php
":vsplit %:p:h/../proj01_pg05/%:t | :windo diffthis
You can make vim create a last backup and original backup with:
:set backup
:set patchmode=.orig
Thereafter, you can open them in a split:
:vsp %:p~ or :vsp %:.orig
And from there do:
:vimdiff in each buffer
If you're dead set on no leftovers but want vimdiff, you could also do:
ggVGy # copy the whole buffer
:vnew # open a split
CTRL-W w # switch to it
shift-P # paste at start
and then do :diffthis on each split