Yegappan Lakshmanan | fa37835 | 2024-02-01 22:05:27 +0100 | [diff] [blame] | 1 | *diff.txt* For Vim version 9.1. Last change: 2024 Feb 01 |
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 | |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 13 | 1. Starting diff mode |start-vimdiff| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 19 | ============================================================================== |
Bram Moolenaar | 24a98a0 | 2017-09-27 22:23:55 +0200 | [diff] [blame] | 20 | 1. Starting diff mode *start-vimdiff* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | e828b76 | 2018-09-10 17:51:58 +0200 | [diff] [blame] | 40 | By default an internal diff library will be used. When 'diffopt' or |
| 41 | 'diffexpr' has been set an external "diff" command will be used. This only |
| 42 | works when such a diff program is available. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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" |
Bram Moolenaar | 4223d43 | 2021-02-10 13:18:17 +0100 | [diff] [blame] | 62 | 'wrap' off, or leave as-is if 'diffopt' includes "followwrap" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | 5ef1c6a | 2019-11-10 22:09:11 +0100 | [diff] [blame] | 71 | See `:diffoff` for an easy way to revert the options. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 5ef1c6a | 2019-11-10 22:09:11 +0100 | [diff] [blame] | 76 | immediately taken into account, especially when using an external diff command. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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* |
Bram Moolenaar | d09acef | 2012-09-21 14:54:30 +0200 | [diff] [blame] | 90 | :diffs[plit] {filename} *:diffs* *:diffsplit* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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* |
Bram Moolenaar | d09acef | 2012-09-21 14:54:30 +0200 | [diff] [blame] | 96 | :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] | 97 | the options like for "vimdiff". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 98 | |
Bram Moolenaar | 1360030 | 2014-05-22 18:26:40 +0200 | [diff] [blame] | 99 | :diffp[atch] {patchfile} *E816* *:diffp* *:diffpatch* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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. |
Bram Moolenaar | 71badf9 | 2023-04-22 22:40:14 +0100 | [diff] [blame] | 112 | Using the "patch" command is not allowed in |restricted-mode|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 113 | |
| 114 | To make these commands use a vertical split, prepend |:vertical|. Examples: > |
| 115 | |
| 116 | :vert diffsplit main.c~ |
| 117 | :vert diffpatch /tmp/diff |
Bram Moolenaar | 7d47b6e | 2006-03-15 22:59:18 +0000 | [diff] [blame] | 118 | |
| 119 | If you always prefer a vertical split include "vertical" in 'diffopt'. |
| 120 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 121 | *E96* |
Bram Moolenaar | 015efc3 | 2016-08-24 22:34:33 +0200 | [diff] [blame] | 122 | There can be up to eight buffers with 'diff' set. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 126 | |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 127 | *:diffo* *:diffoff* |
Bram Moolenaar | baca7f7 | 2013-09-22 14:42:24 +0200 | [diff] [blame] | 128 | :diffo[ff] Switch off diff mode for the current window. Resets related |
| 129 | options also when 'diff' was not set. |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 130 | |
Bram Moolenaar | d09acef | 2012-09-21 14:54:30 +0200 | [diff] [blame] | 131 | :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] | 132 | in the current tab page where 'diff' is set. Resetting |
| 133 | related options only happens in a window that has 'diff' set, |
| 134 | if the current window does not have 'diff' set then no options |
| 135 | in it are changed. |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 136 | Hidden buffers are also removed from the list of diff'ed |
| 137 | buffers. |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 138 | |
Bram Moolenaar | 86ae720 | 2015-07-10 19:31:35 +0200 | [diff] [blame] | 139 | The `:diffoff` command resets the relevant options to the values they had when |
Bram Moolenaar | be4e016 | 2023-02-02 13:59:48 +0000 | [diff] [blame] | 140 | using `:diffsplit`, `:diffpatch`, `:diffthis`. or starting Vim in diff mode. |
Bram Moolenaar | 86ae720 | 2015-07-10 19:31:35 +0200 | [diff] [blame] | 141 | When using `:diffoff` twice the last saved values are restored. |
Bram Moolenaar | dd007ed | 2013-07-09 15:44:17 +0200 | [diff] [blame] | 142 | Otherwise they are set to their default value: |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 143 | |
| 144 | 'diff' off |
| 145 | 'scrollbind' off |
Bram Moolenaar | a9d52e3 | 2010-07-31 16:44:19 +0200 | [diff] [blame] | 146 | 'cursorbind' off |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 147 | 'scrollopt' without "hor" |
Bram Moolenaar | 4223d43 | 2021-02-10 13:18:17 +0100 | [diff] [blame] | 148 | 'wrap' on, or leave as-is if 'diffopt' includes "followwrap" |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 149 | 'foldmethod' "manual" |
| 150 | 'foldcolumn' 0 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 151 | |
Bram Moolenaar | f1dcd14 | 2022-12-31 15:30:45 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 175 | edited in a window first for this to be possible. To get rid of the hidden |
| 176 | buffers use `:diffoff!`. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 177 | |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 178 | *:DiffOrig* *diff-original-file* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 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: > |
Bram Moolenaar | 8e5af3e | 2011-04-28 19:02:44 +0200 | [diff] [blame] | 184 | command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ |
Bram Moolenaar | 938ae28 | 2023-02-20 20:44:55 +0000 | [diff] [blame] | 185 | \ | diffthis | wincmd p | diffthis |
Bram Moolenaar | 2696761 | 2019-03-17 17:13:16 +0100 | [diff] [blame] | 186 | (this is in |defaults.vim|). Use ":DiffOrig" to see the differences between |
| 187 | the current buffer and the file it was loaded from. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 111ff9f | 2005-03-08 22:40:03 +0000 | [diff] [blame] | 191 | buffer. If you don't want a buffer to remain used for the diff do ":set |
| 192 | nodiff" before hiding it. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 193 | |
Bram Moolenaar | 61da1bf | 2019-06-06 12:14:49 +0200 | [diff] [blame] | 194 | *:dif* *:diff* *:diffupdate* |
Bram Moolenaar | b4ff518 | 2015-11-10 21:15:48 +0100 | [diff] [blame] | 195 | :dif[fupdate][!] Update the diff highlighting and folds. |
Bram Moolenaar | a7fc010 | 2005-05-18 22:17:12 +0000 | [diff] [blame] | 196 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | bd1d560 | 2012-05-18 18:47:17 +0200 | [diff] [blame] | 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. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 37c64c7 | 2017-09-19 22:06:03 +0200 | [diff] [blame] | 235 | same are highlighted anyway. The 'diffopt' |
| 236 | flags "iwhite" and "icase" are used here. |
Bram Moolenaar | fa13eef | 2013-02-06 17:34:04 +0100 | [diff] [blame] | 237 | |hl-DiffDelete| DiffDelete Deleted lines. Also called filler lines, |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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* |
Bram Moolenaar | 1e01546 | 2005-09-25 22:16:38 +0000 | [diff] [blame] | 256 | *merge* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 263 | buffer. If [bufspec] is given, that buffer is used. If |
| 264 | [bufspec] refers to the current buffer then nothing happens. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 265 | Otherwise this only works if there is one other buffer in diff |
| 266 | mode. |
| 267 | See below for [range]. |
| 268 | |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 269 | *:diffpu* *:diffput* *E793* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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. |
Bram Moolenaar | 1e01546 | 2005-09-25 22:16:38 +0000 | [diff] [blame] | 274 | When [bufspec] is omitted and there is more than one other |
| 275 | buffer in diff mode where 'modifiable' is set this fails. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 276 | See below for [range]. |
| 277 | |
| 278 | *do* |
Bram Moolenaar | 32efaf6 | 2014-11-05 17:02:17 +0100 | [diff] [blame] | 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". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 284 | |
| 285 | *dp* |
Bram Moolenaar | 32efaf6 | 2014-11-05 17:02:17 +0100 | [diff] [blame] | 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". |
Bram Moolenaar | 4a74803 | 2010-09-30 21:47:56 +0200 | [diff] [blame] | 290 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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. |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 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. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 0122c40 | 2015-02-03 19:13:34 +0100 | [diff] [blame] | 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 | < |
Bram Moolenaar | 01164a6 | 2017-11-02 22:58:42 +0100 | [diff] [blame] | 335 | After setting this variable, reload the syntax script: > |
Bram Moolenaar | 0122c40 | 2015-02-03 19:13:34 +0100 | [diff] [blame] | 336 | |
| 337 | set syntax=diff |
| 338 | < |
| 339 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 340 | |
| 341 | FINDING THE DIFFERENCES *diff-diffexpr* |
| 342 | |
Bram Moolenaar | 6f4754b | 2022-01-23 12:07:04 +0000 | [diff] [blame] | 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* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | d2ea7cf | 2021-05-30 20:54:13 +0200 | [diff] [blame] | 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: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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". |
Bram Moolenaar | 9b45125 | 2012-08-15 17:43:31 +0200 | [diff] [blame] | 371 | The "7c7" item replaces the line "GGG" with "ggg". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 372 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 373 | 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] | 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 |
Bram Moolenaar | 6f4754b | 2022-01-23 12:07:04 +0000 | [diff] [blame] | 378 | v:fname_out where to write the resulting diff file |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | a4e0b97 | 2022-10-01 19:43:52 +0100 | [diff] [blame] | 384 | The advantage of using a function call without arguments is that it is faster, |
| 385 | see |expr-option-function|. |
| 386 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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" |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 393 | let opt = opt .. "-i " |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 394 | endif |
| 395 | if &diffopt =~ "iwhite" |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 396 | let opt = opt .. "-b " |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 397 | endif |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 398 | silent execute "!diff -a --binary " .. opt .. v:fname_in .. " " .. v:fname_new .. |
| 399 | \ " > " .. v:fname_out |
Bram Moolenaar | d473c8c | 2018-08-11 18:00:22 +0200 | [diff] [blame] | 400 | redraw! |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | d473c8c | 2018-08-11 18:00:22 +0200 | [diff] [blame] | 407 | The `redraw!` command may not be needed, depending on whether executing a |
| 408 | shell command shows something on the display or not. |
| 409 | |
Yegappan Lakshmanan | 8bb65f2 | 2021-12-26 10:51:39 +0000 | [diff] [blame] | 410 | If the 'diffexpr' expression starts with s: or |<SID>|, then it is replaced |
| 411 | with the script ID (|local-function|). Example: > |
| 412 | set diffexpr=s:MyDiffExpr() |
| 413 | set diffexpr=<SID>SomeDiffExpr() |
Bram Moolenaar | 6f4754b | 2022-01-23 12:07:04 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 417 | *E810* *E97* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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. |
Bram Moolenaar | 71fe80d | 2006-01-22 23:25:56 +0000 | [diff] [blame] | 425 | If it's not clear what the problem is set the 'verbose' option to one or more |
| 426 | to see more messages. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 427 | |
Bram Moolenaar | 166af9b | 2010-11-16 20:34:40 +0100 | [diff] [blame] | 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 |
Bram Moolenaar | 81af925 | 2010-12-10 20:35:50 +0100 | [diff] [blame] | 430 | http://gnuwin32.sourceforge.net/packages/diffutils.htm. |
Bram Moolenaar | 5eb86f9 | 2004-07-26 12:53:41 +0000 | [diff] [blame] | 431 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | a4e0b97 | 2022-10-01 19:43:52 +0100 | [diff] [blame] | 452 | The advantage of using a function call without arguments is that it is faster, |
| 453 | see |expr-option-function|. |
| 454 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 455 | Example (this does the same as 'patchexpr' being empty): > |
| 456 | |
Bram Moolenaar | 7d47b6e | 2006-03-15 22:59:18 +0000 | [diff] [blame] | 457 | set patchexpr=MyPatch() |
| 458 | function MyPatch() |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 459 | :call system("patch -o " .. v:fname_out .. " " .. v:fname_in .. |
| 460 | \ " < " .. v:fname_diff) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Yegappan Lakshmanan | 8bb65f2 | 2021-12-26 10:51:39 +0000 | [diff] [blame] | 471 | If the 'patchexpr' expression starts with s: or |<SID>|, then it is replaced |
| 472 | with the script ID (|local-function|). Example: > |
| 473 | set patchexpr=s:MyPatchExpr() |
| 474 | set patchexpr=<SID>SomePatchExpr() |
Bram Moolenaar | 6f4754b | 2022-01-23 12:07:04 +0000 | [diff] [blame] | 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 | |
Yegappan Lakshmanan | fa37835 | 2024-02-01 22:05:27 +0100 | [diff] [blame] | 479 | DIFF FUNCTION EXAMPLES *diff-func-examples* |
| 480 | |
| 481 | Some examples for using the |diff()| function to compute the diff indices |
| 482 | between two Lists of strings are below. |
| 483 | > |
| 484 | " some lines are changed |
| 485 | :echo diff(['abc', 'def', 'ghi'], ['abx', 'rrr', 'xhi'], {'output': 'indices'}) |
| 486 | [{'from_idx': 0, 'from_count': 3, 'to_idx': 0, 'to_count': 3}] |
| 487 | |
| 488 | " few lines added at the beginning |
| 489 | :echo diff(['ghi'], ['abc', 'def', 'ghi'], {'output': 'indices'}) |
| 490 | [{'from_idx': 0, 'from_count': 0, 'to_idx': 0, 'to_count': 2}] |
| 491 | |
| 492 | " few lines removed from the beginning |
| 493 | :echo diff(['abc', 'def', 'ghi'], ['ghi'], {'output': 'indices'}) |
| 494 | [{'from_idx': 0, 'from_count': 2, 'to_idx': 0, 'to_count': 0}] |
| 495 | |
| 496 | " few lines added in the middle |
| 497 | :echo diff(['abc', 'jkl'], ['abc', 'def', 'ghi', 'jkl'], {'output': 'indices'}) |
| 498 | [{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}] |
| 499 | |
| 500 | " few lines removed in the middle |
| 501 | :echo diff(['abc', 'def', 'ghi', 'jkl'], ['abc', 'jkl'], {'output': 'indices'}) |
| 502 | [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}] |
| 503 | |
| 504 | " few lines added at the end |
| 505 | :echo diff(['abc'], ['abc', 'def', 'ghi'], {'output': 'indices'}) |
| 506 | [{'from_idx': 1, 'from_count': 0, 'to_idx': 1, 'to_count': 2}] |
| 507 | |
| 508 | " few lines removed from the end |
| 509 | :echo diff(['abc', 'def', 'ghi'], ['abc'], {'output': 'indices'}) |
| 510 | [{'from_idx': 1, 'from_count': 2, 'to_idx': 1, 'to_count': 0}] |
| 511 | |
| 512 | " disjointed changes |
| 513 | :echo diff(['ab', 'def', 'ghi', 'jkl'], ['abc', 'def', 'ghi', 'jk'], {'output': 'indices'}) |
| 514 | [{'from_idx': 0, 'from_count': 1, 'to_idx': 0, 'to_count': 1}, |
| 515 | {'from_idx': 3, 'from_count': 1, 'to_idx': 3, 'to_count': 1}] |
| 516 | < |
| 517 | |
Bram Moolenaar | 91f84f6 | 2018-07-29 15:07:52 +0200 | [diff] [blame] | 518 | vim:tw=78:ts=8:noet:ft=help:norl: |