Mercurial > vim
comparison runtime/doc/diff.txt @ 7:3fc0f57ecb91 v7.0001
updated for version 7.0001
author | vimboss |
---|---|
date | Sun, 13 Jun 2004 20:20:40 +0000 |
parents | |
children | 3ba373b54370 |
comparison
equal
deleted
inserted
replaced
6:c2daee826b8f | 7:3fc0f57ecb91 |
---|---|
1 *diff.txt* For Vim version 7.0aa. Last change: 2004 May 01 | |
2 | |
3 | |
4 VIM REFERENCE MANUAL by Bram Moolenaar | |
5 | |
6 | |
7 *diff* *vimdiff* *gvimdiff* *diff-mode* | |
8 This file describes the +diff feature: Showing differences between two or | |
9 three versions of the same file. | |
10 | |
11 The basics are explained in section |08.7| of the user manual. | |
12 | |
13 1. Starting diff mode |vimdiff| | |
14 2. Viewing diffs |view-diffs| | |
15 3. Jumping to diffs |jumpto-diffs| | |
16 4. Copying diffs |copy-diffs| | |
17 5. Diff options |diff-options| | |
18 | |
19 {not in Vi} | |
20 | |
21 ============================================================================== | |
22 1. Starting diff mode | |
23 | |
24 The easiest way to start editing in diff mode is with the "vimdiff" command. | |
25 This starts Vim as usual, and additionally sets up for viewing the differences | |
26 between the arguments. > | |
27 | |
28 vimdiff file1 file2 [file3 [file4]] | |
29 | |
30 This is equivalent to: > | |
31 | |
32 vim -d file1 file2 [file3 [file4]] | |
33 | |
34 You may also use "gvimdiff" or "vim -d -g". The GUI is started then. | |
35 You may also use "viewdiff" or "gviewdiff". Vim starts in readonly mode then. | |
36 "r" may be prepended for restricted mode (see |-Z|). | |
37 | |
38 The second and following arguments may also be a directory name. Vim will | |
39 then append the file name of the first argument to the directory name to find | |
40 the file. | |
41 | |
42 This only works when a standard "diff" command is available. See 'diffexpr'. | |
43 | |
44 What happens is that Vim opens a window for each of the files. This is like | |
45 using the |-O| argument. This uses vertical splits. If you prefer horizontal | |
46 splits add the |-o| argument: > | |
47 | |
48 vimdiff -o file1 file2 [file3] | |
49 | |
50 In each of the edited files these options are set: | |
51 | |
52 'diff' on | |
53 'scrollbind' on | |
54 'scrollopt' includes "hor" | |
55 'wrap' off | |
56 'foldmethod' "diff" | |
57 'foldcolumn' 2 | |
58 | |
59 These options are set local to the window. When editing another file they are | |
60 reset to the global value. | |
61 | |
62 The differences shown are actually the differences in the buffer. Thus if you | |
63 make changes after loading a file, these will be included in the displayed | |
64 diffs. You might have to do ":diffupdate" now and then, not all changes are | |
65 immediately taken into account. | |
66 | |
67 In your .vimrc file you could do something special when Vim was started in | |
68 diff mode. You could use a construct like this: > | |
69 | |
70 if &diff | |
71 setup for diff mode | |
72 else | |
73 setup for non-diff mode | |
74 endif | |
75 | |
76 While already in Vim you can start diff mode in three ways. | |
77 | |
78 *E98* | |
79 :diffsplit {filename} *:diffs* *:diffsplit* | |
80 Open a new window on the file {filename}. The options are set | |
81 as for "vimdiff" for the current and the newly opened window. | |
82 Also see 'diffexpr'. | |
83 | |
84 *:difft* *:diffthis* | |
85 :diffthis Make the current window part of the diff windows. This sets | |
86 the option like for "vimdiff". | |
87 | |
88 :diffpatch {patchfile} *:diffp* *:diffpatch* | |
89 Use the current buffer, patch it with the diff found in | |
90 {patchfile} and open a buffer on the result. The options are | |
91 set as for "vimdiff". | |
92 {patchfile} can be in any format that the "patch" program | |
93 understands or 'patchexpr' can handle. | |
94 Note that {patchfile} should only contain a diff for one file, | |
95 the current file. If {patchfile} contains diffs for other | |
96 files as well, the results are unpredictable. Vim changes | |
97 directory to /tmp to avoid files in the current directory | |
98 accidentally being patched. But it may still result in | |
99 various ".rej" files to be created. And when absolute path | |
100 names are present these files may get patched anyway. | |
101 | |
102 To make these commands use a vertical split, prepend |:vertical|. Examples: > | |
103 | |
104 :vert diffsplit main.c~ | |
105 :vert diffpatch /tmp/diff | |
106 < | |
107 *E96* | |
108 There can be up to four buffers with 'diff' set. | |
109 | |
110 Since the option values are remembered with the buffer, you can edit another | |
111 file for a moment and come back to the same file and be in diff mode again. | |
112 If you don't want diff mode, reset the 'diff' option. And you probably want | |
113 to get rid of the fold column: > | |
114 | |
115 :set nodiff foldcolumn=0 | |
116 | |
117 ============================================================================== | |
118 2. Viewing diffs *view-diffs* | |
119 | |
120 The effect is that the diff windows show the same text, with the differences | |
121 highlighted. When scrolling the text, the 'scrollbind' option will make the | |
122 text in other windows to be scrolled as well. With vertical splits the text | |
123 should be aligned properly. | |
124 | |
125 The alignment of text will go wrong when: | |
126 - 'wrap' is on, some lines will be wrapped and occupy two or more screen | |
127 lines | |
128 - folds are open in one window but not another | |
129 - 'scrollbind' is off | |
130 - changes have been made to the text | |
131 - "filler" is not present in 'diffopt', deleted/inserted lines makes the | |
132 alignment go wrong | |
133 | |
134 All the buffers edited in a window where the 'diff' option is set will join in | |
135 the diff. This is also possible for hidden buffers. They must have been | |
136 edited in a window first for this to be possible. | |
137 | |
138 Since 'diff' is a window-local option, it's possible to view the same buffer | |
139 in diff mode in one window and "normal" in another window. It is also | |
140 possible to view the changes you have made to a buffer, but since Vim doesn't | |
141 allow having two buffers for the same file, you need to make a copy of the | |
142 original file and diff with that. For example: > | |
143 :!cp % tempfile | |
144 :diffsplit tempfile | |
145 | |
146 A buffer that is unloaded cannot be used for the diff. But it does work for | |
147 hidden buffers. You can use ":hide" to close a window without unloading the | |
148 buffer. | |
149 | |
150 | |
151 *:diffu* *:diffupdate* | |
152 Vim attempts to keep the differences updated when you make changes to the | |
153 text. This mostly takes care of inserted and deleted lines. Changes within a | |
154 line and more complicated changes do not cause the differences to be updated. | |
155 To force the differences to be updated use: > | |
156 | |
157 :diffupdate | |
158 | |
159 | |
160 Vim will show filler lines for lines that are missing in one window but are | |
161 present in another. These lines were inserted in another file or deleted in | |
162 this file. Removing "filler" from the 'diffopt' option will make Vim not | |
163 display these filler lines. | |
164 | |
165 | |
166 Folds are used to hide the text that wasn't changed. See |folding| for all | |
167 the commands that can be used with folds. | |
168 | |
169 The context of lines above a difference that are not included in the fold can | |
170 be set with the 'diffopt' option. For example, to set the context to three | |
171 lines: > | |
172 | |
173 :set diffopt=filler,context:3 | |
174 | |
175 | |
176 The diffs are highlighted with these groups: | |
177 | |
178 |hl-DiffAdd| DiffAdd Added (inserted) lines. These lines exist in | |
179 this buffer but not in another. | |
180 |hl-DiffChange| DiffChange Changed lines. | |
181 |hl-DiffText| DiffText Changed text inside a Changed line. Vim | |
182 finds the first character that is different, | |
183 and the last character that is different | |
184 (searching from the end of the line). The | |
185 text in between is highlighted. This means | |
186 that parts in the middle that are still the | |
187 same are highlighted anyway. | |
188 |hl-DiffDelete| DiffDelete Deleted lines. Also called filler lines, | |
189 because they don't really exist in this | |
190 buffer. | |
191 | |
192 ============================================================================== | |
193 3. Jumping to diffs *jumpto-diffs* | |
194 | |
195 Two commands can be used to jump to diffs: | |
196 *[c* | |
197 [c Jump backwards to the previous start of a change. | |
198 When a count is used, do it that many times. | |
199 *]c* | |
200 ]c Jump forwards to the next start of a change. | |
201 When a count is used, do it that many times. | |
202 | |
203 It is an error if there is no change for the cursor to move to. | |
204 | |
205 ============================================================================== | |
206 4. Diff copying *copy-diffs* *E99* *E100* *E101* *E102* *E103* | |
207 | |
208 There are two commands to copy text from one buffer to another. The result is | |
209 that the buffers will be equal within the specified range. | |
210 | |
211 *:diffg* *:diffget* | |
212 :[range]diffg[et] [bufspec] | |
213 Modify the current buffer to undo difference with another | |
214 buffer. If [bufspec] is given, that buffer is used. | |
215 Otherwise this only works if there is one other buffer in diff | |
216 mode. | |
217 See below for [range]. | |
218 | |
219 *:diffpu* *:diffput* | |
220 :[range]diffpu[t] [bufspec] | |
221 Modify another buffer to undo difference with the current | |
222 buffer. Just like ":diffget" but the other buffer is modified | |
223 instead of the current one. | |
224 See below for [range]. | |
225 | |
226 *do* | |
227 do Same as ":diffget" without argument or range. The "o" stands | |
228 for "obtain" ("dg" can't be used, it could be the start of | |
229 "dgg"!). | |
230 | |
231 *dp* | |
232 dp Same as ":diffput" without argument or range. | |
233 | |
234 When no [range] is given, the diff at the cursor position or just above it is | |
235 affected. When [range] is used, Vim tries to only put or get the specified | |
236 lines. When there are deleted lines, this may not always be possible. | |
237 | |
238 There can be deleted lines below the last line of the buffer. When the cursor | |
239 is on the last line in the buffer and there is no diff above this line, the | |
240 ":diffget" and "do" commands will obtain lines from the other buffer. | |
241 | |
242 To be able to get those lines from another buffer in a [range] it's allowed to | |
243 use the last line number plus one. This command gets all diffs from the other | |
244 buffer: > | |
245 | |
246 :1,$+1diffget | |
247 | |
248 Note that deleted lines are displayed, but not counted as text lines. You | |
249 can't move the cursor into them. To fill the deleted lines with the lines | |
250 from another buffer use ":diffget" on the line below them. | |
251 | |
252 The [bufspec] argument above can be a buffer number, a pattern for a buffer | |
253 name or a part of a buffer name. Examples: | |
254 | |
255 :diffget Use the other buffer which is in diff mode | |
256 :diffget 3 Use buffer 3 | |
257 :diffget v2 Use the buffer which matches "v2" and is in | |
258 diff mode (e.g., "file.c.v2") | |
259 | |
260 ============================================================================== | |
261 5. Diff options *diff-options* | |
262 | |
263 Also see |'diffopt'| and the "diff" item of |'fillchars'|. | |
264 | |
265 | |
266 FINDING THE DIFFERENCES *diff-diffexpr* | |
267 | |
268 The 'diffexpr' option can be set to use something else than the standard | |
269 "diff" program to compare two files and find the differences. | |
270 | |
271 When 'diffexpr' is empty, Vim uses this command to find the differences | |
272 between file1 and file2: > | |
273 | |
274 diff file1 file2 > outfile | |
275 | |
276 The ">" is replaced with the value of 'shellredir'. | |
277 | |
278 The output of "diff" must be a normal "ed" style diff. Do NOT use a context | |
279 diff. This example explains the format that Vim expects: > | |
280 | |
281 1a2 | |
282 > bbb | |
283 4d4 | |
284 < 111 | |
285 7c7 | |
286 < GGG | |
287 --- | |
288 > ggg | |
289 | |
290 The "1a2" item appends the line "bbb". | |
291 The "4d4" item deletes the line "111". | |
292 The '7c7" item replaces the line "GGG" with "ggg". | |
293 | |
294 When 'diffexpr' is not empty, Vim evaluates to obtain a diff file in the | |
295 format mentioned. These variables are set to the file names used: | |
296 | |
297 v:fname_in original file | |
298 v:fname_new new version of the same file | |
299 v:fname_out resulting diff file | |
300 | |
301 Additionally, 'diffexpr' should take care of "icase" and "iwhite" in the | |
302 'diffopt' option. 'diffexpr' cannot change the value of 'lines' and | |
303 'columns'. | |
304 | |
305 Example (this does almost the same as 'diffexpr' being empty): > | |
306 | |
307 set diffexpr=MyDiff() | |
308 function MyDiff() | |
309 let opt = "" | |
310 if &diffopt =~ "icase" | |
311 let opt = opt . "-i " | |
312 endif | |
313 if &diffopt =~ "iwhite" | |
314 let opt = opt . "-b " | |
315 endif | |
316 silent execute "!diff -a --binary " . opt . v:fname_in . " " . v:fname_new . | |
317 \ " > " . v:fname_out | |
318 endfunction | |
319 | |
320 The "-a" argument is used to force comparing the files as text, comparing as | |
321 binaries isn't useful. The "--binary" argument makes the files read in binary | |
322 mode, so that a CTRL-Z doesn't end the text on DOS. | |
323 | |
324 *E97* | |
325 Vim will do a test if the diff output looks alright. If it doesn't, you will | |
326 get an error message. Possible causes: | |
327 - The "diff" program cannot be executed. | |
328 - The "diff" program doesn't produce normal "ed" style diffs (see above). | |
329 - The 'shell' and associated options are not set correctly. Try if filtering | |
330 works with a command like ":!sort". | |
331 - You are using 'diffexpr' and it doesn't work. | |
332 If it's not clear what the problem is set the 'verbose' option to see more | |
333 messages. | |
334 | |
335 | |
336 USING PATCHES *diff-patchexpr* | |
337 | |
338 The 'patchexpr' option can be set to use something else than the standard | |
339 "patch" program. | |
340 | |
341 When 'patchexpr' is empty, Vim will call the "patch" program like this: > | |
342 | |
343 patch -o outfile origfile < patchfile | |
344 | |
345 This should work fine with most versions of the "patch" program. Note that a | |
346 CR in the middle of a line may cause problems, it is seen as a line break. | |
347 | |
348 If the default doesn't work for you, set the 'patchexpr' to an expression that | |
349 will have the same effect. These variables are set to the file names used: | |
350 | |
351 v:fname_in original file | |
352 v:fname_diff patch file | |
353 v:fname_out resulting patched file | |
354 | |
355 Example (this does the same as 'patchexpr' being empty): > | |
356 | |
357 let patchexpr=MyPatch | |
358 function MyPatch | |
359 :call system("patch -o " . v:fname_out . " " . v:fname_in . | |
360 \ " < " . v:fname_diff) | |
361 endfunction | |
362 | |
363 Make sure that using the "patch" program doesn't have unwanted side effects. | |
364 For example, watch out for additionally generated files, which should be | |
365 deleted. It should just patch the file and nothing else. | |
366 Vim will change directory to "/tmp" or another temp directory before | |
367 evaluating 'patchexpr'. This hopefully avoids that files in the current | |
368 directory are accidentally patched. Vim will also delete files starting with | |
369 v:fname_in and ending in ".rej" and ".orig". | |
370 | |
371 vim:tw=78:ts=8:ft=help:norl: |