annotate runtime/doc/diff.txt @ 32936:c517845bd10e v9.0.1776

patch 9.0.1776: No support for stable Python 3 ABI Commit: https://github.com/vim/vim/commit/c13b3d1350b60b94fe87f0761ea31c0e7fb6ebf3 Author: Yee Cheng Chin <ychin.git@gmail.com> Date: Sun Aug 20 21:18:38 2023 +0200 patch 9.0.1776: No support for stable Python 3 ABI Problem: No support for stable Python 3 ABI Solution: Support Python 3 stable ABI Commits: 1) Support Python 3 stable ABI to allow mixed version interoperatbility Vim currently supports embedding Python for use with plugins, and the "dynamic" linking option allows the user to specify a locally installed version of Python by setting `pythonthreedll`. However, one caveat is that the Python 3 libs are not binary compatible across minor versions, and mixing versions can potentially be dangerous (e.g. let's say Vim was linked against the Python 3.10 SDK, but the user sets `pythonthreedll` to a 3.11 lib). Usually, nothing bad happens, but in theory this could lead to crashes, memory corruption, and other unpredictable behaviors. It's also difficult for the user to tell something is wrong because Vim has no way of reporting what Python 3 version Vim was linked with. For Vim installed via a package manager, this usually isn't an issue because all the dependencies would already be figured out. For prebuilt Vim binaries like MacVim (my motivation for working on this), AppImage, and Win32 installer this could potentially be an issue as usually a single binary is distributed. This is more tricky when a new Python version is released, as there's a chicken-and-egg issue with deciding what Python version to build against and hard to keep in sync when a new Python version just drops and we have a mix of users of different Python versions, and a user just blindly upgrading to a new Python could lead to bad interactions with Vim. Python 3 does have a solution for this problem: stable ABI / limited API (see https://docs.python.org/3/c-api/stable.html). The C SDK limits the API to a set of functions that are promised to be stable across versions. This pull request adds an ifdef config that allows us to turn it on when building Vim. Vim binaries built with this option should be safe to freely link with any Python 3 libraies without having the constraint of having to use the same minor version. Note: Python 2 has no such concept and this doesn't change how Python 2 integration works (not that there is going to be a new version of Python 2 that would cause compatibility issues in the future anyway). --- Technical details: ====== The stable ABI can be accessed when we compile with the Python 3 limited API (by defining `Py_LIMITED_API`). The Python 3 code (in `if_python3.c` and `if_py_both.h`) would now handle this and switch to limited API mode. Without it set, Vim will still use the full API as before so this is an opt-in change. The main difference is that `PyType_Object` is now an opaque struct that we can't directly create "static types" out of, and we have to create type objects as "heap types" instead. This is because the struct is not stable and changes from version to version (e.g. 3.8 added a `tp_vectorcall` field to it). I had to change all the types to be allocated on the heap instead with just a pointer to them. Other functions are also simply missing in limited API, or they are introduced too late (e.g. `PyUnicode_AsUTF8AndSize` in 3.10) to it that we need some other ways to do the same thing, so I had to abstract a few things into macros, and sometimes re-implement functions like `PyObject_NEW`. One caveat is that in limited API, `OutputType` (used for replacing `sys.stdout`) no longer inherits from `PyStdPrinter_Type` which I don't think has any real issue other than minor differences in how they convert to a string and missing a couple functions like `mode()` and `fileno()`. Also fixed an existing bug where `tp_basicsize` was set incorrectly for `BufferObject`, `TabListObject, `WinListObject`. Technically, there could be a small performance drop, there is a little more indirection with accessing type objects, and some APIs like `PyUnicode_AsUTF8AndSize` are missing, but in practice I didn't see any difference, and any well-written Python plugin should try to avoid excessing callbacks to the `vim` module in Python anyway. I only tested limited API mode down to Python 3.7, which seemes to compile and work fine. I haven't tried earlier Python versions. 2) Fix PyIter_Check on older Python vers / type##Ptr unused warning For PyIter_Check, older versions exposed them as either macros (used in full API), or a function (for use in limited API). A previous change exposed PyIter_Check to the dynamic build because Python just moved it to function-only in 3.10 anyway. Because of that, just make sure we always grab the function in dynamic builds in earlier versions since that's what Python eventually did anyway. 3) Move Py_LIMITED_API define to configure script Can now use --with-python-stable-abi flag to customize what stable ABI version to target. Can also use an env var to do so as well. 4) Show +python/dyn-stable in :version, and allow has() feature query Not sure if the "/dyn-stable" suffix would break things, or whether we should do it another way. Or just don't show it in version and rely on has() feature checking. 5) Documentation first draft. Still need to implement v:python3_version 6) Fix PyIter_Check build breaks when compiling against Python 3.8 7) Add CI coverage stable ABI on Linux/Windows / make configurable on Windows This adds configurable options for Windows make files (both MinGW and MSVC). CI will also now exercise both traditional full API and stable ABI for Linux and Windows in the matrix for coverage. Also added a "dynamic" option to Linux matrix as a drive-by change to make other scripting languages like Ruby / Perl testable under both static and dynamic builds. 8) Fix inaccuracy in Windows docs Python's own docs are confusing but you don't actually want to use `python3.dll` for the dynamic linkage. 9) Add generated autoconf file 10) Add v:python3_version support This variable indicates the version of Python3 that Vim was built against (PY_VERSION_HEX), and will be useful to check whether the Python library you are loading in dynamically actually fits it. When built with stable ABI, it will be the limited ABI version instead (`Py_LIMITED_API`), which indicates the minimum version of Python 3 the user should have, rather than the exact match. When stable ABI is used, we won't be exposing PY_VERSION_HEX in this var because it just doesn't seem necessary to do so (the whole point of stable ABI is the promise that it will work across versions), and I don't want to confuse the user with too many variables. Also, cleaned up some documentation, and added help tags. 11) Fix Python 3.7 compat issues Fix a couple issues when using limited API < 3.8 - Crash on exit: In Python 3.7, if a heap-allocated type is destroyed before all instances are, it would cause a crash later. This happens when we destroyed `OptionsType` before calling `Py_Finalize` when using the limited API. To make it worse, later versions changed the semantics and now each instance has a strong reference to its own type and the recommendation has changed to have each instance de-ref its own type and have its type in GC traversal. To avoid dealing with these cross-version variations, we just don't free the heap type. They are static types in non-limited-API anyway and are designed to last through the entirety of the app, and we also don't restart the Python runtime and therefore do not need it to have absolutely 0 leaks. See: - https://docs.python.org/3/whatsnew/3.8.html#changes-in-the-c-api - https://docs.python.org/3/whatsnew/3.9.html#changes-in-the-c-api - PyIter_Check: This function is not provided in limited APIs older than 3.8. Previously I was trying to mock it out using manual PyType_GetSlot() but it was brittle and also does not actually work properly for static types (it will generate a Python error). Just return false. It does mean using limited API < 3.8 is not recommended as you lose the functionality to handle iterators, but from playing with plugins I couldn't find it to be an issue. - Fix loading of PyIter_Check so it will be done when limited API < 3.8. Otherwise loading a 3.7 Python lib will fail even if limited API was specified to use it. 12) Make sure to only load `PyUnicode_AsUTF8AndSize` in needed in limited API We don't use this function unless limited API >= 3.10, but we were loading it regardless. Usually it's ok in Unix-like systems where Python just has a single lib that we load from, but in Windows where there is a separate python3.dll this would not work as the symbol would not have been exposed in this more limited DLL file. This makes it much clearer under what condition is this function needed. closes: #12032 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
author Christian Brabandt <cb@256bit.org>
date Sun, 20 Aug 2023 21:30:04 +0200
parents b2e8663e6dcc
children 4635e43f2c6f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
32294
b2e8663e6dcc Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 32004
diff changeset
1 *diff.txt* For Vim version 9.0. Last change: 2023 Apr 04
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 VIM REFERENCE MANUAL by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 The basics are explained in section |08.7| of the user manual.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12
12559
34c8ec888122 Update runtime files
Christian Brabandt <cb@256bit.org>
parents: 12499
diff changeset
13 1. Starting diff mode |start-vimdiff|
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 2. Viewing diffs |view-diffs|
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 3. Jumping to diffs |jumpto-diffs|
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 4. Copying diffs |copy-diffs|
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 5. Diff options |diff-options|
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 ==============================================================================
12559
34c8ec888122 Update runtime files
Christian Brabandt <cb@256bit.org>
parents: 12499
diff changeset
20 1. Starting diff mode *start-vimdiff*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 The easiest way to start editing in diff mode is with the "vimdiff" command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 This starts Vim as usual, and additionally sets up for viewing the differences
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 between the arguments. >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 vimdiff file1 file2 [file3 [file4]]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 This is equivalent to: >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 vim -d file1 file2 [file3 [file4]]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 You may also use "gvimdiff" or "vim -d -g". The GUI is started then.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 You may also use "viewdiff" or "gviewdiff". Vim starts in readonly mode then.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34 "r" may be prepended for restricted mode (see |-Z|).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36 The second and following arguments may also be a directory name. Vim will
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
37 then append the file name of the first argument to the directory name to find
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43
674
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 639
diff changeset
44 Diffs are local to the current tab page |tab-page|. You can't see diffs with
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 639
diff changeset
45 a window in another tab page. This does make it possible to have several
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 639
diff changeset
46 diffs at the same time, each in their own tab page.
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 639
diff changeset
47
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 What happens is that Vim opens a window for each of the files. This is like
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 using the |-O| argument. This uses vertical splits. If you prefer horizontal
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 splits add the |-o| argument: >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51
1698
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1668
diff changeset
52 vimdiff -o file1 file2 [file3 [file4]]
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53
766
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 758
diff changeset
54 If you always prefer horizontal splits include "horizontal" in 'diffopt'.
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 758
diff changeset
55
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 In each of the edited files these options are set:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 'diff' on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 'scrollbind' on
2445
04dae202d316 Fixes for coverity warnings.
Bram Moolenaar <bram@vim.org>
parents: 2413
diff changeset
60 'cursorbind' on
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 'foldmethod' "diff"
766
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 758
diff changeset
64 'foldcolumn' value from 'diffopt', default is 2
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 These options are set local to the window. When editing another file they are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
e9a47bcf7b94 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 17571
diff changeset
71 See `:diffoff` for an easy way to revert the options.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 The differences shown are actually the differences in the buffer. Thus if you
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 make changes after loading a file, these will be included in the displayed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 diffs. You might have to do ":diffupdate" now and then, not all changes are
18594
e9a47bcf7b94 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 17571
diff changeset
76 immediately taken into account, especially when using an external diff command.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 In your .vimrc file you could do something special when Vim was started in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 diff mode. You could use a construct like this: >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 if &diff
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 setup for diff mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 setup for non-diff mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 While already in Vim you can start diff mode in three ways.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 *E98*
3830
04592728474a Updated runtime files.
Bram Moolenaar <bram@vim.org>
parents: 3750
diff changeset
90 :diffs[plit] {filename} *:diffs* *:diffsplit*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 Open a new window on the file {filename}. The options are set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 as for "vimdiff" for the current and the newly opened window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 Also see 'diffexpr'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95 *:difft* *:diffthis*
3830
04592728474a Updated runtime files.
Bram Moolenaar <bram@vim.org>
parents: 3750
diff changeset
96 :difft[his] Make the current window part of the diff windows. This sets
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
97 the options like for "vimdiff".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98
5929
16d26051085a Runtime file updates.
Bram Moolenaar <bram@vim.org>
parents: 5362
diff changeset
99 :diffp[atch] {patchfile} *E816* *:diffp* *:diffpatch*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 Use the current buffer, patch it with the diff found in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 {patchfile} and open a buffer on the result. The options are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102 set as for "vimdiff".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 {patchfile} can be in any format that the "patch" program
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 understands or 'patchexpr' can handle.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 Note that {patchfile} should only contain a diff for one file,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 the current file. If {patchfile} contains diffs for other
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 files as well, the results are unpredictable. Vim changes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 directory to /tmp to avoid files in the current directory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 accidentally being patched. But it may still result in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 various ".rej" files to be created. And when absolute path
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 names are present these files may get patched anyway.
32294
b2e8663e6dcc Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 32004
diff changeset
112 Using the "patch" command is not allowed in |restricted-mode|.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 To make these commands use a vertical split, prepend |:vertical|. Examples: >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 :vert diffsplit main.c~
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 :vert diffpatch /tmp/diff
766
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 758
diff changeset
118
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 758
diff changeset
119 If you always prefer a vertical split include "vertical" in 'diffopt'.
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 758
diff changeset
120
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 Since the option values are remembered with the buffer, you can edit another
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 file for a moment and come back to the same file and be in diff mode again.
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
126
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
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
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
130
3830
04592728474a Updated runtime files.
Bram Moolenaar <bram@vim.org>
parents: 3750
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138
6918
2def7b25de60 Updated runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6583
diff changeset
139 The `:diffoff` command resets the relevant options to the values they had when
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31579
diff changeset
140 using `:diffsplit`, `:diffpatch`, `:diffthis`. or starting Vim in diff mode.
6918
2def7b25de60 Updated runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6583
diff changeset
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
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
143
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
144 'diff' off
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
145 'scrollbind' off
2445
04dae202d316 Fixes for coverity warnings.
Bram Moolenaar <bram@vim.org>
parents: 2413
diff changeset
146 'cursorbind' off
16
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
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
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
149 'foldmethod' "manual"
3ba373b54370 updated for version 7.0008
vimboss
parents: 7
diff changeset
150 'foldcolumn' 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151
31579
7d68a90cbf5c Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
152 'foldenable' will most-likely be reset to off. That is when 'foldmethod' is
7d68a90cbf5c Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
153 is restored to "manual". The folds themselves are not cleared but they should
7d68a90cbf5c Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
154 not show up, resetting 'foldenable' is the best way to do that.
7d68a90cbf5c Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
155
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 ==============================================================================
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 2. Viewing diffs *view-diffs*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 The effect is that the diff windows show the same text, with the differences
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 highlighted. When scrolling the text, the 'scrollbind' option will make the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 text in other windows to be scrolled as well. With vertical splits the text
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 should be aligned properly.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 The alignment of text will go wrong when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 - 'wrap' is on, some lines will be wrapped and occupy two or more screen
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 lines
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 - folds are open in one window but not another
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 - 'scrollbind' is off
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 - changes have been made to the text
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 - "filler" is not present in 'diffopt', deleted/inserted lines makes the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 alignment go wrong
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 All the buffers edited in a window where the 'diff' option is set will join in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177
1121
e63691e7c504 updated for version 7.1a
vimboss
parents: 874
diff changeset
178 *:DiffOrig* *diff-original-file*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179 Since 'diff' is a window-local option, it's possible to view the same buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 in diff mode in one window and "normal" in another window. It is also
1121
e63691e7c504 updated for version 7.1a
vimboss
parents: 874
diff changeset
181 possible to view the changes you have made to a buffer since the file was
e63691e7c504 updated for version 7.1a
vimboss
parents: 874
diff changeset
182 loaded. Since Vim doesn't allow having two buffers for the same file, you
e63691e7c504 updated for version 7.1a
vimboss
parents: 874
diff changeset
183 need another buffer. This command is useful: >
2788
0877b8d6370e Updated runtime files.
Bram Moolenaar <bram@vim.org>
parents: 2662
diff changeset
184 command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_
32004
a9b5ffbc0428 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31885
diff changeset
185 \ | diffthis | wincmd p | diffthis
16023
dc766e1b0c95 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 14696
diff changeset
186 (this is in |defaults.vim|). Use ":DiffOrig" to see the differences between
dc766e1b0c95 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 14696
diff changeset
187 the current buffer and the file it was loaded from.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 A buffer that is unloaded cannot be used for the diff. But it does work for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 hidden buffers. You can use ":hide" to close a window without unloading the
195
49748afd794b updated for version 7.0058
vimboss
parents: 20
diff changeset
191 buffer. If you don't want a buffer to remain used for the diff do ":set
49748afd794b updated for version 7.0058
vimboss
parents: 20
diff changeset
192 nodiff" before hiding it.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193
16944
d23afa4d8b63 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 16553
diff changeset
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
a20218704019 updated for version 7.0072
vimboss
parents: 195
diff changeset
196
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 Vim attempts to keep the differences updated when you make changes to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 text. This mostly takes care of inserted and deleted lines. Changes within a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 line and more complicated changes do not cause the differences to be updated.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 To force the differences to be updated use: >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 :diffupdate
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203
3524
d8ce4a2eb44e updated for version 7.3.523
Bram Moolenaar <bram@vim.org>
parents: 2788
diff changeset
204 If the ! is included Vim will check if the file was changed externally and
d8ce4a2eb44e updated for version 7.3.523
Bram Moolenaar <bram@vim.org>
parents: 2788
diff changeset
205 needs to be reloaded. It will prompt for each changed file, like `:checktime`
d8ce4a2eb44e updated for version 7.3.523
Bram Moolenaar <bram@vim.org>
parents: 2788
diff changeset
206 was used.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 Vim will show filler lines for lines that are missing in one window but are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 present in another. These lines were inserted in another file or deleted in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 this file. Removing "filler" from the 'diffopt' option will make Vim not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 display these filler lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 Folds are used to hide the text that wasn't changed. See |folding| for all
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 the commands that can be used with folds.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 The context of lines above a difference that are not included in the fold can
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 be set with the 'diffopt' option. For example, to set the context to three
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 lines: >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 :set diffopt=filler,context:3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 The diffs are highlighted with these groups:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 |hl-DiffAdd| DiffAdd Added (inserted) lines. These lines exist in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 this buffer but not in another.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 |hl-DiffChange| DiffChange Changed lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 |hl-DiffText| DiffText Changed text inside a Changed line. Vim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 finds the first character that is different,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 and the last character that is different
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 (searching from the end of the line). The
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 text in between is highlighted. This means
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 that parts in the middle that are still the
12499
d91cf2e26ef0 Update runtime files.
Christian Brabandt <cb@256bit.org>
parents: 10895
diff changeset
235 same are highlighted anyway. The 'diffopt'
d91cf2e26ef0 Update runtime files.
Christian Brabandt <cb@256bit.org>
parents: 10895
diff changeset
236 flags "iwhite" and "icase" are used here.
4098
058f26a834c4 Updated runtime files.
Bram Moolenaar <bram@vim.org>
parents: 3830
diff changeset
237 |hl-DiffDelete| DiffDelete Deleted lines. Also called filler lines,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 because they don't really exist in this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 ==============================================================================
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 3. Jumping to diffs *jumpto-diffs*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 Two commands can be used to jump to diffs:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 *[c*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 [c Jump backwards to the previous start of a change.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 When a count is used, do it that many times.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 *]c*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 ]c Jump forwards to the next start of a change.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 When a count is used, do it that many times.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 It is an error if there is no change for the cursor to move to.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 ==============================================================================
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 4. Diff copying *copy-diffs* *E99* *E100* *E101* *E102* *E103*
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 270
diff changeset
256 *merge*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 There are two commands to copy text from one buffer to another. The result is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 that the buffers will be equal within the specified range.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 *:diffg* *:diffget*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 :[range]diffg[et] [bufspec]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 Otherwise this only works if there is one other buffer in diff
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 See below for [range].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268
1121
e63691e7c504 updated for version 7.1a
vimboss
parents: 874
diff changeset
269 *:diffpu* *:diffput* *E793*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 :[range]diffpu[t] [bufspec]
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 Modify another buffer to undo difference with the current
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 buffer. Just like ":diffget" but the other buffer is modified
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 instead of the current one.
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 270
diff changeset
274 When [bufspec] is omitted and there is more than one other
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 270
diff changeset
275 buffer in diff mode where 'modifiable' is set this fails.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 See below for [range].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 *do*
6336
4abac79c0b7a Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 5929
diff changeset
279 [count]do Same as ":diffget" without range. The "o" stands for "obtain"
4abac79c0b7a Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 5929
diff changeset
280 ("dg" can't be used, it could be the start of "dgg"!). Note:
4abac79c0b7a Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 5929
diff changeset
281 this doesn't work in Visual mode.
4abac79c0b7a Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 5929
diff changeset
282 If you give a [count], it is used as the [bufspec] argument
4abac79c0b7a Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 5929
diff changeset
283 for ":diffget".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 *dp*
6336
4abac79c0b7a Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 5929
diff changeset
286 [count]dp Same as ":diffput" without range. Note: this doesn't work in
4abac79c0b7a Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 5929
diff changeset
287 Visual mode.
4abac79c0b7a Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 5929
diff changeset
288 If you give a [count], it is used as the [bufspec] argument
4abac79c0b7a Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 5929
diff changeset
289 for ":diffput".
2596
fae782ef63dd Runtime file updates.
Bram Moolenaar <bram@vim.org>
parents: 2577
diff changeset
290
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 When no [range] is given, the diff at the cursor position or just above it is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 affected. When [range] is used, Vim tries to only put or get the specified
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 lines. When there are deleted lines, this may not always be possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 There can be deleted lines below the last line of the buffer. When the cursor
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 is on the last line in the buffer and there is no diff above this line, the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 ":diffget" and "do" commands will obtain lines from the other buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 To be able to get those lines from another buffer in a [range] it's allowed to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 use the last line number plus one. This command gets all diffs from the other
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 buffer: >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 :1,$+1diffget
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 Note that deleted lines are displayed, but not counted as text lines. You
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 can't move the cursor into them. To fill the deleted lines with the lines
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 from another buffer use ":diffget" on the line below them.
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 810
diff changeset
309 *E787*
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 810
diff changeset
310 When the buffer that is about to be modified is read-only and the autocommand
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 810
diff changeset
311 that is triggered by |FileChangedRO| changes buffers the command will fail.
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 810
diff changeset
312 The autocommand must not change buffers.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 The [bufspec] argument above can be a buffer number, a pattern for a buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 name or a part of a buffer name. Examples:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 :diffget Use the other buffer which is in diff mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 :diffget 3 Use buffer 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 :diffget v2 Use the buffer which matches "v2" and is in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 diff mode (e.g., "file.c.v2")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 ==============================================================================
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 5. Diff options *diff-options*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 Also see |'diffopt'| and the "diff" item of |'fillchars'|.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326
6583
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
327 *diff-slow* *diff_translations*
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
328 For very long lines, the diff syntax highlighting might be slow, especially
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
329 since it tries to match all different kind of localisations. To disable
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
330 localisations and speed up the syntax highlighting, set the global variable
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
331 g:diff_translations to zero: >
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
332
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
333 let g:diff_translations = 0
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
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
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
336
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
337 set syntax=diff
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
338 <
b0a227941705 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 6336
diff changeset
339
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 FINDING THE DIFFERENCES *diff-diffexpr*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342
27321
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
343 The 'diffexpr' option can be set to use something else than the internal diff
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
344 support or the standard "diff" program to compare two files and find the
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
345 differences. *E959*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 When 'diffexpr' is empty, Vim uses this command to find the differences
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 between file1 and file2: >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 diff file1 file2 > outfile
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352 The ">" is replaced with the value of 'shellredir'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
353
24751
e69e7133c9cf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 23931
diff changeset
354 The output of "diff" must be a normal "ed" style diff or a unified diff. A
e69e7133c9cf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 23931
diff changeset
355 context diff will NOT work. For a unified diff no context lines can be used.
e69e7133c9cf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 23931
diff changeset
356 Using "diff -u" will NOT work, use "diff -U0".
e69e7133c9cf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 23931
diff changeset
357
e69e7133c9cf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 23931
diff changeset
358 This example explains the format that Vim expects for the "ed" style diff: >
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360 1a2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361 > bbb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 4d4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 < 111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 7c7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 < GGG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 ---
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 > ggg
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 The "1a2" item appends the line "bbb".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 The "4d4" item deletes the line "111".
3750
536aa8b0c934 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 3526
diff changeset
371 The "7c7" item replaces the line "GGG" with "ggg".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 format mentioned. These variables are set to the file names used:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 v:fname_in original file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 v:fname_new new version of the same file
27321
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
378 v:fname_out where to write the resulting diff file
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 Additionally, 'diffexpr' should take care of "icase" and "iwhite" in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 'diffopt' option. 'diffexpr' cannot change the value of 'lines' and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 'columns'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 Example (this does almost the same as 'diffexpr' being empty): >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 set diffexpr=MyDiff()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 function MyDiff()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 let opt = ""
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 if &diffopt =~ "icase"
27903
d19b7aee1925 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 27321
diff changeset
393 let opt = opt .. "-i "
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 if &diffopt =~ "iwhite"
27903
d19b7aee1925 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 27321
diff changeset
396 let opt = opt .. "-b "
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 endif
27903
d19b7aee1925 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 27321
diff changeset
398 silent execute "!diff -a --binary " .. opt .. v:fname_in .. " " .. v:fname_new ..
d19b7aee1925 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 27321
diff changeset
399 \ " > " .. v:fname_out
14519
5c5908e81e93 Update runtime files.
Christian Brabandt <cb@256bit.org>
parents: 14421
diff changeset
400 redraw!
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 endfunction
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 The "-a" argument is used to force comparing the files as text, comparing as
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 binaries isn't useful. The "--binary" argument makes the files read in binary
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 mode, so that a CTRL-Z doesn't end the text on DOS.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406
14519
5c5908e81e93 Update runtime files.
Christian Brabandt <cb@256bit.org>
parents: 14421
diff changeset
407 The `redraw!` command may not be needed, depending on whether executing a
5c5908e81e93 Update runtime files.
Christian Brabandt <cb@256bit.org>
parents: 14421
diff changeset
408 shell command shows something on the display or not.
5c5908e81e93 Update runtime files.
Christian Brabandt <cb@256bit.org>
parents: 14421
diff changeset
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
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
414 Otherwise, the expression is evaluated in the context of the script where the
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
415 option was set, thus script-local items are available.
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
416
2033
de5a43c5eedc Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents: 1702
diff changeset
417 *E810* *E97*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 Vim will do a test if the diff output looks alright. If it doesn't, you will
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 get an error message. Possible causes:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 - The "diff" program cannot be executed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
421 - The "diff" program doesn't produce normal "ed" style diffs (see above).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 - The 'shell' and associated options are not set correctly. Try if filtering
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 works with a command like ":!sort".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 - You are using 'diffexpr' and it doesn't work.
639
c79d4df4686e updated for version 7.0185
vimboss
parents: 532
diff changeset
425 If it's not clear what the problem is set the 'verbose' option to one or more
c79d4df4686e updated for version 7.0185
vimboss
parents: 532
diff changeset
426 to see more messages.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427
2642
840c3cadb842 Updated runtime files.
Bram Moolenaar <bram@vim.org>
parents: 2596
diff changeset
428 The self-installing Vim for MS-Windows includes a diff program. If you don't
840c3cadb842 Updated runtime files.
Bram Moolenaar <bram@vim.org>
parents: 2596
diff changeset
429 have it you might want to download a diff.exe. For example from
2662
916c90b37ea9 Update runtime files.
Bram Moolenaar <bram@vim.org>
parents: 2642
diff changeset
430 http://gnuwin32.sourceforge.net/packages/diffutils.htm.
20
4ac1dce8dd5e updated for version 7.0012
vimboss
parents: 16
diff changeset
431
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 USING PATCHES *diff-patchexpr*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 The 'patchexpr' option can be set to use something else than the standard
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 "patch" program.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 When 'patchexpr' is empty, Vim will call the "patch" program like this: >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 patch -o outfile origfile < patchfile
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 This should work fine with most versions of the "patch" program. Note that a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 CR in the middle of a line may cause problems, it is seen as a line break.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 If the default doesn't work for you, set the 'patchexpr' to an expression that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 will have the same effect. These variables are set to the file names used:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 v:fname_in original file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 v:fname_diff patch file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450 v:fname_out resulting patched file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 Example (this does the same as 'patchexpr' being empty): >
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456
766
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 758
diff changeset
457 set patchexpr=MyPatch()
f0d0d3d3a1e2 updated for version 7.0225
vimboss
parents: 758
diff changeset
458 function MyPatch()
27903
d19b7aee1925 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 27321
diff changeset
459 :call system("patch -o " .. v:fname_out .. " " .. v:fname_in ..
d19b7aee1925 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 27321
diff changeset
460 \ " < " .. v:fname_diff)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461 endfunction
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 Make sure that using the "patch" program doesn't have unwanted side effects.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464 For example, watch out for additionally generated files, which should be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 deleted. It should just patch the file and nothing else.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 Vim will change directory to "/tmp" or another temp directory before
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 evaluating 'patchexpr'. This hopefully avoids that files in the current
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 directory are accidentally patched. Vim will also delete files starting with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 v:fname_in and ending in ".rej" and ".orig".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
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
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
475 Otherwise, the expression is evaluated in the context of the script where the
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
476 option was set, thus script-local items are available.
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
477
3649b5a6b1b6 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 26743
diff changeset
478
14421
2f7e67dd088c Update runtime files.
Christian Brabandt <cb@256bit.org>
parents: 13963
diff changeset
479 vim:tw=78:ts=8:noet:ft=help:norl: