| 
									
										
										
										
											2024-02-01 22:05:27 +01:00
										 |  |  | *diff.txt*      For Vim version 9.1.  Last change: 2024 Feb 01 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		  VIM REFERENCE MANUAL    by Bram Moolenaar | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				*diff* *vimdiff* *gvimdiff* *diff-mode* | 
					
						
							| 
									
										
										
										
											2016-08-24 22:34:33 +02:00
										 |  |  | This file describes the |+diff| feature: Showing differences between two to | 
					
						
							|  |  |  | eight versions of the same file. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The basics are explained in section |08.7| of the user manual. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-27 22:23:55 +02:00
										 |  |  | 1. Starting diff mode		|start-vimdiff| | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 2. Viewing diffs		|view-diffs| | 
					
						
							|  |  |  | 3. Jumping to diffs		|jumpto-diffs| | 
					
						
							|  |  |  | 4. Copying diffs		|copy-diffs| | 
					
						
							|  |  |  | 5. Diff options			|diff-options| | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ============================================================================== | 
					
						
							| 
									
										
										
										
											2017-09-27 22:23:55 +02:00
										 |  |  | 1. Starting diff mode					*start-vimdiff* | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The easiest way to start editing in diff mode is with the "vimdiff" command. | 
					
						
							|  |  |  | This starts Vim as usual, and additionally sets up for viewing the differences | 
					
						
							|  |  |  | between the arguments. > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	vimdiff file1 file2 [file3 [file4]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This is equivalent to: > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	vim -d file1 file2 [file3 [file4]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | You may also use "gvimdiff" or "vim -d -g".  The GUI is started then. | 
					
						
							|  |  |  | You may also use "viewdiff" or "gviewdiff".  Vim starts in readonly mode then. | 
					
						
							|  |  |  | "r" may be prepended for restricted mode (see |-Z|). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The second and following arguments may also be a directory name.  Vim will | 
					
						
							|  |  |  | then append the file name of the first argument to the directory name to find | 
					
						
							|  |  |  | the file. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-10 17:51:58 +02:00
										 |  |  | By default an internal diff library will be used.  When 'diffopt' or | 
					
						
							|  |  |  | 'diffexpr' has been set an external "diff" command will be used.  This only | 
					
						
							|  |  |  | works when such a diff program is available. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-18 22:14:51 +00:00
										 |  |  | Diffs are local to the current tab page |tab-page|.  You can't see diffs with | 
					
						
							|  |  |  | a window in another tab page.  This does make it possible to have several | 
					
						
							|  |  |  | diffs at the same time, each in their own tab page. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | What happens is that Vim opens a window for each of the files.  This is like | 
					
						
							|  |  |  | using the |-O| argument.  This uses vertical splits.  If you prefer horizontal | 
					
						
							|  |  |  | splits add the |-o| argument: > | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-06 17:06:04 +00:00
										 |  |  | 	vimdiff -o file1 file2 [file3 [file4]] | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-15 22:59:18 +00:00
										 |  |  | If you always prefer horizontal splits include "horizontal" in 'diffopt'. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | In each of the edited files these options are set: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	'diff'		on | 
					
						
							|  |  |  | 	'scrollbind'	on | 
					
						
							| 
									
										
										
										
											2010-07-31 16:44:19 +02:00
										 |  |  | 	'cursorbind'	on | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 	'scrollopt'	includes "hor" | 
					
						
							| 
									
										
										
										
											2021-02-10 13:18:17 +01:00
										 |  |  | 	'wrap'		off, or leave as-is if 'diffopt' includes "followwrap" | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 	'foldmethod'	"diff" | 
					
						
							| 
									
										
										
										
											2006-03-15 22:59:18 +00:00
										 |  |  | 	'foldcolumn'	value from 'diffopt', default is 2 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | These options are set local to the window.  When editing another file they are | 
					
						
							|  |  |  | reset to the global value. | 
					
						
							| 
									
										
										
										
											2010-01-06 20:52:26 +01:00
										 |  |  | The options can still be overruled from a modeline when re-editing the file. | 
					
						
							|  |  |  | However, 'foldmethod' and 'wrap' won't be set from a modeline when 'diff' is | 
					
						
							|  |  |  | set. | 
					
						
							| 
									
										
										
										
											2019-11-10 22:09:11 +01:00
										 |  |  | See `:diffoff` for an easy way to revert the options. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The differences shown are actually the differences in the buffer.  Thus if you | 
					
						
							|  |  |  | make changes after loading a file, these will be included in the displayed | 
					
						
							|  |  |  | diffs.  You might have to do ":diffupdate" now and then, not all changes are | 
					
						
							| 
									
										
										
										
											2019-11-10 22:09:11 +01:00
										 |  |  | immediately taken into account, especially when using an external diff command. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | In your .vimrc file you could do something special when Vim was started in | 
					
						
							|  |  |  | diff mode.  You could use a construct like this: > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if &diff | 
					
						
							|  |  |  | 	   setup for diff mode | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	   setup for non-diff mode | 
					
						
							|  |  |  | 	endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | While already in Vim you can start diff mode in three ways. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							*E98* | 
					
						
							| 
									
										
										
										
											2012-09-21 14:54:30 +02:00
										 |  |  | :diffs[plit] {filename}					*:diffs* *:diffsplit* | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 		Open a new window on the file {filename}.  The options are set | 
					
						
							|  |  |  | 		as for "vimdiff" for the current and the newly opened window. | 
					
						
							|  |  |  | 		Also see 'diffexpr'. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							*:difft* *:diffthis* | 
					
						
							| 
									
										
										
										
											2012-09-21 14:54:30 +02:00
										 |  |  | :difft[his]	Make the current window part of the diff windows.  This sets | 
					
						
							| 
									
										
										
										
											2004-07-12 15:53:54 +00:00
										 |  |  | 		the options like for "vimdiff". | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-22 18:26:40 +02:00
										 |  |  | :diffp[atch] {patchfile}			 *E816* *:diffp* *:diffpatch* | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 		Use the current buffer, patch it with the diff found in | 
					
						
							|  |  |  | 		{patchfile} and open a buffer on the result.  The options are | 
					
						
							|  |  |  | 		set as for "vimdiff". | 
					
						
							|  |  |  | 		{patchfile} can be in any format that the "patch" program | 
					
						
							|  |  |  | 		understands or 'patchexpr' can handle. | 
					
						
							|  |  |  | 		Note that {patchfile} should only contain a diff for one file, | 
					
						
							|  |  |  | 		the current file.  If {patchfile} contains diffs for other | 
					
						
							|  |  |  | 		files as well, the results are unpredictable.  Vim changes | 
					
						
							|  |  |  | 		directory to /tmp to avoid files in the current directory | 
					
						
							|  |  |  | 		accidentally being patched.  But it may still result in | 
					
						
							|  |  |  | 		various ".rej" files to be created.  And when absolute path | 
					
						
							|  |  |  | 		names are present these files may get patched anyway. | 
					
						
							| 
									
										
										
										
											2023-04-22 22:40:14 +01:00
										 |  |  | 		Using the "patch" command is not allowed in |restricted-mode|. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | To make these commands use a vertical split, prepend |:vertical|.  Examples: > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	:vert diffsplit main.c~ | 
					
						
							|  |  |  | 	:vert diffpatch /tmp/diff | 
					
						
							| 
									
										
										
										
											2006-03-15 22:59:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | If you always prefer a vertical split include "vertical" in 'diffopt'. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 							*E96* | 
					
						
							| 
									
										
										
										
											2016-08-24 22:34:33 +02:00
										 |  |  | There can be up to eight buffers with 'diff' set. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Since the option values are remembered with the buffer, you can edit another | 
					
						
							|  |  |  | file for a moment and come back to the same file and be in diff mode again. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-12 15:53:54 +00:00
										 |  |  | 							*:diffo* *:diffoff* | 
					
						
							| 
									
										
										
										
											2013-09-22 14:42:24 +02:00
										 |  |  | :diffo[ff]	Switch off diff mode for the current window.  Resets related | 
					
						
							|  |  |  | 		options also when 'diff' was not set. | 
					
						
							| 
									
										
										
										
											2004-07-12 15:53:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-21 14:54:30 +02:00
										 |  |  | :diffo[ff]!	Switch off diff mode for the current window and in all windows | 
					
						
							| 
									
										
										
										
											2013-09-22 14:42:24 +02:00
										 |  |  | 		in the current tab page where 'diff' is set.  Resetting | 
					
						
							|  |  |  | 		related options only happens in a window that has 'diff' set, | 
					
						
							|  |  |  | 		if the current window does not have 'diff' set then no options | 
					
						
							|  |  |  | 		in it are changed. | 
					
						
							| 
									
										
										
										
											2017-02-17 22:47:16 +01:00
										 |  |  | 		Hidden buffers are also removed from the list of diff'ed | 
					
						
							|  |  |  | 		buffers. | 
					
						
							| 
									
										
										
										
											2004-07-12 15:53:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-10 19:31:35 +02:00
										 |  |  | The `:diffoff` command resets the relevant options to the values they had when | 
					
						
							| 
									
										
										
										
											2023-02-02 13:59:48 +00:00
										 |  |  | using `:diffsplit`, `:diffpatch`, `:diffthis`. or starting Vim in diff mode. | 
					
						
							| 
									
										
										
										
											2015-07-10 19:31:35 +02:00
										 |  |  | When using `:diffoff` twice the last saved values are restored. | 
					
						
							| 
									
										
										
										
											2013-07-09 15:44:17 +02:00
										 |  |  | Otherwise they are set to their default value: | 
					
						
							| 
									
										
										
										
											2004-07-12 15:53:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	'diff'		off | 
					
						
							|  |  |  | 	'scrollbind'	off | 
					
						
							| 
									
										
										
										
											2010-07-31 16:44:19 +02:00
										 |  |  | 	'cursorbind'	off | 
					
						
							| 
									
										
										
										
											2004-07-12 15:53:54 +00:00
										 |  |  | 	'scrollopt'	without "hor" | 
					
						
							| 
									
										
										
										
											2021-02-10 13:18:17 +01:00
										 |  |  | 	'wrap'		on, or leave as-is if 'diffopt' includes "followwrap" | 
					
						
							| 
									
										
										
										
											2004-07-12 15:53:54 +00:00
										 |  |  | 	'foldmethod'	"manual" | 
					
						
							|  |  |  | 	'foldcolumn'	0 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-31 15:30:45 +00:00
										 |  |  | 'foldenable' will most-likely be reset to off.  That is when 'foldmethod' is | 
					
						
							|  |  |  | is restored to "manual".  The folds themselves are not cleared but they should | 
					
						
							|  |  |  | not show up, resetting 'foldenable' is the best way to do that. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | ============================================================================== | 
					
						
							|  |  |  | 2. Viewing diffs						*view-diffs* | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The effect is that the diff windows show the same text, with the differences | 
					
						
							|  |  |  | highlighted.  When scrolling the text, the 'scrollbind' option will make the | 
					
						
							|  |  |  | text in other windows to be scrolled as well.  With vertical splits the text | 
					
						
							|  |  |  | should be aligned properly. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The alignment of text will go wrong when: | 
					
						
							|  |  |  | - 'wrap' is on, some lines will be wrapped and occupy two or more screen | 
					
						
							|  |  |  |   lines | 
					
						
							|  |  |  | - folds are open in one window but not another | 
					
						
							|  |  |  | - 'scrollbind' is off | 
					
						
							|  |  |  | - changes have been made to the text | 
					
						
							|  |  |  | - "filler" is not present in 'diffopt', deleted/inserted lines makes the | 
					
						
							|  |  |  |   alignment go wrong | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | All the buffers edited in a window where the 'diff' option is set will join in | 
					
						
							|  |  |  | the diff.  This is also possible for hidden buffers.  They must have been | 
					
						
							| 
									
										
										
										
											2017-02-17 22:47:16 +01:00
										 |  |  | edited in a window first for this to be possible.  To get rid of the hidden | 
					
						
							|  |  |  | buffers use `:diffoff!`. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  | 					*:DiffOrig* *diff-original-file* | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | Since 'diff' is a window-local option, it's possible to view the same buffer | 
					
						
							|  |  |  | in diff mode in one window and "normal" in another window.  It is also | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  | possible to view the changes you have made to a buffer since the file was | 
					
						
							|  |  |  | loaded.  Since Vim doesn't allow having two buffers for the same file, you | 
					
						
							|  |  |  | need another buffer.  This command is useful: > | 
					
						
							| 
									
										
										
										
											2011-04-28 19:02:44 +02:00
										 |  |  | 	 command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | 
					
						
							| 
									
										
										
										
											2023-02-20 20:44:55 +00:00
										 |  |  | 		\ | diffthis | wincmd p | diffthis | 
					
						
							| 
									
										
										
										
											2019-03-17 17:13:16 +01:00
										 |  |  | (this is in |defaults.vim|).  Use ":DiffOrig" to see the differences between | 
					
						
							|  |  |  | the current buffer and the file it was loaded from. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | A buffer that is unloaded cannot be used for the diff.  But it does work for | 
					
						
							|  |  |  | hidden buffers.  You can use ":hide" to close a window without unloading the | 
					
						
							| 
									
										
										
										
											2005-03-08 22:40:03 +00:00
										 |  |  | buffer.  If you don't want a buffer to remain used for the diff do ":set | 
					
						
							|  |  |  | nodiff" before hiding it. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 12:14:49 +02:00
										 |  |  | 						*:dif* *:diff* *:diffupdate* | 
					
						
							| 
									
										
										
										
											2015-11-10 21:15:48 +01:00
										 |  |  | :dif[fupdate][!]		Update the diff highlighting and folds. | 
					
						
							| 
									
										
										
										
											2005-05-18 22:17:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | Vim attempts to keep the differences updated when you make changes to the | 
					
						
							|  |  |  | text.  This mostly takes care of inserted and deleted lines.  Changes within a | 
					
						
							|  |  |  | line and more complicated changes do not cause the differences to be updated. | 
					
						
							|  |  |  | To force the differences to be updated use: > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	:diffupdate | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-18 18:47:17 +02:00
										 |  |  | If the ! is included Vim will check if the file was changed externally and | 
					
						
							|  |  |  | needs to be reloaded.  It will prompt for each changed file, like `:checktime` | 
					
						
							|  |  |  | was used. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Vim will show filler lines for lines that are missing in one window but are | 
					
						
							|  |  |  | present in another.  These lines were inserted in another file or deleted in | 
					
						
							|  |  |  | this file.  Removing "filler" from the 'diffopt' option will make Vim not | 
					
						
							|  |  |  | display these filler lines. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Folds are used to hide the text that wasn't changed.  See |folding| for all | 
					
						
							|  |  |  | the commands that can be used with folds. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The context of lines above a difference that are not included in the fold can | 
					
						
							|  |  |  | be set with the 'diffopt' option.  For example, to set the context to three | 
					
						
							|  |  |  | lines: > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	:set diffopt=filler,context:3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The diffs are highlighted with these groups: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | |hl-DiffAdd|	DiffAdd		Added (inserted) lines.  These lines exist in | 
					
						
							|  |  |  | 				this buffer but not in another. | 
					
						
							|  |  |  | |hl-DiffChange|	DiffChange	Changed lines. | 
					
						
							|  |  |  | |hl-DiffText|	DiffText	Changed text inside a Changed line.  Vim | 
					
						
							|  |  |  | 				finds the first character that is different, | 
					
						
							|  |  |  | 				and the last character that is different | 
					
						
							|  |  |  | 				(searching from the end of the line).  The | 
					
						
							|  |  |  | 				text in between is highlighted.  This means | 
					
						
							|  |  |  | 				that parts in the middle that are still the | 
					
						
							| 
									
										
										
										
											2017-09-19 22:06:03 +02:00
										 |  |  | 				same are highlighted anyway.  The 'diffopt' | 
					
						
							|  |  |  | 				flags "iwhite" and "icase" are used here. | 
					
						
							| 
									
										
										
										
											2013-02-06 17:34:04 +01:00
										 |  |  | |hl-DiffDelete|	DiffDelete	Deleted lines.  Also called filler lines, | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 				because they don't really exist in this | 
					
						
							|  |  |  | 				buffer. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ============================================================================== | 
					
						
							|  |  |  | 3. Jumping to diffs					*jumpto-diffs* | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Two commands can be used to jump to diffs: | 
					
						
							|  |  |  | 								*[c* | 
					
						
							|  |  |  | 	[c		Jump backwards to the previous start of a change. | 
					
						
							|  |  |  | 			When a count is used, do it that many times. | 
					
						
							|  |  |  | 								*]c* | 
					
						
							|  |  |  | 	]c		Jump forwards to the next start of a change. | 
					
						
							|  |  |  | 			When a count is used, do it that many times. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | It is an error if there is no change for the cursor to move to. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ============================================================================== | 
					
						
							|  |  |  | 4. Diff copying			*copy-diffs* *E99* *E100* *E101* *E102* *E103* | 
					
						
							| 
									
										
										
										
											2005-09-25 22:16:38 +00:00
										 |  |  | 								*merge* | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | There are two commands to copy text from one buffer to another.  The result is | 
					
						
							|  |  |  | that the buffers will be equal within the specified range. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							*:diffg* *:diffget* | 
					
						
							|  |  |  | :[range]diffg[et] [bufspec] | 
					
						
							|  |  |  | 		Modify the current buffer to undo difference with another | 
					
						
							| 
									
										
										
										
											2010-01-06 20:52:26 +01:00
										 |  |  | 		buffer.  If [bufspec] is given, that buffer is used.  If | 
					
						
							|  |  |  | 		[bufspec] refers to the current buffer then nothing happens. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 		Otherwise this only works if there is one other buffer in diff | 
					
						
							|  |  |  | 		mode. | 
					
						
							|  |  |  | 		See below for [range]. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 17:54:07 +00:00
										 |  |  | 						*:diffpu* *:diffput* *E793* | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | :[range]diffpu[t] [bufspec] | 
					
						
							|  |  |  | 		Modify another buffer to undo difference with the current | 
					
						
							|  |  |  | 		buffer.  Just like ":diffget" but the other buffer is modified | 
					
						
							|  |  |  | 		instead of the current one. | 
					
						
							| 
									
										
										
										
											2005-09-25 22:16:38 +00:00
										 |  |  | 		When [bufspec] is omitted and there is more than one other | 
					
						
							|  |  |  | 		buffer in diff mode where 'modifiable' is set this fails. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 		See below for [range]. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							*do* | 
					
						
							| 
									
										
										
										
											2014-11-05 17:02:17 +01:00
										 |  |  | [count]do	Same as ":diffget" without range.  The "o" stands for "obtain" | 
					
						
							|  |  |  | 		("dg" can't be used, it could be the start of "dgg"!). Note: | 
					
						
							|  |  |  | 		this doesn't work in Visual mode. | 
					
						
							|  |  |  | 		If you give a [count], it is used as the [bufspec] argument | 
					
						
							|  |  |  | 		for ":diffget". | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 							*dp* | 
					
						
							| 
									
										
										
										
											2014-11-05 17:02:17 +01:00
										 |  |  | [count]dp	Same as ":diffput" without range.  Note: this doesn't work in | 
					
						
							|  |  |  | 		Visual mode. | 
					
						
							|  |  |  | 		If you give a [count], it is used as the [bufspec] argument | 
					
						
							|  |  |  | 		for ":diffput". | 
					
						
							| 
									
										
										
										
											2010-09-30 21:47:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | When no [range] is given, the diff at the cursor position or just above it is | 
					
						
							|  |  |  | affected.  When [range] is used, Vim tries to only put or get the specified | 
					
						
							|  |  |  | lines.  When there are deleted lines, this may not always be possible. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | There can be deleted lines below the last line of the buffer.  When the cursor | 
					
						
							|  |  |  | is on the last line in the buffer and there is no diff above this line, the | 
					
						
							|  |  |  | ":diffget" and "do" commands will obtain lines from the other buffer. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To be able to get those lines from another buffer in a [range] it's allowed to | 
					
						
							|  |  |  | use the last line number plus one.  This command gets all diffs from the other | 
					
						
							|  |  |  | buffer: > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	:1,$+1diffget | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Note that deleted lines are displayed, but not counted as text lines.  You | 
					
						
							|  |  |  | can't move the cursor into them.  To fill the deleted lines with the lines | 
					
						
							|  |  |  | from another buffer use ":diffget" on the line below them. | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  | 								*E787* | 
					
						
							|  |  |  | When the buffer that is about to be modified is read-only and the autocommand | 
					
						
							|  |  |  | that is triggered by |FileChangedRO| changes buffers the command will fail. | 
					
						
							|  |  |  | The autocommand must not change buffers. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The [bufspec] argument above can be a buffer number, a pattern for a buffer | 
					
						
							|  |  |  | name or a part of a buffer name.  Examples: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	:diffget		Use the other buffer which is in diff mode | 
					
						
							|  |  |  | 	:diffget 3		Use buffer 3 | 
					
						
							|  |  |  | 	:diffget v2		Use the buffer which matches "v2" and is in | 
					
						
							|  |  |  | 				diff mode (e.g., "file.c.v2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ============================================================================== | 
					
						
							|  |  |  | 5. Diff options						*diff-options* | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Also see |'diffopt'| and the "diff" item of |'fillchars'|. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 19:13:34 +01:00
										 |  |  | 					    *diff-slow* *diff_translations* | 
					
						
							|  |  |  | For very long lines, the diff syntax highlighting might be slow, especially | 
					
						
							|  |  |  | since it tries to match all different kind of localisations. To disable | 
					
						
							|  |  |  | localisations and speed up the syntax highlighting, set the global variable | 
					
						
							|  |  |  | g:diff_translations to zero: > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let g:diff_translations = 0 | 
					
						
							|  |  |  | < | 
					
						
							| 
									
										
										
										
											2017-11-02 22:58:42 +01:00
										 |  |  | After setting this variable, reload the syntax script: > | 
					
						
							| 
									
										
										
										
											2015-02-03 19:13:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     set syntax=diff | 
					
						
							|  |  |  | < | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | FINDING THE DIFFERENCES					*diff-diffexpr* | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-23 12:07:04 +00:00
										 |  |  | The 'diffexpr' option can be set to use something else than the internal diff | 
					
						
							|  |  |  | support or the standard "diff" program to compare two files and find the | 
					
						
							|  |  |  | differences. *E959* | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | When 'diffexpr' is empty, Vim uses this command to find the differences | 
					
						
							|  |  |  | between file1 and file2: > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	diff file1 file2 > outfile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The ">" is replaced with the value of 'shellredir'. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 20:54:13 +02:00
										 |  |  | The output of "diff" must be a normal "ed" style diff or a unified diff.  A | 
					
						
							|  |  |  | context diff will NOT work.  For a unified diff no context lines can be used. | 
					
						
							|  |  |  | Using "diff -u" will NOT work, use "diff -U0". | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This example explains the format that Vim expects for the "ed" style diff: > | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	1a2 | 
					
						
							|  |  |  | 	> bbb | 
					
						
							|  |  |  | 	4d4 | 
					
						
							|  |  |  | 	< 111 | 
					
						
							|  |  |  | 	7c7 | 
					
						
							|  |  |  | 	< GGG | 
					
						
							|  |  |  | 	--- | 
					
						
							|  |  |  | 	> ggg | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The "1a2" item appends the line "bbb". | 
					
						
							|  |  |  | The "4d4" item deletes the line "111". | 
					
						
							| 
									
										
										
										
											2012-08-15 17:43:31 +02:00
										 |  |  | The "7c7" item replaces the line "GGG" with "ggg". | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 20:52:26 +01:00
										 |  |  | When 'diffexpr' is not empty, Vim evaluates it to obtain a diff file in the | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | format mentioned.  These variables are set to the file names used: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	v:fname_in		original file | 
					
						
							|  |  |  | 	v:fname_new		new version of the same file | 
					
						
							| 
									
										
										
										
											2022-01-23 12:07:04 +00:00
										 |  |  | 	v:fname_out		where to write the resulting diff file | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Additionally, 'diffexpr' should take care of "icase" and "iwhite" in the | 
					
						
							|  |  |  | 'diffopt' option.  'diffexpr' cannot change the value of 'lines' and | 
					
						
							|  |  |  | 'columns'. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 19:43:52 +01:00
										 |  |  | The advantage of using a function call without arguments is that it is faster, | 
					
						
							|  |  |  | see |expr-option-function|. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | Example (this does almost the same as 'diffexpr' being empty): > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	set diffexpr=MyDiff() | 
					
						
							|  |  |  | 	function MyDiff() | 
					
						
							|  |  |  | 	   let opt = "" | 
					
						
							|  |  |  | 	   if &diffopt =~ "icase" | 
					
						
							| 
									
										
										
										
											2022-02-26 12:25:45 +00:00
										 |  |  | 	     let opt = opt .. "-i " | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 	   endif | 
					
						
							|  |  |  | 	   if &diffopt =~ "iwhite" | 
					
						
							| 
									
										
										
										
											2022-02-26 12:25:45 +00:00
										 |  |  | 	     let opt = opt .. "-b " | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 	   endif | 
					
						
							| 
									
										
										
										
											2022-02-26 12:25:45 +00:00
										 |  |  | 	   silent execute "!diff -a --binary " .. opt .. v:fname_in .. " " .. v:fname_new .. | 
					
						
							|  |  |  | 		\  " > " .. v:fname_out | 
					
						
							| 
									
										
										
										
											2018-08-11 18:00:22 +02:00
										 |  |  | 	   redraw! | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 	endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The "-a" argument is used to force comparing the files as text, comparing as | 
					
						
							|  |  |  | binaries isn't useful.  The "--binary" argument makes the files read in binary | 
					
						
							|  |  |  | mode, so that a CTRL-Z doesn't end the text on DOS. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-11 18:00:22 +02:00
										 |  |  | The `redraw!` command may not be needed, depending on whether executing a | 
					
						
							|  |  |  | shell command shows something on the display or not. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-26 10:51:39 +00:00
										 |  |  | If the 'diffexpr' expression starts with s: or |<SID>|, then it is replaced | 
					
						
							|  |  |  | with the script ID (|local-function|). Example: > | 
					
						
							|  |  |  | 		set diffexpr=s:MyDiffExpr() | 
					
						
							|  |  |  | 		set diffexpr=<SID>SomeDiffExpr() | 
					
						
							| 
									
										
										
										
											2022-01-23 12:07:04 +00:00
										 |  |  | Otherwise, the expression is evaluated in the context of the script where the | 
					
						
							|  |  |  | option was set, thus script-local items are available. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 20:52:26 +01:00
										 |  |  | 						*E810* *E97* | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | Vim will do a test if the diff output looks alright.  If it doesn't, you will | 
					
						
							|  |  |  | get an error message.  Possible causes: | 
					
						
							|  |  |  | -  The "diff" program cannot be executed. | 
					
						
							|  |  |  | -  The "diff" program doesn't produce normal "ed" style diffs (see above). | 
					
						
							|  |  |  | -  The 'shell' and associated options are not set correctly.  Try if filtering | 
					
						
							|  |  |  |    works with a command like ":!sort". | 
					
						
							|  |  |  | -  You are using 'diffexpr' and it doesn't work. | 
					
						
							| 
									
										
										
										
											2006-01-22 23:25:56 +00:00
										 |  |  | If it's not clear what the problem is set the 'verbose' option to one or more | 
					
						
							|  |  |  | to see more messages. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 20:34:40 +01:00
										 |  |  | The self-installing Vim for MS-Windows includes a diff program.  If you don't | 
					
						
							|  |  |  | have it you might want to download a diff.exe.  For example from | 
					
						
							| 
									
										
										
										
											2010-12-10 20:35:50 +01:00
										 |  |  | http://gnuwin32.sourceforge.net/packages/diffutils.htm. | 
					
						
							| 
									
										
										
										
											2004-07-26 12:53:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | USING PATCHES					*diff-patchexpr* | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The 'patchexpr' option can be set to use something else than the standard | 
					
						
							|  |  |  | "patch" program. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When 'patchexpr' is empty, Vim will call the "patch" program like this: > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	patch -o outfile origfile < patchfile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This should work fine with most versions of the "patch" program.  Note that a | 
					
						
							|  |  |  | CR in the middle of a line may cause problems, it is seen as a line break. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If the default doesn't work for you, set the 'patchexpr' to an expression that | 
					
						
							|  |  |  | will have the same effect.  These variables are set to the file names used: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	v:fname_in		original file | 
					
						
							|  |  |  | 	v:fname_diff		patch file | 
					
						
							|  |  |  | 	v:fname_out		resulting patched file | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 19:43:52 +01:00
										 |  |  | The advantage of using a function call without arguments is that it is faster, | 
					
						
							|  |  |  | see |expr-option-function|. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | Example (this does the same as 'patchexpr' being empty): > | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-15 22:59:18 +00:00
										 |  |  | 	set patchexpr=MyPatch() | 
					
						
							|  |  |  | 	function MyPatch() | 
					
						
							| 
									
										
										
										
											2022-02-26 12:25:45 +00:00
										 |  |  | 	   :call system("patch -o " .. v:fname_out .. " " .. v:fname_in .. | 
					
						
							|  |  |  | 	   \  " < " .. v:fname_diff) | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 	endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Make sure that using the "patch" program doesn't have unwanted side effects. | 
					
						
							|  |  |  | For example, watch out for additionally generated files, which should be | 
					
						
							|  |  |  | deleted.  It should just patch the file and nothing else. | 
					
						
							|  |  |  |    Vim will change directory to "/tmp" or another temp directory before | 
					
						
							|  |  |  | evaluating 'patchexpr'.  This hopefully avoids that files in the current | 
					
						
							|  |  |  | directory are accidentally patched.  Vim will also delete files starting with | 
					
						
							|  |  |  | v:fname_in and ending in ".rej" and ".orig". | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-26 10:51:39 +00:00
										 |  |  | If the 'patchexpr' expression starts with s: or |<SID>|, then it is replaced | 
					
						
							|  |  |  | with the script ID (|local-function|). Example: > | 
					
						
							|  |  |  | 		set patchexpr=s:MyPatchExpr() | 
					
						
							|  |  |  | 		set patchexpr=<SID>SomePatchExpr() | 
					
						
							| 
									
										
										
										
											2022-01-23 12:07:04 +00:00
										 |  |  | Otherwise, the expression is evaluated in the context of the script where the | 
					
						
							|  |  |  | option was set, thus script-local items are available. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-01 22:05:27 +01:00
										 |  |  | DIFF FUNCTION EXAMPLES				*diff-func-examples* | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Some examples for using the |diff()| function to compute the diff indices | 
					
						
							|  |  |  | between two Lists of strings are below. | 
					
						
							|  |  |  | > | 
					
						
							|  |  |  |   " some lines are changed | 
					
						
							|  |  |  |   :echo diff(['abc', 'def', 'ghi'], ['abx', 'rrr', 'xhi'], {'output': 'indices'}) | 
					
						
							|  |  |  |    [{'from_idx': 0, 'from_count': 3, 'to_idx': 0, 'to_count': 3}] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " few lines added at the beginning | 
					
						
							|  |  |  |   :echo diff(['ghi'], ['abc', 'def', 'ghi'], {'output': 'indices'}) | 
					
						
							|  |  |  |    [{'from_idx': 0, 'from_count': 0, 'to_idx': 0, 'to_count': 2}] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " few lines removed from the beginning | 
					
						
							|  |  |  |   :echo diff(['abc', 'def', 'ghi'], ['ghi'], {'output': 'indices'}) | 
					
						
							|  |  |  |    [{'from_idx': 0, 'from_count': 2, 'to_idx': 0, 'to_count': 0}] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " few lines added in the middle | 
					
						
							|  |  |  |   :echo diff(['abc', 'jkl'], ['abc', 'def', 'ghi', 'jkl'], {'output': 'indices'}) | 
					
						
							|  |  |  |    [{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " few lines removed in the middle | 
					
						
							|  |  |  |   :echo diff(['abc', 'def', 'ghi', 'jkl'], ['abc', 'jkl'], {'output': 'indices'}) | 
					
						
							|  |  |  |    [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " few lines added at the end | 
					
						
							|  |  |  |   :echo diff(['abc'], ['abc', 'def', 'ghi'], {'output': 'indices'}) | 
					
						
							|  |  |  |    [{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " few lines removed from the end | 
					
						
							|  |  |  |   :echo diff(['abc', 'def', 'ghi'], ['abc'], {'output': 'indices'}) | 
					
						
							|  |  |  |    [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " disjointed changes | 
					
						
							| 
									
										
										
										
											2024-02-12 20:21:26 +01:00
										 |  |  |   :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices', 'context': 0}) | 
					
						
							| 
									
										
										
										
											2024-02-01 22:05:27 +01:00
										 |  |  |    [{'from_idx': 0, 'from_count': 1, 'to_idx': 0, 'to_count': 1}, | 
					
						
							|  |  |  |     {'from_idx': 3, 'from_count': 1, 'to_idx': 3, 'to_count': 1}] | 
					
						
							| 
									
										
										
										
											2024-02-12 20:21:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   " disjointed changes with context length 1 | 
					
						
							|  |  |  |   :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices', 'context': 1}) | 
					
						
							|  |  |  |    [{'from_idx': 0, 'from_count': 4, 'to_idx': 0, 'to_count': 4}] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-01 22:05:27 +01:00
										 |  |  | < | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-29 15:07:52 +02:00
										 |  |  |  vim:tw=78:ts=8:noet:ft=help:norl: |