Bram Moolenaar | 9805653 | 2019-12-12 14:18:35 +0100 | [diff] [blame] | 1 | *undo.txt* For Vim version 8.2. Last change: 2019 Dec 07 |
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: |
| 68 | The undo command undoes the previous change, and also the previous undo command. |
| 69 | The redo command repeats the previous undo command. It does NOT repeat a |
| 70 | change command, use "." for that. |
| 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 | |
| 106 | After this an "u" command will undo the delete command and the previous |
| 107 | change. |
| 108 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 109 | To do the opposite, break a change into two undo blocks, in Insert mode use |
| 110 | CTRL-G u. This is useful if you want an insert command to be undoable in |
| 111 | parts. E.g., for each sentence. |i_CTRL-G_u| |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 112 | Setting the value of 'undolevels' also breaks undo. Even when the new value |
| 113 | is equal to the old value. |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 114 | |
Bram Moolenaar | e224ffa | 2006-03-01 00:01:28 +0000 | [diff] [blame] | 115 | ============================================================================== |
Bram Moolenaar | 18144c8 | 2006-04-12 21:52:12 +0000 | [diff] [blame] | 116 | 4. Undo branches *undo-branches* *undo-tree* |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 117 | |
Bram Moolenaar | 76916e6 | 2006-03-21 21:23:25 +0000 | [diff] [blame] | 118 | Above we only discussed one line of undo/redo. But it is also possible to |
| 119 | branch off. This happens when you undo a few changes and then make a new |
| 120 | change. The undone changes become a branch. You can go to that branch with |
| 121 | the following commands. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 122 | |
Bram Moolenaar | c01140a | 2006-03-24 22:21:52 +0000 | [diff] [blame] | 123 | This is explained in the user manual: |usr_32.txt|. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 124 | |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 125 | *:undol* *:undolist* |
| 126 | :undol[ist] List the leafs in the tree of changes. Example: |
Bram Moolenaar | 2a8a3ec | 2011-01-08 16:06:37 +0100 | [diff] [blame] | 127 | number changes when saved ~ |
| 128 | 88 88 2010/01/04 14:25:53 |
| 129 | 108 107 08/07 12:47:51 |
| 130 | 136 46 13:33:01 7 |
| 131 | 166 164 3 seconds ago |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 132 | |
| 133 | The "number" column is the change number. This number |
| 134 | continuously increases and can be used to identify a |
| 135 | specific undo-able change, see |:undo|. |
| 136 | The "changes" column is the number of changes to this |
| 137 | leaf from the root of the tree. |
Bram Moolenaar | 2a8a3ec | 2011-01-08 16:06:37 +0100 | [diff] [blame] | 138 | The "when" column is the date and time when this |
| 139 | change was made. The four possible formats are: |
| 140 | N seconds ago |
| 141 | HH:MM:SS hour, minute, seconds |
| 142 | MM/DD HH:MM:SS idem, with month and day |
| 143 | YYYY/MM/DD HH:MM:SS idem, with year |
Bram Moolenaar | 24ea3ba | 2010-09-19 19:01:21 +0200 | [diff] [blame] | 144 | The "saved" column specifies, if this change was |
| 145 | written to disk and which file write it was. This can |
Bram Moolenaar | 4a74803 | 2010-09-30 21:47:56 +0200 | [diff] [blame] | 146 | be used with the |:later| and |:earlier| commands. |
Bram Moolenaar | a800b42 | 2010-06-27 01:15:55 +0200 | [diff] [blame] | 147 | For more details use the |undotree()| function. |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 148 | |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 149 | *g-* |
| 150 | g- Go to older text state. With a count repeat that many |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 151 | times. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 152 | *:ea* *:earlier* |
| 153 | :earlier {count} Go to older text state {count} times. |
| 154 | :earlier {N}s Go to older text state about {N} seconds before. |
| 155 | :earlier {N}m Go to older text state about {N} minutes before. |
| 156 | :earlier {N}h Go to older text state about {N} hours before. |
Bram Moolenaar | 730cde9 | 2010-06-27 05:18:54 +0200 | [diff] [blame] | 157 | :earlier {N}d Go to older text state about {N} days before. |
| 158 | |
| 159 | :earlier {N}f Go to older text state {N} file writes before. |
Bram Moolenaar | 24ea3ba | 2010-09-19 19:01:21 +0200 | [diff] [blame] | 160 | When changes were made since the last write |
Bram Moolenaar | 730cde9 | 2010-06-27 05:18:54 +0200 | [diff] [blame] | 161 | ":earlier 1f" will revert the text to the state when |
| 162 | it was written. Otherwise it will go to the write |
| 163 | before that. |
| 164 | When at the state of the first file write, or when |
| 165 | the file was not written, ":earlier 1f" will go to |
| 166 | before the first change. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 167 | |
| 168 | *g+* |
| 169 | g+ Go to newer text state. With a count repeat that many |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 170 | times. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 171 | *:lat* *:later* |
| 172 | :later {count} Go to newer text state {count} times. |
| 173 | :later {N}s Go to newer text state about {N} seconds later. |
| 174 | :later {N}m Go to newer text state about {N} minutes later. |
| 175 | :later {N}h Go to newer text state about {N} hours later. |
Bram Moolenaar | 730cde9 | 2010-06-27 05:18:54 +0200 | [diff] [blame] | 176 | :later {N}d Go to newer text state about {N} days later. |
| 177 | |
| 178 | :later {N}f Go to newer text state {N} file writes later. |
| 179 | When at the state of the last file write, ":later 1f" |
| 180 | will go to the newest text state. |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 181 | |
Bram Moolenaar | efd2bf1 | 2006-03-16 21:41:35 +0000 | [diff] [blame] | 182 | |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 183 | Note that text states will become unreachable when undo information is cleared |
| 184 | for 'undolevels'. |
| 185 | |
| 186 | Don't be surprised when moving through time shows multiple changes to take |
| 187 | place at a time. This happens when moving through the undo tree and then |
| 188 | making a new change. |
| 189 | |
| 190 | EXAMPLE |
| 191 | |
| 192 | Start with this text: |
| 193 | one two three ~ |
| 194 | |
| 195 | Delete the first word by pressing "x" three times: |
| 196 | ne two three ~ |
| 197 | e two three ~ |
| 198 | two three ~ |
| 199 | |
| 200 | Now undo that by pressing "u" three times: |
| 201 | e two three ~ |
| 202 | ne two three ~ |
| 203 | one two three ~ |
| 204 | |
| 205 | Delete the second word by pressing "x" three times: |
| 206 | one wo three ~ |
| 207 | one o three ~ |
| 208 | one three ~ |
| 209 | |
| 210 | Now undo that by using "g-" three times: |
| 211 | one o three ~ |
| 212 | one wo three ~ |
Bram Moolenaar | 1f4d4de | 2006-03-14 23:00:46 +0000 | [diff] [blame] | 213 | two three ~ |
| 214 | |
| 215 | You are now back in the first undo branch, after deleting "one". Repeating |
| 216 | "g-" will now bring you back to the original text: |
| 217 | e two three ~ |
| 218 | ne two three ~ |
| 219 | one two three ~ |
| 220 | |
| 221 | Jump to the last change with ":later 1h": |
| 222 | one three ~ |
| 223 | |
| 224 | And back to the start again with ":earlier 1h": |
| 225 | one two three ~ |
| 226 | |
| 227 | |
| 228 | Note that using "u" and CTRL-R will not get you to all possible text states |
| 229 | while repeating "g-" and "g+" does. |
| 230 | |
| 231 | ============================================================================== |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 232 | 5. Undo persistence *undo-persistence* *persistent-undo* |
| 233 | |
| 234 | When unloading a buffer Vim normally destroys the tree of undos created for |
| 235 | that buffer. By setting the 'undofile' option, Vim will automatically save |
| 236 | your undo history when you write a file and restore undo history when you edit |
| 237 | the file again. |
| 238 | |
| 239 | The 'undofile' option is checked after writing a file, before the BufWritePost |
| 240 | autocommands. If you want to control what files to write undo information |
| 241 | for, you can use a BufWritePre autocommand: > |
| 242 | au BufWritePre /tmp/* setlocal noundofile |
| 243 | |
| 244 | Vim saves undo trees in a separate undo file, one for each edited file, using |
| 245 | a simple scheme that maps filesystem paths directly to undo files. Vim will |
| 246 | detect if an undo file is no longer synchronized with the file it was written |
| 247 | 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] | 248 | 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] | 249 | ignored if its owner differs from the owner of the edited file, except when |
| 250 | the owner of the undo file is the current user. Set 'verbose' to get a |
| 251 | message about that when opening a file. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 252 | |
| 253 | Undo files are normally saved in the same directory as the file. This can be |
| 254 | changed with the 'undodir' option. |
| 255 | |
Bram Moolenaar | a3ff49f | 2010-05-30 22:48:02 +0200 | [diff] [blame] | 256 | When the file is encrypted, the text in the undo file is also crypted. The |
| 257 | same key and method is used. |encryption| |
| 258 | |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 259 | Note that text properties are not stored in the undo file. You can restore |
| 260 | text properties so long as a buffer is loaded, but you cannot restore them |
| 261 | from an undo file. Rationale: It would require the associated text property |
| 262 | types to be defined in exactly the same was as before, which cannot be |
| 263 | guaranteed. |
| 264 | |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 265 | You can also save and restore undo histories by using ":wundo" and ":rundo" |
| 266 | respectively: |
| 267 | *:wundo* *:rundo* |
| 268 | :wundo[!] {file} |
| 269 | Write undo history to {file}. |
| 270 | When {file} exists and it does not look like an undo file |
| 271 | (the magic number at the start of the file is wrong), then |
| 272 | this fails, unless the ! was added. |
| 273 | If it exists and does look like an undo file it is |
Bram Moolenaar | 664f3cf | 2019-12-07 16:03:51 +0100 | [diff] [blame] | 274 | overwritten. If there is no undo-history, nothing will be |
Bram Moolenaar | b8ff1fb | 2012-02-04 21:59:01 +0100 | [diff] [blame] | 275 | written. |
| 276 | Implementation detail: Overwriting happens by first deleting |
| 277 | the existing file and then creating a new file with the same |
| 278 | name. So it is not possible to overwrite an existing undofile |
| 279 | in a write-protected directory. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 280 | |
| 281 | :rundo {file} Read undo history from {file}. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 282 | |
| 283 | You can use these in autocommands to explicitly specify the name of the |
| 284 | history file. E.g.: > |
| 285 | |
Bram Moolenaar | a17d4c1 | 2010-05-30 18:30:36 +0200 | [diff] [blame] | 286 | au BufReadPost * call ReadUndo() |
| 287 | au BufWritePost * call WriteUndo() |
| 288 | func ReadUndo() |
| 289 | if filereadable(expand('%:h'). '/UNDO/' . expand('%:t')) |
| 290 | rundo %:h/UNDO/%:t |
| 291 | endif |
| 292 | endfunc |
| 293 | func WriteUndo() |
| 294 | let dirname = expand('%:h') . '/UNDO' |
| 295 | if !isdirectory(dirname) |
| 296 | call mkdir(dirname) |
| 297 | endif |
| 298 | wundo %:h/UNDO/%:t |
| 299 | endfunc |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 300 | |
| 301 | You should keep 'undofile' off, otherwise you end up with two undo files for |
| 302 | every write. |
Bram Moolenaar | a17d4c1 | 2010-05-30 18:30:36 +0200 | [diff] [blame] | 303 | |
| 304 | You can use the |undofile()| function to find out the file name that Vim would |
| 305 | use. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 306 | |
| 307 | Note that while reading/writing files and 'undofile' is set most errors will |
| 308 | be silent, unless 'verbose' is set. With :wundo and :rundo you will get more |
| 309 | error messages, e.g., when the file cannot be read or written. |
| 310 | |
| 311 | NOTE: undo files are never deleted by Vim. You need to delete them yourself. |
| 312 | |
| 313 | Reading an existing undo file may fail for several reasons: |
| 314 | *E822* It cannot be opened, because the file permissions don't allow it. |
| 315 | *E823* The magic number at the start of the file doesn't match. This usually |
| 316 | means it is not an undo file. |
| 317 | *E824* The version number of the undo file indicates that it's written by a |
| 318 | newer version of Vim. You need that newer version to open it. Don't |
| 319 | 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] | 320 | "File contents changed, cannot use undo info" |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 321 | 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] | 322 | the undo file cannot be used, it would corrupt the text. This also |
| 323 | happens when 'encoding' differs from when the undo file was written. |
Bram Moolenaar | 9db5806 | 2010-05-29 20:33:07 +0200 | [diff] [blame] | 324 | *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] | 325 | *E826* The undo file is encrypted but decryption failed. |
| 326 | *E827* The undo file is encrypted but this version of Vim does not support |
| 327 | encryption. Open the file with another Vim. |
| 328 | *E832* The undo file is encrypted but 'key' is not set, the text file is not |
| 329 | encrypted. This would happen if the text file was written by Vim |
| 330 | encrypted at first, and later overwritten by not encrypted text. |
| 331 | You probably want to delete this undo file. |
Bram Moolenaar | 6ed8ed8 | 2010-05-30 20:40:11 +0200 | [diff] [blame] | 332 | "Not reading undo file, owner differs" |
| 333 | The undo file is owned by someone else than the owner of the text |
| 334 | file. For safety the undo file is not used. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 335 | |
| 336 | Writing an undo file may fail for these reasons: |
| 337 | *E828* The file to be written cannot be created. Perhaps you do not have |
| 338 | write permissions in the directory. |
Bram Moolenaar | 6ed8ed8 | 2010-05-30 20:40:11 +0200 | [diff] [blame] | 339 | "Cannot write undo file in any directory in 'undodir'" |
| 340 | None of the directories in 'undodir' can be used. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 341 | "Will not overwrite with undo file, cannot read" |
| 342 | A file exists with the name of the undo file to be written, but it |
| 343 | cannot be read. You may want to delete this file or rename it. |
| 344 | "Will not overwrite, this is not an undo file" |
| 345 | A file exists with the name of the undo file to be written, but it |
| 346 | does not start with the right magic number. You may want to delete |
| 347 | this file or rename it. |
Bram Moolenaar | 24ea3ba | 2010-09-19 19:01:21 +0200 | [diff] [blame] | 348 | "Skipping undo file write, nothing to undo" |
| 349 | There is no undo information to be written, nothing has been changed |
Bram Moolenaar | 6ed8ed8 | 2010-05-30 20:40:11 +0200 | [diff] [blame] | 350 | or 'undolevels' is negative. |
Bram Moolenaar | 55debbe | 2010-05-23 23:34:36 +0200 | [diff] [blame] | 351 | *E829* An error occurred while writing the undo file. You may want to try |
| 352 | again. |
| 353 | |
| 354 | ============================================================================== |
| 355 | 6. Remarks about undo *undo-remarks* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 356 | |
| 357 | The number of changes that are remembered is set with the 'undolevels' option. |
| 358 | If it is zero, the Vi-compatible way is always used. If it is negative no |
| 359 | undo is possible. Use this if you are running out of memory. |
| 360 | |
Bram Moolenaar | 945e2db | 2010-06-05 17:43:32 +0200 | [diff] [blame] | 361 | *clear-undo* |
| 362 | When you set 'undolevels' to -1 the undo information is not immediately |
| 363 | cleared, this happens at the next change. To force clearing the undo |
| 364 | information you can use these commands: > |
| 365 | :let old_undolevels = &undolevels |
| 366 | :set undolevels=-1 |
| 367 | :exe "normal a \<BS>\<Esc>" |
| 368 | :let &undolevels = old_undolevels |
| 369 | :unlet old_undolevels |
| 370 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 371 | 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] | 372 | text. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 373 | |
| 374 | 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] | 375 | 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] | 376 | that this is relative to the last write of the file. Typing "u" after ":w" |
| 377 | actually changes the buffer, compared to what was written, so the buffer is |
| 378 | considered changed then. |
| 379 | |
| 380 | When manual |folding| is being used, the folds are not saved and restored. |
| 381 | Only changes completely within a fold will keep the fold as it was, because |
| 382 | the first and last line of the fold don't change. |
| 383 | |
| 384 | The numbered registers can also be used for undoing deletes. Each time you |
| 385 | delete text, it is put into register "1. The contents of register "1 are |
| 386 | shifted to "2, etc. The contents of register "9 are lost. You can now get |
| 387 | back the most recent deleted text with the put command: '"1P'. (also, if the |
| 388 | deleted text was the result of the last delete or copy operation, 'P' or 'p' |
| 389 | also works as this puts the contents of the unnamed register). You can get |
| 390 | back the text of three deletes ago with '"3P'. |
| 391 | |
| 392 | *redo-register* |
| 393 | If you want to get back more than one part of deleted text, you can use a |
| 394 | special feature of the repeat command ".". It will increase the number of the |
| 395 | register used. So if you first do ""1P", the following "." will result in a |
| 396 | '"2P'. Repeating this will result in all numbered registers being inserted. |
| 397 | |
| 398 | Example: If you deleted text with 'dd....' it can be restored with |
| 399 | '"1P....'. |
| 400 | |
| 401 | If you don't know in which register the deleted text is, you can use the |
| 402 | :display command. An alternative is to try the first register with '"1P', and |
| 403 | if it is not what you want do 'u.'. This will remove the contents of the |
| 404 | first put, and repeat the put command for the second register. Repeat the |
| 405 | 'u.' until you got what you want. |
| 406 | |
Bram Moolenaar | d473c8c | 2018-08-11 18:00:22 +0200 | [diff] [blame] | 407 | vim:tw=78:ts=8:noet:ft=help:norl: |