Mercurial > vim
annotate runtime/doc/diff.txt @ 34548:db67c09ccd53 v9.1.0175
patch 9.1.0175: wrong window positions with 'winfix{width,height}'
Commit: https://github.com/vim/vim/commit/5866bc3a0f54115d5982fdc09bdbe4c45069265a
Author: Sean Dewar <6256228+seandewar@users.noreply.github.com>
Date: Wed Mar 13 20:17:24 2024 +0100
patch 9.1.0175: wrong window positions with 'winfix{width,height}'
Problem: winframe functions incorrectly recompute window positions if
the altframe wasn't adjacent to the closed frame, which is
possible if adjacent windows had 'winfix{width,height}' set.
Solution: recompute for windows within the parent of the altframe and
closed frame. Skip this (as before) if the altframe was
top/left, but only if adjacent to the closed frame, as
positions won't change in that case. Also correct the return
value documentation for win_screenpos. (Sean Dewar)
The issue revealed itself after removing the win_comp_pos call below
winframe_restore in win_splitmove. Similarly, wrong positions could result from
windows closed in other tabpages, as win_free_mem uses winframe_remove (at least
until it is entered later, where enter_tabpage calls win_comp_pos).
NOTE: As win_comp_pos handles only curtab, it's possible via other means for
positions in non-current tabpages to be wrong (e.g: after changing 'laststatus',
'showtabline', etc.). Given enter_tabpage recomputes it, maybe it's intentional
as an optimization? Should probably be documented in win_screenpos then, but I
won't address that here.
closes: #14191
Signed-off-by: Sean Dewar <6256228+seandewar@users.noreply.github.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Wed, 13 Mar 2024 20:30:03 +0100 |
parents | 7ccaadd7cf0b |
children |
rev | line source |
---|---|
34264
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
1 *diff.txt* For Vim version 9.1. Last change: 2024 Feb 01 |
7 | 2 |
3 | |
4 VIM REFERENCE MANUAL by Bram Moolenaar | |
5 | |
6 | |
7 *diff* *vimdiff* *gvimdiff* *diff-mode* | |
9955
f52b263fb3f0
commit https://github.com/vim/vim/commit/015efc32c1add6269099364835ddf85ff257b3c6
Christian Brabandt <cb@256bit.org>
parents:
7228
diff
changeset
|
8 This file describes the |+diff| feature: Showing differences between two to |
f52b263fb3f0
commit https://github.com/vim/vim/commit/015efc32c1add6269099364835ddf85ff257b3c6
Christian Brabandt <cb@256bit.org>
parents:
7228
diff
changeset
|
9 eight versions of the same file. |
7 | 10 |
11 The basics are explained in section |08.7| of the user manual. | |
12 | |
12559 | 13 1. Starting diff mode |start-vimdiff| |
7 | 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 ============================================================================== | |
12559 | 20 1. Starting diff mode *start-vimdiff* |
7 | 21 |
22 The easiest way to start editing in diff mode is with the "vimdiff" command. | |
23 This starts Vim as usual, and additionally sets up for viewing the differences | |
24 between the arguments. > | |
25 | |
26 vimdiff file1 file2 [file3 [file4]] | |
27 | |
28 This is equivalent to: > | |
29 | |
30 vim -d file1 file2 [file3 [file4]] | |
31 | |
32 You may also use "gvimdiff" or "vim -d -g". The GUI is started then. | |
33 You may also use "viewdiff" or "gviewdiff". Vim starts in readonly mode then. | |
34 "r" may be prepended for restricted mode (see |-Z|). | |
35 | |
36 The second and following arguments may also be a directory name. Vim will | |
37 then append the file name of the first argument to the directory name to find | |
38 the file. | |
39 | |
14696
195e8b1fcbbf
patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents:
14519
diff
changeset
|
40 By default an internal diff library will be used. When 'diffopt' or |
195e8b1fcbbf
patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents:
14519
diff
changeset
|
41 'diffexpr' has been set an external "diff" command will be used. This only |
195e8b1fcbbf
patch 8.1.0360: using an external diff program is slow and inflexible
Christian Brabandt <cb@256bit.org>
parents:
14519
diff
changeset
|
42 works when such a diff program is available. |
7 | 43 |
674 | 44 Diffs are local to the current tab page |tab-page|. You can't see diffs with |
45 a window in another tab page. This does make it possible to have several | |
46 diffs at the same time, each in their own tab page. | |
47 | |
7 | 48 What happens is that Vim opens a window for each of the files. This is like |
49 using the |-O| argument. This uses vertical splits. If you prefer horizontal | |
50 splits add the |-o| argument: > | |
51 | |
1698 | 52 vimdiff -o file1 file2 [file3 [file4]] |
7 | 53 |
766 | 54 If you always prefer horizontal splits include "horizontal" in 'diffopt'. |
55 | |
7 | 56 In each of the edited files these options are set: |
57 | |
58 'diff' on | |
59 'scrollbind' on | |
2445
04dae202d316
Fixes for coverity warnings.
Bram Moolenaar <bram@vim.org>
parents:
2413
diff
changeset
|
60 'cursorbind' on |
7 | 61 'scrollopt' includes "hor" |
23895
e313b6ee2d9c
patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents:
18879
diff
changeset
|
62 'wrap' off, or leave as-is if 'diffopt' includes "followwrap" |
7 | 63 'foldmethod' "diff" |
766 | 64 'foldcolumn' value from 'diffopt', default is 2 |
7 | 65 |
66 These options are set local to the window. When editing another file they are | |
67 reset to the global value. | |
2033
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
68 The options can still be overruled from a modeline when re-editing the file. |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
69 However, 'foldmethod' and 'wrap' won't be set from a modeline when 'diff' is |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
70 set. |
18594 | 71 See `:diffoff` for an easy way to revert the options. |
7 | 72 |
73 The differences shown are actually the differences in the buffer. Thus if you | |
74 make changes after loading a file, these will be included in the displayed | |
75 diffs. You might have to do ":diffupdate" now and then, not all changes are | |
18594 | 76 immediately taken into account, especially when using an external diff command. |
7 | 77 |
78 In your .vimrc file you could do something special when Vim was started in | |
79 diff mode. You could use a construct like this: > | |
80 | |
81 if &diff | |
82 setup for diff mode | |
83 else | |
84 setup for non-diff mode | |
85 endif | |
86 | |
87 While already in Vim you can start diff mode in three ways. | |
88 | |
89 *E98* | |
3830 | 90 :diffs[plit] {filename} *:diffs* *:diffsplit* |
7 | 91 Open a new window on the file {filename}. The options are set |
92 as for "vimdiff" for the current and the newly opened window. | |
93 Also see 'diffexpr'. | |
94 | |
95 *:difft* *:diffthis* | |
3830 | 96 :difft[his] Make the current window part of the diff windows. This sets |
16 | 97 the options like for "vimdiff". |
7 | 98 |
5929 | 99 :diffp[atch] {patchfile} *E816* *:diffp* *:diffpatch* |
7 | 100 Use the current buffer, patch it with the diff found in |
101 {patchfile} and open a buffer on the result. The options are | |
102 set as for "vimdiff". | |
103 {patchfile} can be in any format that the "patch" program | |
104 understands or 'patchexpr' can handle. | |
105 Note that {patchfile} should only contain a diff for one file, | |
106 the current file. If {patchfile} contains diffs for other | |
107 files as well, the results are unpredictable. Vim changes | |
108 directory to /tmp to avoid files in the current directory | |
109 accidentally being patched. But it may still result in | |
110 various ".rej" files to be created. And when absolute path | |
111 names are present these files may get patched anyway. | |
32294 | 112 Using the "patch" command is not allowed in |restricted-mode|. |
7 | 113 |
114 To make these commands use a vertical split, prepend |:vertical|. Examples: > | |
115 | |
116 :vert diffsplit main.c~ | |
117 :vert diffpatch /tmp/diff | |
766 | 118 |
119 If you always prefer a vertical split include "vertical" in 'diffopt'. | |
120 | |
7 | 121 *E96* |
9955
f52b263fb3f0
commit https://github.com/vim/vim/commit/015efc32c1add6269099364835ddf85ff257b3c6
Christian Brabandt <cb@256bit.org>
parents:
7228
diff
changeset
|
122 There can be up to eight buffers with 'diff' set. |
7 | 123 |
124 Since the option values are remembered with the buffer, you can edit another | |
125 file for a moment and come back to the same file and be in diff mode again. | |
16 | 126 |
127 *:diffo* *:diffoff* | |
5362
ab1508486b12
Update runtime files. Add support for J.
Bram Moolenaar <bram@vim.org>
parents:
5294
diff
changeset
|
128 :diffo[ff] Switch off diff mode for the current window. Resets related |
ab1508486b12
Update runtime files. Add support for J.
Bram Moolenaar <bram@vim.org>
parents:
5294
diff
changeset
|
129 options also when 'diff' was not set. |
16 | 130 |
3830 | 131 :diffo[ff]! Switch off diff mode for the current window and in all windows |
5362
ab1508486b12
Update runtime files. Add support for J.
Bram Moolenaar <bram@vim.org>
parents:
5294
diff
changeset
|
132 in the current tab page where 'diff' is set. Resetting |
ab1508486b12
Update runtime files. Add support for J.
Bram Moolenaar <bram@vim.org>
parents:
5294
diff
changeset
|
133 related options only happens in a window that has 'diff' set, |
ab1508486b12
Update runtime files. Add support for J.
Bram Moolenaar <bram@vim.org>
parents:
5294
diff
changeset
|
134 if the current window does not have 'diff' set then no options |
ab1508486b12
Update runtime files. Add support for J.
Bram Moolenaar <bram@vim.org>
parents:
5294
diff
changeset
|
135 in it are changed. |
10895
c391bfbdb452
Updated runtime files.
Christian Brabandt <cb@256bit.org>
parents:
10198
diff
changeset
|
136 Hidden buffers are also removed from the list of diff'ed |
c391bfbdb452
Updated runtime files.
Christian Brabandt <cb@256bit.org>
parents:
10198
diff
changeset
|
137 buffers. |
7 | 138 |
6918 | 139 The `:diffoff` command resets the relevant options to the values they had when |
31885 | 140 using `:diffsplit`, `:diffpatch`, `:diffthis`. or starting Vim in diff mode. |
6918 | 141 When using `:diffoff` twice the last saved values are restored. |
5161
f7add3891e95
Updated runtime files. Fix NL translations.
Bram Moolenaar <bram@vim.org>
parents:
5146
diff
changeset
|
142 Otherwise they are set to their default value: |
16 | 143 |
144 'diff' off | |
145 'scrollbind' off | |
2445
04dae202d316
Fixes for coverity warnings.
Bram Moolenaar <bram@vim.org>
parents:
2413
diff
changeset
|
146 'cursorbind' off |
16 | 147 'scrollopt' without "hor" |
23895
e313b6ee2d9c
patch 8.2.2490: 'wrap' option is always reset when starting diff mode
Bram Moolenaar <Bram@vim.org>
parents:
18879
diff
changeset
|
148 'wrap' on, or leave as-is if 'diffopt' includes "followwrap" |
16 | 149 'foldmethod' "manual" |
150 'foldcolumn' 0 | |
7 | 151 |
31579 | 152 'foldenable' will most-likely be reset to off. That is when 'foldmethod' is |
153 is restored to "manual". The folds themselves are not cleared but they should | |
154 not show up, resetting 'foldenable' is the best way to do that. | |
155 | |
7 | 156 ============================================================================== |
157 2. Viewing diffs *view-diffs* | |
158 | |
159 The effect is that the diff windows show the same text, with the differences | |
160 highlighted. When scrolling the text, the 'scrollbind' option will make the | |
161 text in other windows to be scrolled as well. With vertical splits the text | |
162 should be aligned properly. | |
163 | |
164 The alignment of text will go wrong when: | |
165 - 'wrap' is on, some lines will be wrapped and occupy two or more screen | |
166 lines | |
167 - folds are open in one window but not another | |
168 - 'scrollbind' is off | |
169 - changes have been made to the text | |
170 - "filler" is not present in 'diffopt', deleted/inserted lines makes the | |
171 alignment go wrong | |
172 | |
173 All the buffers edited in a window where the 'diff' option is set will join in | |
174 the diff. This is also possible for hidden buffers. They must have been | |
10895
c391bfbdb452
Updated runtime files.
Christian Brabandt <cb@256bit.org>
parents:
10198
diff
changeset
|
175 edited in a window first for this to be possible. To get rid of the hidden |
c391bfbdb452
Updated runtime files.
Christian Brabandt <cb@256bit.org>
parents:
10198
diff
changeset
|
176 buffers use `:diffoff!`. |
7 | 177 |
1121 | 178 *:DiffOrig* *diff-original-file* |
7 | 179 Since 'diff' is a window-local option, it's possible to view the same buffer |
180 in diff mode in one window and "normal" in another window. It is also | |
1121 | 181 possible to view the changes you have made to a buffer since the file was |
182 loaded. Since Vim doesn't allow having two buffers for the same file, you | |
183 need another buffer. This command is useful: > | |
2788 | 184 command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ |
32004 | 185 \ | diffthis | wincmd p | diffthis |
16023 | 186 (this is in |defaults.vim|). Use ":DiffOrig" to see the differences between |
187 the current buffer and the file it was loaded from. | |
7 | 188 |
189 A buffer that is unloaded cannot be used for the diff. But it does work for | |
190 hidden buffers. You can use ":hide" to close a window without unloading the | |
195 | 191 buffer. If you don't want a buffer to remain used for the diff do ":set |
192 nodiff" before hiding it. | |
7 | 193 |
16944 | 194 *:dif* *:diff* *:diffupdate* |
7228
873eae260c97
commit https://github.com/vim/vim/commit/b4ff518d95aa57c2f8c0568c915035bef849581b
Christian Brabandt <cb@256bit.org>
parents:
6918
diff
changeset
|
195 :dif[fupdate][!] Update the diff highlighting and folds. |
270 | 196 |
7 | 197 Vim attempts to keep the differences updated when you make changes to the |
198 text. This mostly takes care of inserted and deleted lines. Changes within a | |
199 line and more complicated changes do not cause the differences to be updated. | |
200 To force the differences to be updated use: > | |
201 | |
202 :diffupdate | |
203 | |
3524 | 204 If the ! is included Vim will check if the file was changed externally and |
205 needs to be reloaded. It will prompt for each changed file, like `:checktime` | |
206 was used. | |
7 | 207 |
208 Vim will show filler lines for lines that are missing in one window but are | |
209 present in another. These lines were inserted in another file or deleted in | |
210 this file. Removing "filler" from the 'diffopt' option will make Vim not | |
211 display these filler lines. | |
212 | |
213 | |
214 Folds are used to hide the text that wasn't changed. See |folding| for all | |
215 the commands that can be used with folds. | |
216 | |
217 The context of lines above a difference that are not included in the fold can | |
218 be set with the 'diffopt' option. For example, to set the context to three | |
219 lines: > | |
220 | |
221 :set diffopt=filler,context:3 | |
222 | |
223 | |
224 The diffs are highlighted with these groups: | |
225 | |
226 |hl-DiffAdd| DiffAdd Added (inserted) lines. These lines exist in | |
227 this buffer but not in another. | |
228 |hl-DiffChange| DiffChange Changed lines. | |
229 |hl-DiffText| DiffText Changed text inside a Changed line. Vim | |
230 finds the first character that is different, | |
231 and the last character that is different | |
232 (searching from the end of the line). The | |
233 text in between is highlighted. This means | |
234 that parts in the middle that are still the | |
12499 | 235 same are highlighted anyway. The 'diffopt' |
236 flags "iwhite" and "icase" are used here. | |
4098 | 237 |hl-DiffDelete| DiffDelete Deleted lines. Also called filler lines, |
7 | 238 because they don't really exist in this |
239 buffer. | |
240 | |
241 ============================================================================== | |
242 3. Jumping to diffs *jumpto-diffs* | |
243 | |
244 Two commands can be used to jump to diffs: | |
245 *[c* | |
246 [c Jump backwards to the previous start of a change. | |
247 When a count is used, do it that many times. | |
248 *]c* | |
249 ]c Jump forwards to the next start of a change. | |
250 When a count is used, do it that many times. | |
251 | |
252 It is an error if there is no change for the cursor to move to. | |
253 | |
254 ============================================================================== | |
255 4. Diff copying *copy-diffs* *E99* *E100* *E101* *E102* *E103* | |
532 | 256 *merge* |
7 | 257 There are two commands to copy text from one buffer to another. The result is |
258 that the buffers will be equal within the specified range. | |
259 | |
260 *:diffg* *:diffget* | |
261 :[range]diffg[et] [bufspec] | |
262 Modify the current buffer to undo difference with another | |
2033
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
263 buffer. If [bufspec] is given, that buffer is used. If |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
264 [bufspec] refers to the current buffer then nothing happens. |
7 | 265 Otherwise this only works if there is one other buffer in diff |
266 mode. | |
267 See below for [range]. | |
268 | |
1121 | 269 *:diffpu* *:diffput* *E793* |
7 | 270 :[range]diffpu[t] [bufspec] |
271 Modify another buffer to undo difference with the current | |
272 buffer. Just like ":diffget" but the other buffer is modified | |
273 instead of the current one. | |
532 | 274 When [bufspec] is omitted and there is more than one other |
275 buffer in diff mode where 'modifiable' is set this fails. | |
7 | 276 See below for [range]. |
277 | |
278 *do* | |
6336 | 279 [count]do Same as ":diffget" without range. The "o" stands for "obtain" |
280 ("dg" can't be used, it could be the start of "dgg"!). Note: | |
281 this doesn't work in Visual mode. | |
282 If you give a [count], it is used as the [bufspec] argument | |
283 for ":diffget". | |
7 | 284 |
285 *dp* | |
6336 | 286 [count]dp Same as ":diffput" without range. Note: this doesn't work in |
287 Visual mode. | |
288 If you give a [count], it is used as the [bufspec] argument | |
289 for ":diffput". | |
2596 | 290 |
7 | 291 |
292 When no [range] is given, the diff at the cursor position or just above it is | |
293 affected. When [range] is used, Vim tries to only put or get the specified | |
294 lines. When there are deleted lines, this may not always be possible. | |
295 | |
296 There can be deleted lines below the last line of the buffer. When the cursor | |
297 is on the last line in the buffer and there is no diff above this line, the | |
298 ":diffget" and "do" commands will obtain lines from the other buffer. | |
299 | |
300 To be able to get those lines from another buffer in a [range] it's allowed to | |
301 use the last line number plus one. This command gets all diffs from the other | |
302 buffer: > | |
303 | |
304 :1,$+1diffget | |
305 | |
306 Note that deleted lines are displayed, but not counted as text lines. You | |
307 can't move the cursor into them. To fill the deleted lines with the lines | |
308 from another buffer use ":diffget" on the line below them. | |
819 | 309 *E787* |
310 When the buffer that is about to be modified is read-only and the autocommand | |
311 that is triggered by |FileChangedRO| changes buffers the command will fail. | |
312 The autocommand must not change buffers. | |
7 | 313 |
314 The [bufspec] argument above can be a buffer number, a pattern for a buffer | |
315 name or a part of a buffer name. Examples: | |
316 | |
317 :diffget Use the other buffer which is in diff mode | |
318 :diffget 3 Use buffer 3 | |
319 :diffget v2 Use the buffer which matches "v2" and is in | |
320 diff mode (e.g., "file.c.v2") | |
321 | |
322 ============================================================================== | |
323 5. Diff options *diff-options* | |
324 | |
325 Also see |'diffopt'| and the "diff" item of |'fillchars'|. | |
326 | |
6583 | 327 *diff-slow* *diff_translations* |
328 For very long lines, the diff syntax highlighting might be slow, especially | |
329 since it tries to match all different kind of localisations. To disable | |
330 localisations and speed up the syntax highlighting, set the global variable | |
331 g:diff_translations to zero: > | |
332 | |
333 let g:diff_translations = 0 | |
334 < | |
12756
3b26420fc639
Long overdue runtime update.
Christian Brabandt <cb@256bit.org>
parents:
12559
diff
changeset
|
335 After setting this variable, reload the syntax script: > |
6583 | 336 |
337 set syntax=diff | |
338 < | |
339 | |
7 | 340 |
341 FINDING THE DIFFERENCES *diff-diffexpr* | |
342 | |
27321 | 343 The 'diffexpr' option can be set to use something else than the internal diff |
344 support or the standard "diff" program to compare two files and find the | |
345 differences. *E959* | |
7 | 346 |
347 When 'diffexpr' is empty, Vim uses this command to find the differences | |
348 between file1 and file2: > | |
349 | |
350 diff file1 file2 > outfile | |
351 | |
352 The ">" is replaced with the value of 'shellredir'. | |
353 | |
24751 | 354 The output of "diff" must be a normal "ed" style diff or a unified diff. A |
355 context diff will NOT work. For a unified diff no context lines can be used. | |
356 Using "diff -u" will NOT work, use "diff -U0". | |
357 | |
358 This example explains the format that Vim expects for the "ed" style diff: > | |
7 | 359 |
360 1a2 | |
361 > bbb | |
362 4d4 | |
363 < 111 | |
364 7c7 | |
365 < GGG | |
366 --- | |
367 > ggg | |
368 | |
369 The "1a2" item appends the line "bbb". | |
370 The "4d4" item deletes the line "111". | |
3750 | 371 The "7c7" item replaces the line "GGG" with "ggg". |
7 | 372 |
2033
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
373 When 'diffexpr' is not empty, Vim evaluates it to obtain a diff file in the |
7 | 374 format mentioned. These variables are set to the file names used: |
375 | |
376 v:fname_in original file | |
377 v:fname_new new version of the same file | |
27321 | 378 v:fname_out where to write the resulting diff file |
7 | 379 |
380 Additionally, 'diffexpr' should take care of "icase" and "iwhite" in the | |
381 'diffopt' option. 'diffexpr' cannot change the value of 'lines' and | |
382 'columns'. | |
383 | |
30598
37aa9fd2ed72
patch 9.0.0634: evaluating "expr" options has more overhead than needed
Bram Moolenaar <Bram@vim.org>
parents:
29314
diff
changeset
|
384 The advantage of using a function call without arguments is that it is faster, |
37aa9fd2ed72
patch 9.0.0634: evaluating "expr" options has more overhead than needed
Bram Moolenaar <Bram@vim.org>
parents:
29314
diff
changeset
|
385 see |expr-option-function|. |
37aa9fd2ed72
patch 9.0.0634: evaluating "expr" options has more overhead than needed
Bram Moolenaar <Bram@vim.org>
parents:
29314
diff
changeset
|
386 |
7 | 387 Example (this does almost the same as 'diffexpr' being empty): > |
388 | |
389 set diffexpr=MyDiff() | |
390 function MyDiff() | |
391 let opt = "" | |
392 if &diffopt =~ "icase" | |
27903 | 393 let opt = opt .. "-i " |
7 | 394 endif |
395 if &diffopt =~ "iwhite" | |
27903 | 396 let opt = opt .. "-b " |
7 | 397 endif |
27903 | 398 silent execute "!diff -a --binary " .. opt .. v:fname_in .. " " .. v:fname_new .. |
399 \ " > " .. v:fname_out | |
14519 | 400 redraw! |
7 | 401 endfunction |
402 | |
403 The "-a" argument is used to force comparing the files as text, comparing as | |
404 binaries isn't useful. The "--binary" argument makes the files read in binary | |
405 mode, so that a CTRL-Z doesn't end the text on DOS. | |
406 | |
14519 | 407 The `redraw!` command may not be needed, depending on whether executing a |
408 shell command shows something on the display or not. | |
409 | |
26743
c2c40cefc17b
patch 8.2.3900: it is not easy to use a script-local function for an option
Bram Moolenaar <Bram@vim.org>
parents:
24751
diff
changeset
|
410 If the 'diffexpr' expression starts with s: or |<SID>|, then it is replaced |
c2c40cefc17b
patch 8.2.3900: it is not easy to use a script-local function for an option
Bram Moolenaar <Bram@vim.org>
parents:
24751
diff
changeset
|
411 with the script ID (|local-function|). Example: > |
c2c40cefc17b
patch 8.2.3900: it is not easy to use a script-local function for an option
Bram Moolenaar <Bram@vim.org>
parents:
24751
diff
changeset
|
412 set diffexpr=s:MyDiffExpr() |
c2c40cefc17b
patch 8.2.3900: it is not easy to use a script-local function for an option
Bram Moolenaar <Bram@vim.org>
parents:
24751
diff
changeset
|
413 set diffexpr=<SID>SomeDiffExpr() |
27321 | 414 Otherwise, the expression is evaluated in the context of the script where the |
415 option was set, thus script-local items are available. | |
416 | |
2033
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
417 *E810* *E97* |
7 | 418 Vim will do a test if the diff output looks alright. If it doesn't, you will |
419 get an error message. Possible causes: | |
420 - The "diff" program cannot be executed. | |
421 - The "diff" program doesn't produce normal "ed" style diffs (see above). | |
422 - The 'shell' and associated options are not set correctly. Try if filtering | |
423 works with a command like ":!sort". | |
424 - You are using 'diffexpr' and it doesn't work. | |
639 | 425 If it's not clear what the problem is set the 'verbose' option to one or more |
426 to see more messages. | |
7 | 427 |
2642 | 428 The self-installing Vim for MS-Windows includes a diff program. If you don't |
429 have it you might want to download a diff.exe. For example from | |
2662 | 430 http://gnuwin32.sourceforge.net/packages/diffutils.htm. |
20 | 431 |
7 | 432 |
433 USING PATCHES *diff-patchexpr* | |
434 | |
435 The 'patchexpr' option can be set to use something else than the standard | |
436 "patch" program. | |
437 | |
438 When 'patchexpr' is empty, Vim will call the "patch" program like this: > | |
439 | |
440 patch -o outfile origfile < patchfile | |
441 | |
442 This should work fine with most versions of the "patch" program. Note that a | |
443 CR in the middle of a line may cause problems, it is seen as a line break. | |
444 | |
445 If the default doesn't work for you, set the 'patchexpr' to an expression that | |
446 will have the same effect. These variables are set to the file names used: | |
447 | |
448 v:fname_in original file | |
449 v:fname_diff patch file | |
450 v:fname_out resulting patched file | |
451 | |
30598
37aa9fd2ed72
patch 9.0.0634: evaluating "expr" options has more overhead than needed
Bram Moolenaar <Bram@vim.org>
parents:
29314
diff
changeset
|
452 The advantage of using a function call without arguments is that it is faster, |
37aa9fd2ed72
patch 9.0.0634: evaluating "expr" options has more overhead than needed
Bram Moolenaar <Bram@vim.org>
parents:
29314
diff
changeset
|
453 see |expr-option-function|. |
37aa9fd2ed72
patch 9.0.0634: evaluating "expr" options has more overhead than needed
Bram Moolenaar <Bram@vim.org>
parents:
29314
diff
changeset
|
454 |
7 | 455 Example (this does the same as 'patchexpr' being empty): > |
456 | |
766 | 457 set patchexpr=MyPatch() |
458 function MyPatch() | |
27903 | 459 :call system("patch -o " .. v:fname_out .. " " .. v:fname_in .. |
460 \ " < " .. v:fname_diff) | |
7 | 461 endfunction |
462 | |
463 Make sure that using the "patch" program doesn't have unwanted side effects. | |
464 For example, watch out for additionally generated files, which should be | |
465 deleted. It should just patch the file and nothing else. | |
466 Vim will change directory to "/tmp" or another temp directory before | |
467 evaluating 'patchexpr'. This hopefully avoids that files in the current | |
468 directory are accidentally patched. Vim will also delete files starting with | |
469 v:fname_in and ending in ".rej" and ".orig". | |
470 | |
26743
c2c40cefc17b
patch 8.2.3900: it is not easy to use a script-local function for an option
Bram Moolenaar <Bram@vim.org>
parents:
24751
diff
changeset
|
471 If the 'patchexpr' expression starts with s: or |<SID>|, then it is replaced |
c2c40cefc17b
patch 8.2.3900: it is not easy to use a script-local function for an option
Bram Moolenaar <Bram@vim.org>
parents:
24751
diff
changeset
|
472 with the script ID (|local-function|). Example: > |
c2c40cefc17b
patch 8.2.3900: it is not easy to use a script-local function for an option
Bram Moolenaar <Bram@vim.org>
parents:
24751
diff
changeset
|
473 set patchexpr=s:MyPatchExpr() |
c2c40cefc17b
patch 8.2.3900: it is not easy to use a script-local function for an option
Bram Moolenaar <Bram@vim.org>
parents:
24751
diff
changeset
|
474 set patchexpr=<SID>SomePatchExpr() |
27321 | 475 Otherwise, the expression is evaluated in the context of the script where the |
476 option was set, thus script-local items are available. | |
477 | |
478 | |
34264
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
479 DIFF FUNCTION EXAMPLES *diff-func-examples* |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
480 |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
481 Some examples for using the |diff()| function to compute the diff indices |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
482 between two Lists of strings are below. |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
483 > |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
484 " some lines are changed |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
485 :echo diff(['abc', 'def', 'ghi'], ['abx', 'rrr', 'xhi'], {'output': 'indices'}) |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
486 [{'from_idx': 0, 'from_count': 3, 'to_idx': 0, 'to_count': 3}] |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
487 |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
488 " few lines added at the beginning |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
489 :echo diff(['ghi'], ['abc', 'def', 'ghi'], {'output': 'indices'}) |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
490 [{'from_idx': 0, 'from_count': 0, 'to_idx': 0, 'to_count': 2}] |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
491 |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
492 " few lines removed from the beginning |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
493 :echo diff(['abc', 'def', 'ghi'], ['ghi'], {'output': 'indices'}) |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
494 [{'from_idx': 0, 'from_count': 2, 'to_idx': 0, 'to_count': 0}] |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
495 |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
496 " few lines added in the middle |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
497 :echo diff(['abc', 'jkl'], ['abc', 'def', 'ghi', 'jkl'], {'output': 'indices'}) |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
498 [{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}] |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
499 |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
500 " few lines removed in the middle |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
501 :echo diff(['abc', 'def', 'ghi', 'jkl'], ['abc', 'jkl'], {'output': 'indices'}) |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
502 [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}] |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
503 |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
504 " few lines added at the end |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
505 :echo diff(['abc'], ['abc', 'def', 'ghi'], {'output': 'indices'}) |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
506 [{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}] |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
507 |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
508 " few lines removed from the end |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
509 :echo diff(['abc', 'def', 'ghi'], ['abc'], {'output': 'indices'}) |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
510 [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}] |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
511 |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
512 " disjointed changes |
34332
7ccaadd7cf0b
patch 9.1.0099: Not able to use diff() with 'diffexpr'
Christian Brabandt <cb@256bit.org>
parents:
34264
diff
changeset
|
513 :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices', 'context': 0}) |
34264
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
514 [{'from_idx': 0, 'from_count': 1, 'to_idx': 0, 'to_count': 1}, |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
515 {'from_idx': 3, 'from_count': 1, 'to_idx': 3, 'to_count': 1}] |
34332
7ccaadd7cf0b
patch 9.1.0099: Not able to use diff() with 'diffexpr'
Christian Brabandt <cb@256bit.org>
parents:
34264
diff
changeset
|
516 |
7ccaadd7cf0b
patch 9.1.0099: Not able to use diff() with 'diffexpr'
Christian Brabandt <cb@256bit.org>
parents:
34264
diff
changeset
|
517 " disjointed changes with context length 1 |
7ccaadd7cf0b
patch 9.1.0099: Not able to use diff() with 'diffexpr'
Christian Brabandt <cb@256bit.org>
parents:
34264
diff
changeset
|
518 :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices', 'context': 1}) |
7ccaadd7cf0b
patch 9.1.0099: Not able to use diff() with 'diffexpr'
Christian Brabandt <cb@256bit.org>
parents:
34264
diff
changeset
|
519 [{'from_idx': 0, 'from_count': 4, 'to_idx': 0, 'to_count': 4}] |
7ccaadd7cf0b
patch 9.1.0099: Not able to use diff() with 'diffexpr'
Christian Brabandt <cb@256bit.org>
parents:
34264
diff
changeset
|
520 |
34264
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
521 < |
cce6b834635c
patch 9.1.0071: Need a diff() Vim script function
Christian Brabandt <cb@256bit.org>
parents:
34057
diff
changeset
|
522 |
14421 | 523 vim:tw=78:ts=8:noet:ft=help:norl: |