123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- *usr_32.txt* For Vim version 9.0. Last change: 2010 Jul 20
- VIM USER MANUAL - by Bram Moolenaar
- The undo tree
- Vim provides multi-level undo. If you undo a few changes and then make a new
- change you create a branch in the undo tree. This text is about moving
- through the branches.
- |32.1| Undo up to a file write
- |32.2| Numbering changes
- |32.3| Jumping around the tree
- |32.4| Time travelling
- Next chapter: |usr_40.txt| Make new commands
- Previous chapter: |usr_31.txt| Exploiting the GUI
- Table of contents: |usr_toc.txt|
- ==============================================================================
- *32.1* Undo up to a file write
- Sometimes you make several changes, and then discover you want to go back to
- when you have last written the file. You can do that with this command: >
- :earlier 1f
- The "f" stands for "file" here.
- You can repeat this command to go further back in the past. Or use a count
- different from 1 to go back faster.
- If you go back too far, go forward again with: >
- :later 1f
- Note that these commands really work in time sequence. This matters if you
- made changes after undoing some changes. It's explained in the next section.
- Also note that we are talking about text writes here. For writing the undo
- information in a file see |undo-persistence|.
- ==============================================================================
- *32.2* Numbering changes
- In section |02.5| we only discussed one line of undo/redo. But it is also
- possible to branch off. This happens when you undo a few changes and then
- make a new change. The new changes become a branch in the undo tree.
- Let's start with the text "one". The first change to make is to append
- " too". And then move to the first 'o' and change it into 'w'. We then have
- two changes, numbered 1 and 2, and three states of the text:
- one ~
- |
- change 1
- |
- one too ~
- |
- change 2
- |
- one two ~
- If we now undo one change, back to "one too", and change "one" to "me" we
- create a branch in the undo tree:
- one ~
- |
- change 1
- |
- one too ~
- / \
- change 2 change 3
- | |
- one two me too ~
- You can now use the |u| command to undo. If you do this twice you get to
- "one". Use |CTRL-R| to redo, and you will go to "one too". One more |CTRL-R|
- takes you to "me too". Thus undo and redo go up and down in the tree, using
- the branch that was last used.
- What matters here is the order in which the changes are made. Undo and redo
- are not considered changes in this context. After each change you have a new
- state of the text.
- Note that only the changes are numbered, the text shown in the tree above has
- no identifier. They are mostly referred to by the number of the change above
- it. But sometimes by the number of one of the changes below it, especially
- when moving up in the tree, so that you know which change was just undone.
- ==============================================================================
- *32.3* Jumping around the tree
- So how do you get to "one two" now? You can use this command: >
- :undo 2
- The text is now "one two", you are below change 2. You can use the |:undo|
- command to jump to below any change in the tree.
- Now make another change: change "one" to "not":
- one ~
- |
- change 1
- |
- one too ~
- / \
- change 2 change 3
- | |
- one two me too ~
- |
- change 4
- |
- not two ~
- Now you change your mind and want to go back to "me too". Use the |g-|
- command. This moves back in time. Thus it doesn't walk the tree upwards or
- downwards, but goes to the change made before.
- You can repeat |g-| and you will see the text change:
- me too ~
- one two ~
- one too ~
- one ~
- Use |g+| to move forward in time:
- one ~
- one too ~
- one two ~
- me too ~
- not two ~
- Using |:undo| is useful if you know what change you want to jump to. |g-| and
- |g+| are useful if you don't know exactly what the change number is.
- You can type a count before |g-| and |g+| to repeat them.
- ==============================================================================
- *32.4* Time travelling
- When you have been working on text for a while the tree grows to become big.
- Then you may want to go to the text of some minutes ago.
- To see what branches there are in the undo tree use this command: >
- :undolist
- < number changes time ~
- 3 2 16 seconds ago
- 4 3 5 seconds ago
- Here you can see the number of the leaves in each branch and when the change
- was made. Assuming we are below change 4, at "not two", you can go back ten
- seconds with this command: >
- :earlier 10s
- Depending on how much time you took for the changes you end up at a certain
- position in the tree. The |:earlier| command argument can be "m" for minutes,
- "h" for hours and "d" for days. To go all the way back use a big number: >
- :earlier 100d
- To travel forward in time again use the |:later| command: >
- :later 1m
- The arguments are "s", "m" and "h", just like with |:earlier|.
- If you want even more details, or want to manipulate the information, you can
- use the |undotree()| function. To see what it returns: >
- :echo undotree()
- ==============================================================================
- Next chapter: |usr_40.txt| Make new commands
- Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
|