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