h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1 | *undo.txt* For Vim version 9.1. Last change: 2024 Nov 09 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 2 | |
| 3 | |
| 4 | VIM REFERENCE MANUAL by Bram Moolenaar |
| 5 | |
| 6 | |
| 7 | Undo and redo *undo-redo* |
| 8 | |
| 9 | The basics are explained in section |02.5| of the user manual. |
| 10 | |
| 11 | 1. Undo and redo commands |undo-commands| |
| 12 | 2. Two ways of undo |undo-two-ways| |
Bram Moolenaar | e224ffa | 2006-03-01 00:01:28 +0000 | [diff] [blame] | 13 | 3. Undo blocks |undo-blocks| |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 14 | 4. Undo branches |undo-branches| |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 15 | 5. Undo persistence |undo-persistence| |
| 16 | 6. Remarks about undo |undo-remarks| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 17 | |
| 18 | ============================================================================== |
| 19 | 1. Undo and redo commands *undo-commands* |
| 20 | |
| 21 | <Undo> or *undo* *<Undo>* *u* |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 22 | u Undo [count] changes. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 23 | |
| 24 | *:u* *:un* *:undo* |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 25 | :u[ndo] Undo one change. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 26 | *E830* |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 27 | :u[ndo] {N} Jump to after change number {N}. See |undo-branches| |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 28 | for the meaning of {N}. |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 29 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 30 | *CTRL-R* |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 31 | CTRL-R Redo [count] changes which were undone. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 32 | |
| 33 | *:red* *:redo* *redo* |
Bram Moolenaar | a6c27c4 | 2019-05-09 19:16:22 +0200 | [diff] [blame] | 34 | :red[o] Redo one change which was undone. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 35 | |
| 36 | *U* |
Bram Moolenaar | 5302d9e | 2011-09-14 17:55:08 +0200 | [diff] [blame] | 37 | U Undo all latest changes on one line, the line where |
| 38 | the latest change was made. |U| itself also counts as |
| 39 | a change, and thus |U| undoes a previous |U|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 40 | |
| 41 | The last changes are remembered. You can use the undo and redo commands above |
| 42 | to revert the text to how it was before each change. You can also apply the |
| 43 | changes again, getting back the text before the undo. |
| 44 | |
| 45 | The "U" command is treated by undo/redo just like any other command. Thus a |
| 46 | "u" command undoes a "U" command and a 'CTRL-R' command redoes it again. When |
| 47 | mixing "U", "u" and 'CTRL-R' you will notice that the "U" command will |
| 48 | restore the situation of a line to before the previous "U" command. This may |
| 49 | be confusing. Try it out to get used to it. |
| 50 | The "U" command will always mark the buffer as changed. When "U" changes the |
| 51 | buffer back to how it was without changes, it is still considered changed. |
| 52 | Use "u" to undo changes until the buffer becomes unchanged. |
| 53 | |
| 54 | ============================================================================== |
| 55 | 2. Two ways of undo *undo-two-ways* |
| 56 | |
| 57 | How undo and redo commands work depends on the 'u' flag in 'cpoptions'. |
Bram Moolenaar | 7cba6c0 | 2013-09-05 22:13:31 +0200 | [diff] [blame] | 58 | There is the Vim way ('u' excluded) and the Vi-compatible way ('u' included). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 59 | In the Vim way, "uu" undoes two changes. In the Vi-compatible way, "uu" does |
| 60 | nothing (undoes an undo). |
| 61 | |
| 62 | 'u' excluded, the Vim way: |
| 63 | You can go back in time with the undo command. You can then go forward again |
| 64 | with the redo command. If you make a new change after the undo command, |
| 65 | the redo will not be possible anymore. |
| 66 | |
| 67 | 'u' included, the Vi-compatible way: |
Bram Moolenaar | 1b884a0 | 2020-12-10 21:11:27 +0100 | [diff] [blame] | 68 | The undo command undoes the previous change, and also the previous undo |
| 69 | command. The redo command repeats the previous undo command. It does NOT |
| 70 | repeat a change command, use "." for that. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 71 | |
| 72 | Examples Vim way Vi-compatible way ~ |
| 73 | "uu" two times undo no-op |
| 74 | "u CTRL-R" no-op two times undo |
| 75 | |
| 76 | Rationale: Nvi uses the "." command instead of CTRL-R. Unfortunately, this |
| 77 | is not Vi compatible. For example "dwdwu." in Vi deletes two |
| 78 | words, in Nvi it does nothing. |
| 79 | |
| 80 | ============================================================================== |
Bram Moolenaar | e224ffa | 2006-03-01 00:01:28 +0000 | [diff] [blame] | 81 | 3. Undo blocks *undo-blocks* |
| 82 | |
| 83 | One undo command normally undoes a typed command, no matter how many changes |
| 84 | that command makes. This sequence of undo-able changes forms an undo block. |
| 85 | Thus if the typed key(s) call a function, all the commands in the function are |
| 86 | undone together. |
| 87 | |
| 88 | If you want to write a function or script that doesn't create a new undoable |
| 89 | change but joins in with the previous change use this command: |
| 90 | |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 91 | *:undoj* *:undojoin* *E790* |
Bram Moolenaar | e224ffa | 2006-03-01 00:01:28 +0000 | [diff] [blame] | 92 | :undoj[oin] Join further changes with the previous undo block. |
| 93 | Warning: Use with care, it may prevent the user from |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 94 | properly undoing changes. Don't use this after undo |
| 95 | or redo. |
Bram Moolenaar | e224ffa | 2006-03-01 00:01:28 +0000 | [diff] [blame] | 96 | |
Bram Moolenaar | 822ff86 | 2014-06-12 21:46:14 +0200 | [diff] [blame] | 97 | This is most useful when you need to prompt the user halfway through a change. |
| 98 | For example in a function that calls |getchar()|. Do make sure that there was |
| 99 | a related change before this that you must join with. |
Bram Moolenaar | e224ffa | 2006-03-01 00:01:28 +0000 | [diff] [blame] | 100 | |
| 101 | This doesn't work by itself, because the next key press will start a new |
| 102 | change again. But you can do something like this: > |
| 103 | |
| 104 | :undojoin | delete |
| 105 | |
Bram Moolenaar | 1b884a0 | 2020-12-10 21:11:27 +0100 | [diff] [blame] | 106 | After this a "u" command will undo the delete command and the previous |
Bram Moolenaar | e224ffa | 2006-03-01 00:01:28 +0000 | [diff] [blame] | 107 | change. |
Bram Moolenaar | b529cfb | 2022-07-25 15:42:07 +0100 | [diff] [blame] | 108 | *undo-break* *undo-close-block* |
| 109 | To do the opposite, use a new undo block for the next change, in Insert mode |
| 110 | use CTRL-G u. This is useful if you want an insert command to be undoable in |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 111 | parts. E.g., for each sentence. |i_CTRL-G_u| |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 112 | |
Bram Moolenaar | b529cfb | 2022-07-25 15:42:07 +0100 | [diff] [blame] | 113 | Setting the value of 'undolevels' also closes the undo block. Even when the |
Christian Brabandt | 6efb198 | 2023-08-10 05:44:25 +0200 | [diff] [blame] | 114 | new value is equal to the old value. Use `g:undolevels` to explicitly read |
| 115 | and write only the global value of 'undolevels'. In |Vim9| script: > |
| 116 | &g:undolevels = &g:undolevels |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 117 | In legacy script: > |
Christian Brabandt | 6efb198 | 2023-08-10 05:44:25 +0200 | [diff] [blame] | 118 | let &g:undolevels = &g:undolevels |
| 119 | |
| 120 | Note that the similar-looking assignment `let &undolevels=&undolevels` does not |
| 121 | preserve the global option value of 'undolevels' in the event that the local |
| 122 | option has been set to a different value. For example: > |
| 123 | " Start with different global and local values for 'undolevels'. |
| 124 | let &g:undolevels = 1000 |
| 125 | let &l:undolevels = 2000 |
| 126 | " This assignment changes the global option to 2000: |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 127 | let &undolevels = &undolevels |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 128 | |
Bram Moolenaar | e224ffa | 2006-03-01 00:01:28 +0000 | [diff] [blame] | 129 | ============================================================================== |
Bram Moolenaar | 18144c8 | 2006-04-12 21:52:12 +0000 | [diff] [blame] | 130 | 4. Undo branches *undo-branches* *undo-tree* |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 131 | |
Bram Moolenaar | 76916e6 | 2006-03-21 21:23:25 +0000 | [diff] [blame] | 132 | Above we only discussed one line of undo/redo. But it is also possible to |
| 133 | branch off. This happens when you undo a few changes and then make a new |
| 134 | change. The undone changes become a branch. You can go to that branch with |
| 135 | the following commands. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 136 | |
Bram Moolenaar | c01140a | 2006-03-24 22:21:52 +0000 | [diff] [blame] | 137 | This is explained in the user manual: |usr_32.txt|. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 138 | |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 139 | *:undol* *:undolist* |
| 140 | :undol[ist] List the leafs in the tree of changes. Example: |
Bram Moolenaar | 2a8a3ec | 2011-01-08 16:06:37 +0100 | [diff] [blame] | 141 | number changes when saved ~ |
| 142 | 88 88 2010/01/04 14:25:53 |
| 143 | 108 107 08/07 12:47:51 |
| 144 | 136 46 13:33:01 7 |
| 145 | 166 164 3 seconds ago |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 146 | |
| 147 | The "number" column is the change number. This number |
| 148 | continuously increases and can be used to identify a |
| 149 | specific undo-able change, see |:undo|. |
| 150 | The "changes" column is the number of changes to this |
| 151 | leaf from the root of the tree. |
Bram Moolenaar | 2a8a3ec | 2011-01-08 16:06:37 +0100 | [diff] [blame] | 152 | The "when" column is the date and time when this |
| 153 | change was made. The four possible formats are: |
| 154 | N seconds ago |
| 155 | HH:MM:SS hour, minute, seconds |
| 156 | MM/DD HH:MM:SS idem, with month and day |
| 157 | YYYY/MM/DD HH:MM:SS idem, with year |
Bram Moolenaar | 24ea3ba | 2010-09-19 19:01:21 +0200 | [diff] [blame] | 158 | The "saved" column specifies, if this change was |
| 159 | written to disk and which file write it was. This can |
Bram Moolenaar | 4a74803 | 2010-09-30 21:47:56 +0200 | [diff] [blame] | 160 | be used with the |:later| and |:earlier| commands. |
Bram Moolenaar | a800b42 | 2010-06-27 01:15:55 +0200 | [diff] [blame] | 161 | For more details use the |undotree()| function. |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 162 | |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 163 | *g-* |
| 164 | g- Go to older text state. With a count repeat that many |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 165 | times. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 166 | *:ea* *:earlier* |
Christian Brabandt | 998f018 | 2024-09-29 09:48:19 +0200 | [diff] [blame] | 167 | :ea[rlier] {count} Go to older text state {count} times. |
| 168 | :ea[rlier] {N}s Go to older text state about {N} seconds before. |
| 169 | :ea[rlier] {N}m Go to older text state about {N} minutes before. |
| 170 | :ea[rlier] {N}h Go to older text state about {N} hours before. |
| 171 | :ea[rlier] {N}d Go to older text state about {N} days before. |
Bram Moolenaar | 730cde9 | 2010-06-27 05:18:54 +0200 | [diff] [blame] | 172 | |
Christian Brabandt | 998f018 | 2024-09-29 09:48:19 +0200 | [diff] [blame] | 173 | :ea[rlier] {N}f Go to older text state {N} file writes before. |
Bram Moolenaar | 24ea3ba | 2010-09-19 19:01:21 +0200 | [diff] [blame] | 174 | When changes were made since the last write |
Bram Moolenaar | 730cde9 | 2010-06-27 05:18:54 +0200 | [diff] [blame] | 175 | ":earlier 1f" will revert the text to the state when |
| 176 | it was written. Otherwise it will go to the write |
| 177 | before that. |
| 178 | When at the state of the first file write, or when |
| 179 | the file was not written, ":earlier 1f" will go to |
| 180 | before the first change. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 181 | |
| 182 | *g+* |
| 183 | g+ Go to newer text state. With a count repeat that many |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 184 | times. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 185 | *:lat* *:later* |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 186 | :lat[er] {count} Go to newer text state {count} times. |
Christian Brabandt | 998f018 | 2024-09-29 09:48:19 +0200 | [diff] [blame] | 187 | :lat[er] {N}s Go to newer text state about {N} seconds later. |
| 188 | :lat[er] {N}m Go to newer text state about {N} minutes later. |
| 189 | :lat[er] {N}h Go to newer text state about {N} hours later. |
| 190 | :lat[er] {N}d Go to newer text state about {N} days later. |
Bram Moolenaar | 730cde9 | 2010-06-27 05:18:54 +0200 | [diff] [blame] | 191 | |
Christian Brabandt | 998f018 | 2024-09-29 09:48:19 +0200 | [diff] [blame] | 192 | :lat[er] {N}f Go to newer text state {N} file writes later. |
Bram Moolenaar | 730cde9 | 2010-06-27 05:18:54 +0200 | [diff] [blame] | 193 | When at the state of the last file write, ":later 1f" |
| 194 | will go to the newest text state. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 195 | |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 196 | |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 197 | Note that text states will become unreachable when undo information is cleared |
| 198 | for 'undolevels'. |
| 199 | |
| 200 | Don't be surprised when moving through time shows multiple changes to take |
| 201 | place at a time. This happens when moving through the undo tree and then |
| 202 | making a new change. |
| 203 | |
| 204 | EXAMPLE |
| 205 | |
| 206 | Start with this text: |
| 207 | one two three ~ |
| 208 | |
| 209 | Delete the first word by pressing "x" three times: |
| 210 | ne two three ~ |
| 211 | e two three ~ |
| 212 | two three ~ |
| 213 | |
| 214 | Now undo that by pressing "u" three times: |
| 215 | e two three ~ |
| 216 | ne two three ~ |
| 217 | one two three ~ |
| 218 | |
| 219 | Delete the second word by pressing "x" three times: |
| 220 | one wo three ~ |
| 221 | one o three ~ |
| 222 | one three ~ |
| 223 | |
| 224 | Now undo that by using "g-" three times: |
| 225 | one o three ~ |
| 226 | one wo three ~ |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 227 | two three ~ |
| 228 | |
| 229 | You are now back in the first undo branch, after deleting "one". Repeating |
| 230 | "g-" will now bring you back to the original text: |
| 231 | e two three ~ |
| 232 | ne two three ~ |
| 233 | one two three ~ |
| 234 | |
| 235 | Jump to the last change with ":later 1h": |
| 236 | one three ~ |
| 237 | |
| 238 | And back to the start again with ":earlier 1h": |
| 239 | one two three ~ |
| 240 | |
| 241 | |
| 242 | Note that using "u" and CTRL-R will not get you to all possible text states |
| 243 | while repeating "g-" and "g+" does. |
| 244 | |
| 245 | ============================================================================== |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 246 | 5. Undo persistence *undo-persistence* *persistent-undo* |
| 247 | |
| 248 | When unloading a buffer Vim normally destroys the tree of undos created for |
| 249 | that buffer. By setting the 'undofile' option, Vim will automatically save |
| 250 | your undo history when you write a file and restore undo history when you edit |
| 251 | the file again. |
| 252 | |
| 253 | The 'undofile' option is checked after writing a file, before the BufWritePost |
| 254 | autocommands. If you want to control what files to write undo information |
| 255 | for, you can use a BufWritePre autocommand: > |
| 256 | au BufWritePre /tmp/* setlocal noundofile |
| 257 | |
| 258 | Vim saves undo trees in a separate undo file, one for each edited file, using |
| 259 | a simple scheme that maps filesystem paths directly to undo files. Vim will |
| 260 | detect if an undo file is no longer synchronized with the file it was written |
| 261 | for (with a hash of the file contents) and ignore it when the file was changed |
Bram Moolenaar | 0536570 | 2010-10-27 18:34:44 +0200 | [diff] [blame] | 262 | after the undo file was written, to prevent corruption. An undo file is also |
Bram Moolenaar | baca7f7 | 2013-09-22 14:42:24 +0200 | [diff] [blame] | 263 | ignored if its owner differs from the owner of the edited file, except when |
| 264 | the owner of the undo file is the current user. Set 'verbose' to get a |
| 265 | message about that when opening a file. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 266 | |
| 267 | Undo files are normally saved in the same directory as the file. This can be |
| 268 | changed with the 'undodir' option. |
| 269 | |
Bram Moolenaar | d592deb | 2022-06-17 15:42:40 +0100 | [diff] [blame] | 270 | When the file is encrypted, the text in the undo file is also encrypted. The |
Bram Moolenaar | a3ff49f | 2010-05-30 22:48:02 +0200 | [diff] [blame] | 271 | same key and method is used. |encryption| |
| 272 | |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 273 | Note that text properties are not stored in the undo file. You can restore |
| 274 | text properties so long as a buffer is loaded, but you cannot restore them |
| 275 | from an undo file. Rationale: It would require the associated text property |
| 276 | types to be defined in exactly the same was as before, which cannot be |
| 277 | guaranteed. |
| 278 | |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 279 | You can also save and restore undo histories by using ":wundo" and ":rundo" |
| 280 | respectively: |
| 281 | *:wundo* *:rundo* |
| 282 | :wundo[!] {file} |
| 283 | Write undo history to {file}. |
| 284 | When {file} exists and it does not look like an undo file |
| 285 | (the magic number at the start of the file is wrong), then |
| 286 | this fails, unless the ! was added. |
| 287 | If it exists and does look like an undo file it is |
Bram Moolenaar | 664f3cf | 2019-12-07 16:03:51 +0100 | [diff] [blame] | 288 | overwritten. If there is no undo-history, nothing will be |
Bram Moolenaar | b8ff1fb | 2012-02-04 21:59:01 +0100 | [diff] [blame] | 289 | written. |
| 290 | Implementation detail: Overwriting happens by first deleting |
| 291 | the existing file and then creating a new file with the same |
| 292 | name. So it is not possible to overwrite an existing undofile |
| 293 | in a write-protected directory. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 294 | |
| 295 | :rundo {file} Read undo history from {file}. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 296 | |
| 297 | You can use these in autocommands to explicitly specify the name of the |
| 298 | history file. E.g.: > |
| 299 | |
Bram Moolenaar | a17d4c1 | 2010-05-30 18:30:36 +0200 | [diff] [blame] | 300 | au BufReadPost * call ReadUndo() |
| 301 | au BufWritePost * call WriteUndo() |
| 302 | func ReadUndo() |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 303 | if filereadable(expand('%:h') .. '/UNDO/' .. expand('%:t')) |
Bram Moolenaar | a17d4c1 | 2010-05-30 18:30:36 +0200 | [diff] [blame] | 304 | rundo %:h/UNDO/%:t |
| 305 | endif |
| 306 | endfunc |
| 307 | func WriteUndo() |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 308 | let dirname = expand('%:h') .. '/UNDO' |
Bram Moolenaar | a17d4c1 | 2010-05-30 18:30:36 +0200 | [diff] [blame] | 309 | if !isdirectory(dirname) |
| 310 | call mkdir(dirname) |
| 311 | endif |
| 312 | wundo %:h/UNDO/%:t |
| 313 | endfunc |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 314 | |
| 315 | You should keep 'undofile' off, otherwise you end up with two undo files for |
| 316 | every write. |
Bram Moolenaar | a17d4c1 | 2010-05-30 18:30:36 +0200 | [diff] [blame] | 317 | |
| 318 | You can use the |undofile()| function to find out the file name that Vim would |
| 319 | use. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 320 | |
| 321 | Note that while reading/writing files and 'undofile' is set most errors will |
| 322 | be silent, unless 'verbose' is set. With :wundo and :rundo you will get more |
| 323 | error messages, e.g., when the file cannot be read or written. |
| 324 | |
| 325 | NOTE: undo files are never deleted by Vim. You need to delete them yourself. |
| 326 | |
| 327 | Reading an existing undo file may fail for several reasons: |
| 328 | *E822* It cannot be opened, because the file permissions don't allow it. |
| 329 | *E823* The magic number at the start of the file doesn't match. This usually |
| 330 | means it is not an undo file. |
| 331 | *E824* The version number of the undo file indicates that it's written by a |
| 332 | newer version of Vim. You need that newer version to open it. Don't |
| 333 | write the buffer if you want to keep the undo info in the file. |
Bram Moolenaar | 7db5fc8 | 2010-05-24 11:59:29 +0200 | [diff] [blame] | 334 | "File contents changed, cannot use undo info" |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 335 | The file text differs from when the undo file was written. This means |
Bram Moolenaar | 7db5fc8 | 2010-05-24 11:59:29 +0200 | [diff] [blame] | 336 | the undo file cannot be used, it would corrupt the text. This also |
| 337 | happens when 'encoding' differs from when the undo file was written. |
Bram Moolenaar | 9db5806 | 2010-05-29 20:33:07 +0200 | [diff] [blame] | 338 | *E825* The undo file does not contain valid contents and cannot be used. |
Bram Moolenaar | 56be950 | 2010-06-06 14:20:26 +0200 | [diff] [blame] | 339 | *E826* The undo file is encrypted but decryption failed. |
| 340 | *E827* The undo file is encrypted but this version of Vim does not support |
| 341 | encryption. Open the file with another Vim. |
| 342 | *E832* The undo file is encrypted but 'key' is not set, the text file is not |
| 343 | encrypted. This would happen if the text file was written by Vim |
| 344 | encrypted at first, and later overwritten by not encrypted text. |
| 345 | You probably want to delete this undo file. |
Bram Moolenaar | 6ed8ed8 | 2010-05-30 20:40:11 +0200 | [diff] [blame] | 346 | "Not reading undo file, owner differs" |
| 347 | The undo file is owned by someone else than the owner of the text |
| 348 | file. For safety the undo file is not used. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 349 | |
| 350 | Writing an undo file may fail for these reasons: |
| 351 | *E828* The file to be written cannot be created. Perhaps you do not have |
| 352 | write permissions in the directory. |
Bram Moolenaar | 6ed8ed8 | 2010-05-30 20:40:11 +0200 | [diff] [blame] | 353 | "Cannot write undo file in any directory in 'undodir'" |
| 354 | None of the directories in 'undodir' can be used. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 355 | "Will not overwrite with undo file, cannot read" |
| 356 | A file exists with the name of the undo file to be written, but it |
| 357 | cannot be read. You may want to delete this file or rename it. |
| 358 | "Will not overwrite, this is not an undo file" |
| 359 | A file exists with the name of the undo file to be written, but it |
| 360 | does not start with the right magic number. You may want to delete |
| 361 | this file or rename it. |
Bram Moolenaar | 24ea3ba | 2010-09-19 19:01:21 +0200 | [diff] [blame] | 362 | "Skipping undo file write, nothing to undo" |
| 363 | There is no undo information to be written, nothing has been changed |
Bram Moolenaar | 6ed8ed8 | 2010-05-30 20:40:11 +0200 | [diff] [blame] | 364 | or 'undolevels' is negative. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 365 | *E829* An error occurred while writing the undo file. You may want to try |
| 366 | again. |
| 367 | |
| 368 | ============================================================================== |
| 369 | 6. Remarks about undo *undo-remarks* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 370 | |
| 371 | The number of changes that are remembered is set with the 'undolevels' option. |
| 372 | If it is zero, the Vi-compatible way is always used. If it is negative no |
| 373 | undo is possible. Use this if you are running out of memory. |
| 374 | |
Bram Moolenaar | 945e2db | 2010-06-05 17:43:32 +0200 | [diff] [blame] | 375 | *clear-undo* |
| 376 | When you set 'undolevels' to -1 the undo information is not immediately |
| 377 | cleared, this happens at the next change. To force clearing the undo |
| 378 | information you can use these commands: > |
Christian Brabandt | 6efb198 | 2023-08-10 05:44:25 +0200 | [diff] [blame] | 379 | :let old_undolevels = &l:undolevels |
| 380 | :setlocal undolevels=-1 |
Bram Moolenaar | 945e2db | 2010-06-05 17:43:32 +0200 | [diff] [blame] | 381 | :exe "normal a \<BS>\<Esc>" |
Christian Brabandt | 6efb198 | 2023-08-10 05:44:25 +0200 | [diff] [blame] | 382 | :let &l:undolevels = old_undolevels |
Bram Moolenaar | 945e2db | 2010-06-05 17:43:32 +0200 | [diff] [blame] | 383 | :unlet old_undolevels |
| 384 | |
Christian Brabandt | 6efb198 | 2023-08-10 05:44:25 +0200 | [diff] [blame] | 385 | Note use of `&l:undolevels` to explicitly read the local value of 'undolevels' |
| 386 | and the use of `:setlocal` to change only the local option (which takes |
| 387 | precedence over the corresponding global option value). Saving the option value |
| 388 | via the use of `&undolevels` is unpredictable; it reads either the local value |
| 389 | (if one has been set) or the global value (otherwise). Also, if a local value |
| 390 | has been set, changing the option via `:set undolevels` will change both the |
| 391 | global and local values, requiring extra work to save and restore both values. |
| 392 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 393 | Marks for the buffer ('a to 'z) are also saved and restored, together with the |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 394 | text. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 395 | |
| 396 | When all changes have been undone, the buffer is not considered to be changed. |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 397 | It is then possible to exit Vim with ":q" instead of ":q!". Note |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 398 | that this is relative to the last write of the file. Typing "u" after ":w" |
| 399 | actually changes the buffer, compared to what was written, so the buffer is |
| 400 | considered changed then. |
| 401 | |
| 402 | When manual |folding| is being used, the folds are not saved and restored. |
| 403 | Only changes completely within a fold will keep the fold as it was, because |
| 404 | the first and last line of the fold don't change. |
| 405 | |
| 406 | The numbered registers can also be used for undoing deletes. Each time you |
| 407 | delete text, it is put into register "1. The contents of register "1 are |
| 408 | shifted to "2, etc. The contents of register "9 are lost. You can now get |
| 409 | back the most recent deleted text with the put command: '"1P'. (also, if the |
| 410 | deleted text was the result of the last delete or copy operation, 'P' or 'p' |
| 411 | also works as this puts the contents of the unnamed register). You can get |
| 412 | back the text of three deletes ago with '"3P'. |
| 413 | |
| 414 | *redo-register* |
| 415 | If you want to get back more than one part of deleted text, you can use a |
| 416 | special feature of the repeat command ".". It will increase the number of the |
Bram Moolenaar | cb80aa2 | 2020-10-26 21:12:46 +0100 | [diff] [blame] | 417 | register used. So if you first do '"1P', the following "." will result in a |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 418 | '"2P'. Repeating this will result in all numbered registers being inserted. |
| 419 | |
| 420 | Example: If you deleted text with 'dd....' it can be restored with |
| 421 | '"1P....'. |
| 422 | |
| 423 | If you don't know in which register the deleted text is, you can use the |
| 424 | :display command. An alternative is to try the first register with '"1P', and |
| 425 | if it is not what you want do 'u.'. This will remove the contents of the |
| 426 | first put, and repeat the put command for the second register. Repeat the |
| 427 | 'u.' until you got what you want. |
| 428 | |
Bram Moolenaar | d473c8c | 2018-08-11 18:00:22 +0200 | [diff] [blame] | 429 | vim:tw=78:ts=8:noet:ft=help:norl: |