Bram Moolenaar | 37c64c7 | 2017-09-19 22:06:03 +0200 | [diff] [blame] | 1 | *diff.txt* For Vim version 8.0. Last change: 2017 Sep 02 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 2 | |
| 3 | |
| 4 | VIM REFERENCE MANUAL by Bram Moolenaar |
| 5 | |
| 6 | |
| 7 | *diff* *vimdiff* *gvimdiff* *diff-mode* |
Bram Moolenaar | 015efc3 | 2016-08-24 22:34:33 +0200 | [diff] [blame] | 8 | This file describes the |+diff| feature: Showing differences between two to |
| 9 | eight versions of the same file. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | e37d50a | 2008-08-06 17:06:04 +0000 | [diff] [blame] | 52 | vimdiff -o file1 file2 [file3 [file4]] |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 53 | |
Bram Moolenaar | 7d47b6e | 2006-03-15 22:59:18 +0000 | [diff] [blame] | 54 | If you always prefer horizontal splits include "horizontal" in 'diffopt'. |
| 55 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 56 | In each of the edited files these options are set: |
| 57 | |
| 58 | 'diff' on |
| 59 | 'scrollbind' on |
Bram Moolenaar | a9d52e3 | 2010-07-31 16:44:19 +0200 | [diff] [blame] | 60 | 'cursorbind' on |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 61 | 'scrollopt' includes "hor" |
| 62 | 'wrap' off |
| 63 | 'foldmethod' "diff" |
Bram Moolenaar | 7d47b6e | 2006-03-15 22:59:18 +0000 | [diff] [blame] | 64 | 'foldcolumn' value from 'diffopt', default is 2 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 65 | |
| 66 | These options are set local to the window. When editing another file they are |
| 67 | reset to the global value. |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 68 | The options can still be overruled from a modeline when re-editing the file. |
| 69 | However, 'foldmethod' and 'wrap' won't be set from a modeline when 'diff' is |
| 70 | set. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 71 | |
| 72 | The differences shown are actually the differences in the buffer. Thus if you |
| 73 | make changes after loading a file, these will be included in the displayed |
| 74 | diffs. You might have to do ":diffupdate" now and then, not all changes are |
| 75 | immediately taken into account. |
| 76 | |
| 77 | In your .vimrc file you could do something special when Vim was started in |
| 78 | diff mode. You could use a construct like this: > |
| 79 | |
| 80 | if &diff |
| 81 | setup for diff mode |
| 82 | else |
| 83 | setup for non-diff mode |
| 84 | endif |
| 85 | |
| 86 | While already in Vim you can start diff mode in three ways. |
| 87 | |
| 88 | *E98* |
Bram Moolenaar | d09acef | 2012-09-21 14:54:30 +0200 | [diff] [blame] | 89 | :diffs[plit] {filename} *:diffs* *:diffsplit* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 90 | Open a new window on the file {filename}. The options are set |
| 91 | as for "vimdiff" for the current and the newly opened window. |
| 92 | Also see 'diffexpr'. |
| 93 | |
| 94 | *:difft* *:diffthis* |
Bram Moolenaar | d09acef | 2012-09-21 14:54:30 +0200 | [diff] [blame] | 95 | :difft[his] Make the current window part of the diff windows. This sets |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 96 | the options like for "vimdiff". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 97 | |
Bram Moolenaar | 1360030 | 2014-05-22 18:26:40 +0200 | [diff] [blame] | 98 | :diffp[atch] {patchfile} *E816* *:diffp* *:diffpatch* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 99 | Use the current buffer, patch it with the diff found in |
| 100 | {patchfile} and open a buffer on the result. The options are |
| 101 | set as for "vimdiff". |
| 102 | {patchfile} can be in any format that the "patch" program |
| 103 | understands or 'patchexpr' can handle. |
| 104 | Note that {patchfile} should only contain a diff for one file, |
| 105 | the current file. If {patchfile} contains diffs for other |
| 106 | files as well, the results are unpredictable. Vim changes |
| 107 | directory to /tmp to avoid files in the current directory |
| 108 | accidentally being patched. But it may still result in |
| 109 | various ".rej" files to be created. And when absolute path |
| 110 | names are present these files may get patched anyway. |
| 111 | |
| 112 | To make these commands use a vertical split, prepend |:vertical|. Examples: > |
| 113 | |
| 114 | :vert diffsplit main.c~ |
| 115 | :vert diffpatch /tmp/diff |
Bram Moolenaar | 7d47b6e | 2006-03-15 22:59:18 +0000 | [diff] [blame] | 116 | |
| 117 | If you always prefer a vertical split include "vertical" in 'diffopt'. |
| 118 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 119 | *E96* |
Bram Moolenaar | 015efc3 | 2016-08-24 22:34:33 +0200 | [diff] [blame] | 120 | There can be up to eight buffers with 'diff' set. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 121 | |
| 122 | Since the option values are remembered with the buffer, you can edit another |
| 123 | file for a moment and come back to the same file and be in diff mode again. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 124 | |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 125 | *:diffo* *:diffoff* |
Bram Moolenaar | baca7f7 | 2013-09-22 14:42:24 +0200 | [diff] [blame] | 126 | :diffo[ff] Switch off diff mode for the current window. Resets related |
| 127 | options also when 'diff' was not set. |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 128 | |
Bram Moolenaar | d09acef | 2012-09-21 14:54:30 +0200 | [diff] [blame] | 129 | :diffo[ff]! Switch off diff mode for the current window and in all windows |
Bram Moolenaar | baca7f7 | 2013-09-22 14:42:24 +0200 | [diff] [blame] | 130 | in the current tab page where 'diff' is set. Resetting |
| 131 | related options only happens in a window that has 'diff' set, |
| 132 | if the current window does not have 'diff' set then no options |
| 133 | in it are changed. |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 134 | Hidden buffers are also removed from the list of diff'ed |
| 135 | buffers. |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 136 | |
Bram Moolenaar | 86ae720 | 2015-07-10 19:31:35 +0200 | [diff] [blame] | 137 | The `:diffoff` command resets the relevant options to the values they had when |
| 138 | using `:diffsplit`, `:diffpatch` , `:diffthis`. or starting Vim in diff mode. |
| 139 | When using `:diffoff` twice the last saved values are restored. |
Bram Moolenaar | dd007ed | 2013-07-09 15:44:17 +0200 | [diff] [blame] | 140 | Otherwise they are set to their default value: |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 141 | |
| 142 | 'diff' off |
| 143 | 'scrollbind' off |
Bram Moolenaar | a9d52e3 | 2010-07-31 16:44:19 +0200 | [diff] [blame] | 144 | 'cursorbind' off |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 145 | 'scrollopt' without "hor" |
| 146 | 'wrap' on |
| 147 | 'foldmethod' "manual" |
| 148 | 'foldcolumn' 0 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 149 | |
| 150 | ============================================================================== |
| 151 | 2. Viewing diffs *view-diffs* |
| 152 | |
| 153 | The effect is that the diff windows show the same text, with the differences |
| 154 | highlighted. When scrolling the text, the 'scrollbind' option will make the |
| 155 | text in other windows to be scrolled as well. With vertical splits the text |
| 156 | should be aligned properly. |
| 157 | |
| 158 | The alignment of text will go wrong when: |
| 159 | - 'wrap' is on, some lines will be wrapped and occupy two or more screen |
| 160 | lines |
| 161 | - folds are open in one window but not another |
| 162 | - 'scrollbind' is off |
| 163 | - changes have been made to the text |
| 164 | - "filler" is not present in 'diffopt', deleted/inserted lines makes the |
| 165 | alignment go wrong |
| 166 | |
| 167 | All the buffers edited in a window where the 'diff' option is set will join in |
| 168 | the diff. This is also possible for hidden buffers. They must have been |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 169 | edited in a window first for this to be possible. To get rid of the hidden |
| 170 | buffers use `:diffoff!`. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 171 | |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 172 | *:DiffOrig* *diff-original-file* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 173 | Since 'diff' is a window-local option, it's possible to view the same buffer |
| 174 | in diff mode in one window and "normal" in another window. It is also |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 175 | possible to view the changes you have made to a buffer since the file was |
| 176 | loaded. Since Vim doesn't allow having two buffers for the same file, you |
| 177 | need another buffer. This command is useful: > |
Bram Moolenaar | 8e5af3e | 2011-04-28 19:02:44 +0200 | [diff] [blame] | 178 | command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ |
| 179 | \ | diffthis | wincmd p | diffthis |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 180 | (this is in |vimrc_example.vim|). Use ":DiffOrig" to see the differences |
| 181 | between the current buffer and the file it was loaded from. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 182 | |
| 183 | A buffer that is unloaded cannot be used for the diff. But it does work for |
| 184 | hidden buffers. You can use ":hide" to close a window without unloading the |
Bram Moolenaar | 111ff9f | 2005-03-08 22:40:03 +0000 | [diff] [blame] | 185 | buffer. If you don't want a buffer to remain used for the diff do ":set |
| 186 | nodiff" before hiding it. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 187 | |
Bram Moolenaar | b4ff518 | 2015-11-10 21:15:48 +0100 | [diff] [blame] | 188 | *:dif* *:diffupdate* |
| 189 | :dif[fupdate][!] Update the diff highlighting and folds. |
Bram Moolenaar | a7fc010 | 2005-05-18 22:17:12 +0000 | [diff] [blame] | 190 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 191 | Vim attempts to keep the differences updated when you make changes to the |
| 192 | text. This mostly takes care of inserted and deleted lines. Changes within a |
| 193 | line and more complicated changes do not cause the differences to be updated. |
| 194 | To force the differences to be updated use: > |
| 195 | |
| 196 | :diffupdate |
| 197 | |
Bram Moolenaar | bd1d560 | 2012-05-18 18:47:17 +0200 | [diff] [blame] | 198 | If the ! is included Vim will check if the file was changed externally and |
| 199 | needs to be reloaded. It will prompt for each changed file, like `:checktime` |
| 200 | was used. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 201 | |
| 202 | Vim will show filler lines for lines that are missing in one window but are |
| 203 | present in another. These lines were inserted in another file or deleted in |
| 204 | this file. Removing "filler" from the 'diffopt' option will make Vim not |
| 205 | display these filler lines. |
| 206 | |
| 207 | |
| 208 | Folds are used to hide the text that wasn't changed. See |folding| for all |
| 209 | the commands that can be used with folds. |
| 210 | |
| 211 | The context of lines above a difference that are not included in the fold can |
| 212 | be set with the 'diffopt' option. For example, to set the context to three |
| 213 | lines: > |
| 214 | |
| 215 | :set diffopt=filler,context:3 |
| 216 | |
| 217 | |
| 218 | The diffs are highlighted with these groups: |
| 219 | |
| 220 | |hl-DiffAdd| DiffAdd Added (inserted) lines. These lines exist in |
| 221 | this buffer but not in another. |
| 222 | |hl-DiffChange| DiffChange Changed lines. |
| 223 | |hl-DiffText| DiffText Changed text inside a Changed line. Vim |
| 224 | finds the first character that is different, |
| 225 | and the last character that is different |
| 226 | (searching from the end of the line). The |
| 227 | text in between is highlighted. This means |
| 228 | that parts in the middle that are still the |
Bram Moolenaar | 37c64c7 | 2017-09-19 22:06:03 +0200 | [diff] [blame] | 229 | same are highlighted anyway. The 'diffopt' |
| 230 | flags "iwhite" and "icase" are used here. |
Bram Moolenaar | fa13eef | 2013-02-06 17:34:04 +0100 | [diff] [blame] | 231 | |hl-DiffDelete| DiffDelete Deleted lines. Also called filler lines, |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 232 | because they don't really exist in this |
| 233 | buffer. |
| 234 | |
| 235 | ============================================================================== |
| 236 | 3. Jumping to diffs *jumpto-diffs* |
| 237 | |
| 238 | Two commands can be used to jump to diffs: |
| 239 | *[c* |
| 240 | [c Jump backwards to the previous start of a change. |
| 241 | When a count is used, do it that many times. |
| 242 | *]c* |
| 243 | ]c Jump forwards to the next start of a change. |
| 244 | When a count is used, do it that many times. |
| 245 | |
| 246 | It is an error if there is no change for the cursor to move to. |
| 247 | |
| 248 | ============================================================================== |
| 249 | 4. Diff copying *copy-diffs* *E99* *E100* *E101* *E102* *E103* |
Bram Moolenaar | 1e01546 | 2005-09-25 22:16:38 +0000 | [diff] [blame] | 250 | *merge* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 251 | There are two commands to copy text from one buffer to another. The result is |
| 252 | that the buffers will be equal within the specified range. |
| 253 | |
| 254 | *:diffg* *:diffget* |
| 255 | :[range]diffg[et] [bufspec] |
| 256 | Modify the current buffer to undo difference with another |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 257 | buffer. If [bufspec] is given, that buffer is used. If |
| 258 | [bufspec] refers to the current buffer then nothing happens. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 259 | Otherwise this only works if there is one other buffer in diff |
| 260 | mode. |
| 261 | See below for [range]. |
| 262 | |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 263 | *:diffpu* *:diffput* *E793* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 264 | :[range]diffpu[t] [bufspec] |
| 265 | Modify another buffer to undo difference with the current |
| 266 | buffer. Just like ":diffget" but the other buffer is modified |
| 267 | instead of the current one. |
Bram Moolenaar | 1e01546 | 2005-09-25 22:16:38 +0000 | [diff] [blame] | 268 | When [bufspec] is omitted and there is more than one other |
| 269 | buffer in diff mode where 'modifiable' is set this fails. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 270 | See below for [range]. |
| 271 | |
| 272 | *do* |
Bram Moolenaar | 32efaf6 | 2014-11-05 17:02:17 +0100 | [diff] [blame] | 273 | [count]do Same as ":diffget" without range. The "o" stands for "obtain" |
| 274 | ("dg" can't be used, it could be the start of "dgg"!). Note: |
| 275 | this doesn't work in Visual mode. |
| 276 | If you give a [count], it is used as the [bufspec] argument |
| 277 | for ":diffget". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 278 | |
| 279 | *dp* |
Bram Moolenaar | 32efaf6 | 2014-11-05 17:02:17 +0100 | [diff] [blame] | 280 | [count]dp Same as ":diffput" without range. Note: this doesn't work in |
| 281 | Visual mode. |
| 282 | If you give a [count], it is used as the [bufspec] argument |
| 283 | for ":diffput". |
Bram Moolenaar | 4a74803 | 2010-09-30 21:47:56 +0200 | [diff] [blame] | 284 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 285 | |
| 286 | When no [range] is given, the diff at the cursor position or just above it is |
| 287 | affected. When [range] is used, Vim tries to only put or get the specified |
| 288 | lines. When there are deleted lines, this may not always be possible. |
| 289 | |
| 290 | There can be deleted lines below the last line of the buffer. When the cursor |
| 291 | is on the last line in the buffer and there is no diff above this line, the |
| 292 | ":diffget" and "do" commands will obtain lines from the other buffer. |
| 293 | |
| 294 | To be able to get those lines from another buffer in a [range] it's allowed to |
| 295 | use the last line number plus one. This command gets all diffs from the other |
| 296 | buffer: > |
| 297 | |
| 298 | :1,$+1diffget |
| 299 | |
| 300 | Note that deleted lines are displayed, but not counted as text lines. You |
| 301 | can't move the cursor into them. To fill the deleted lines with the lines |
| 302 | from another buffer use ":diffget" on the line below them. |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 303 | *E787* |
| 304 | When the buffer that is about to be modified is read-only and the autocommand |
| 305 | that is triggered by |FileChangedRO| changes buffers the command will fail. |
| 306 | The autocommand must not change buffers. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 307 | |
| 308 | The [bufspec] argument above can be a buffer number, a pattern for a buffer |
| 309 | name or a part of a buffer name. Examples: |
| 310 | |
| 311 | :diffget Use the other buffer which is in diff mode |
| 312 | :diffget 3 Use buffer 3 |
| 313 | :diffget v2 Use the buffer which matches "v2" and is in |
| 314 | diff mode (e.g., "file.c.v2") |
| 315 | |
| 316 | ============================================================================== |
| 317 | 5. Diff options *diff-options* |
| 318 | |
| 319 | Also see |'diffopt'| and the "diff" item of |'fillchars'|. |
| 320 | |
Bram Moolenaar | 0122c40 | 2015-02-03 19:13:34 +0100 | [diff] [blame] | 321 | *diff-slow* *diff_translations* |
| 322 | For very long lines, the diff syntax highlighting might be slow, especially |
| 323 | since it tries to match all different kind of localisations. To disable |
| 324 | localisations and speed up the syntax highlighting, set the global variable |
| 325 | g:diff_translations to zero: > |
| 326 | |
| 327 | let g:diff_translations = 0 |
| 328 | < |
| 329 | After setting this variable, Reload the syntax script: > |
| 330 | |
| 331 | set syntax=diff |
| 332 | < |
| 333 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 334 | |
| 335 | FINDING THE DIFFERENCES *diff-diffexpr* |
| 336 | |
| 337 | The 'diffexpr' option can be set to use something else than the standard |
| 338 | "diff" program to compare two files and find the differences. |
| 339 | |
| 340 | When 'diffexpr' is empty, Vim uses this command to find the differences |
| 341 | between file1 and file2: > |
| 342 | |
| 343 | diff file1 file2 > outfile |
| 344 | |
| 345 | The ">" is replaced with the value of 'shellredir'. |
| 346 | |
| 347 | The output of "diff" must be a normal "ed" style diff. Do NOT use a context |
| 348 | diff. This example explains the format that Vim expects: > |
| 349 | |
| 350 | 1a2 |
| 351 | > bbb |
| 352 | 4d4 |
| 353 | < 111 |
| 354 | 7c7 |
| 355 | < GGG |
| 356 | --- |
| 357 | > ggg |
| 358 | |
| 359 | The "1a2" item appends the line "bbb". |
| 360 | The "4d4" item deletes the line "111". |
Bram Moolenaar | 9b45125 | 2012-08-15 17:43:31 +0200 | [diff] [blame] | 361 | The "7c7" item replaces the line "GGG" with "ggg". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 362 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 363 | When 'diffexpr' is not empty, Vim evaluates it to obtain a diff file in the |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 364 | format mentioned. These variables are set to the file names used: |
| 365 | |
| 366 | v:fname_in original file |
| 367 | v:fname_new new version of the same file |
| 368 | v:fname_out resulting diff file |
| 369 | |
| 370 | Additionally, 'diffexpr' should take care of "icase" and "iwhite" in the |
| 371 | 'diffopt' option. 'diffexpr' cannot change the value of 'lines' and |
| 372 | 'columns'. |
| 373 | |
| 374 | Example (this does almost the same as 'diffexpr' being empty): > |
| 375 | |
| 376 | set diffexpr=MyDiff() |
| 377 | function MyDiff() |
| 378 | let opt = "" |
| 379 | if &diffopt =~ "icase" |
| 380 | let opt = opt . "-i " |
| 381 | endif |
| 382 | if &diffopt =~ "iwhite" |
| 383 | let opt = opt . "-b " |
| 384 | endif |
| 385 | silent execute "!diff -a --binary " . opt . v:fname_in . " " . v:fname_new . |
| 386 | \ " > " . v:fname_out |
| 387 | endfunction |
| 388 | |
| 389 | The "-a" argument is used to force comparing the files as text, comparing as |
| 390 | binaries isn't useful. The "--binary" argument makes the files read in binary |
| 391 | mode, so that a CTRL-Z doesn't end the text on DOS. |
| 392 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 393 | *E810* *E97* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 394 | Vim will do a test if the diff output looks alright. If it doesn't, you will |
| 395 | get an error message. Possible causes: |
| 396 | - The "diff" program cannot be executed. |
| 397 | - The "diff" program doesn't produce normal "ed" style diffs (see above). |
| 398 | - The 'shell' and associated options are not set correctly. Try if filtering |
| 399 | works with a command like ":!sort". |
| 400 | - You are using 'diffexpr' and it doesn't work. |
Bram Moolenaar | 71fe80d | 2006-01-22 23:25:56 +0000 | [diff] [blame] | 401 | If it's not clear what the problem is set the 'verbose' option to one or more |
| 402 | to see more messages. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 403 | |
Bram Moolenaar | 166af9b | 2010-11-16 20:34:40 +0100 | [diff] [blame] | 404 | The self-installing Vim for MS-Windows includes a diff program. If you don't |
| 405 | have it you might want to download a diff.exe. For example from |
Bram Moolenaar | 81af925 | 2010-12-10 20:35:50 +0100 | [diff] [blame] | 406 | http://gnuwin32.sourceforge.net/packages/diffutils.htm. |
Bram Moolenaar | 5eb86f9 | 2004-07-26 12:53:41 +0000 | [diff] [blame] | 407 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 408 | |
| 409 | USING PATCHES *diff-patchexpr* |
| 410 | |
| 411 | The 'patchexpr' option can be set to use something else than the standard |
| 412 | "patch" program. |
| 413 | |
| 414 | When 'patchexpr' is empty, Vim will call the "patch" program like this: > |
| 415 | |
| 416 | patch -o outfile origfile < patchfile |
| 417 | |
| 418 | This should work fine with most versions of the "patch" program. Note that a |
| 419 | CR in the middle of a line may cause problems, it is seen as a line break. |
| 420 | |
| 421 | If the default doesn't work for you, set the 'patchexpr' to an expression that |
| 422 | will have the same effect. These variables are set to the file names used: |
| 423 | |
| 424 | v:fname_in original file |
| 425 | v:fname_diff patch file |
| 426 | v:fname_out resulting patched file |
| 427 | |
| 428 | Example (this does the same as 'patchexpr' being empty): > |
| 429 | |
Bram Moolenaar | 7d47b6e | 2006-03-15 22:59:18 +0000 | [diff] [blame] | 430 | set patchexpr=MyPatch() |
| 431 | function MyPatch() |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 432 | :call system("patch -o " . v:fname_out . " " . v:fname_in . |
| 433 | \ " < " . v:fname_diff) |
| 434 | endfunction |
| 435 | |
| 436 | Make sure that using the "patch" program doesn't have unwanted side effects. |
| 437 | For example, watch out for additionally generated files, which should be |
| 438 | deleted. It should just patch the file and nothing else. |
| 439 | Vim will change directory to "/tmp" or another temp directory before |
| 440 | evaluating 'patchexpr'. This hopefully avoids that files in the current |
| 441 | directory are accidentally patched. Vim will also delete files starting with |
| 442 | v:fname_in and ending in ".rej" and ".orig". |
| 443 | |
| 444 | vim:tw=78:ts=8:ft=help:norl: |