The pre-requisite to all operations detailed below
is to make sure that all participating buffers are
in diff mode (see :h start-vimdiff
). I use
tpope/vim-unimpaired
that has the normal mode alias
yod to toggle
:diffthis
on and off easily for a buffer.
do - Get changes from other window into the current window.
dp - Put the changes from current window into the other window.
]c - Jump to the next change.
[c - Jump to the previous change.
zo - Open folded lines.
zc - Close folded lines.
zr - Unfold both files completely.
zm - Fold both files completely.
Ctrlww - change window.
:only | wq
- quit other windows, and save them while at it.
Both do and dp work if you are on a block of change (or just one line under a single line of change) in Normal mode, but not in Visual mode.
The undo command will only work in the buffer that was changed, so if you use dp and change your mind, you need to switch to the other buffer to undo.
:diffupdate
will re-scan the files for changes
(Vim can get confused, and show bogus stuff).
When selecting lines of text in Visual mode, you must use the normal commands:
:'<,'>diffget
and:'<,'>diffput
.For example:
Enter Visual mode and mark some text/lines.
Then type :diffput
to push the selected lines
to the other file or :diffget
to get the selected
lines from the other file.
To belabor the point: This means that if there is a
block of changes consisting of multiple lines, then
selecting a subset of lines and issueing :diffput
will only apply those changes in the other buffer.
(:diffget
and :diffput
also accept ranges, see
:h copy-diffs
for more.)
If you load up two files in splits (:vs
or :sp
),
you can do :diffthis
on each window and achieve a
diff of files that were already loaded in buffers.
:diffoff
can be used to turn off the diff mode.
This Vimcasts post and video show this in practice.
Get all changes from a buffer to the current one:
:%diffget <buffer-number>
Put all changes from current buffer into another:
:%diffput <buffer-number>
(:%
is a range to select the entire file; see :h
:%
. :ls
will show currently opened buffers.)