mirror of
https://github.com/mhinz/vim-galore.git
synced 2025-02-24 01:59:28 +08:00
Basics: undo tree
This commit is contained in:
parent
bc3e935688
commit
0ebc6ffe85
@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
- Basics: [Macros?](README.md#macros)
|
- Basics: [Macros?](README.md#macros)
|
||||||
- Basics: [Ranges?](README.md#ranges)
|
- Basics: [Ranges?](README.md#ranges)
|
||||||
- Basics: [Completion?](README.md#completion)
|
- Basics: [Completion?](README.md#completion)
|
||||||
|
- Basics: [Undo tree?](README.md#undo-tree)
|
||||||
- Commands: [:redir](README.md#redir)
|
- Commands: [:redir](README.md#redir)
|
||||||
- Tips: [Saner command-line history](README.md#saner-command-line-history)
|
- Tips: [Saner command-line history](README.md#saner-command-line-history)
|
||||||
- Tips: [Reload a file on saving](README.md#reload-a-file-on-saving)
|
- Tips: [Reload a file on saving](README.md#reload-a-file-on-saving)
|
||||||
|
79
README.md
79
README.md
@ -28,6 +28,7 @@ added every day. Things about to be added can be found here:
|
|||||||
- [Motions? Operators? Text objects?](#motions-operators-text-objects)
|
- [Motions? Operators? Text objects?](#motions-operators-text-objects)
|
||||||
- [Autocmds?](#autocmds)
|
- [Autocmds?](#autocmds)
|
||||||
- [Changelist? Jumplist?](#changelist-jumplist)
|
- [Changelist? Jumplist?](#changelist-jumplist)
|
||||||
|
- [Undo tree?](#undo-tree)
|
||||||
- [Quickfix and location lists?](#quickfix-and-location-lists)
|
- [Quickfix and location lists?](#quickfix-and-location-lists)
|
||||||
- [Macros?](#macros)
|
- [Macros?](#macros)
|
||||||
- [Colorschemes?](#colorschemes)
|
- [Colorschemes?](#colorschemes)
|
||||||
@ -702,6 +703,84 @@ Related help:
|
|||||||
:h jumplist
|
:h jumplist
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Undo tree?
|
||||||
|
|
||||||
|
The latest changes to the text state are remembered. You can use _undo_ to
|
||||||
|
revert changes and _redo_ to reapply previously reverted changes.
|
||||||
|
|
||||||
|
The important bit to understand it that the data structure holding recent
|
||||||
|
changes is not a
|
||||||
|
[queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) but a
|
||||||
|
[tree](https://en.wikipedia.org/wiki/Tree_(data_structure))! Your changes are
|
||||||
|
nodes in the tree and each (but the top node) has a parent node. Each node keeps
|
||||||
|
information about the changed text and time. A branch is a series of nodes that
|
||||||
|
starts from any node and goes up to the top node. New branches get created when
|
||||||
|
you undo a change and then insert something else.
|
||||||
|
|
||||||
|
```
|
||||||
|
ifoo<esc>
|
||||||
|
obar<esc>
|
||||||
|
obaz<esc>
|
||||||
|
u
|
||||||
|
oquux<esc>
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you have 3 lines and the undo tree looks like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
foo(1)
|
||||||
|
/
|
||||||
|
bar(2)
|
||||||
|
/ \
|
||||||
|
baz(3) quux(4)
|
||||||
|
```
|
||||||
|
|
||||||
|
The undo tree has 4 changes. The numbers represent the _time_ the nodes were
|
||||||
|
created.
|
||||||
|
|
||||||
|
Now there are two ways to traverse this tree, let's call them _branch-wise_ and
|
||||||
|
_time-wise_.
|
||||||
|
|
||||||
|
Undo (`u`) and redo (`<c-r>`) work branch-wise. They go up and down the current
|
||||||
|
branch. `u` will revert the text state to the one of node "bar". Another `u`
|
||||||
|
will revert the text state even further, to the one of node "foo". Now `<c-r>`
|
||||||
|
goes back to the state of node "bar" and another `<c-r>` to the state of node
|
||||||
|
"quux". (There's no way to reach node "baz" using branch-wise commands anymore.)
|
||||||
|
|
||||||
|
Opposed to this, `g-` and `g+` work time-wise. Thus `g-` won't revert to the
|
||||||
|
state of node "bar", like `u` does, but to the chronologically previous state,
|
||||||
|
node "baz". Another `g-` would revert the state to the one of node "bar" and so
|
||||||
|
on. Thus, `g-` and `g+` simply go back and forth in time, respectively.
|
||||||
|
|
||||||
|
| Command / Mapping | Action |
|
||||||
|
|-------------------|--------|
|
||||||
|
| `[count]u`, `:undo [count]` | Undo [count] changes. |
|
||||||
|
| `[count]<c-r>`, `:redo` | Redo [count] changes. |
|
||||||
|
| `U` | Undo all all changes to the line of the latest change. |
|
||||||
|
| `[count]g-`, `:earlier [count]?` | Go to older text state [count] times. The "?" can be either "s", "m", "h", "d", or "f". E.g. `:earlier 2d` goes to the text state from 2 days ago. `:earlier 1f` will go to the state of the latest file save. |
|
||||||
|
| `[count]g+`, `:later [count]?` | Same as as above, but other direction. |
|
||||||
|
|
||||||
|
The undo tree is kept in memory and will be lost when Vim quits. If you want it
|
||||||
|
to persist, put the following in your vimrc:
|
||||||
|
|
||||||
|
```
|
||||||
|
set undofile
|
||||||
|
set undordir=$HOME/.vim/files/undo/
|
||||||
|
```
|
||||||
|
|
||||||
|
(Make sure that `~/.vim/files/undo/` actually exists.)
|
||||||
|
|
||||||
|
If you're confused by the undo tree,
|
||||||
|
[undotree](https://github.com/mbbill/undotree) does a great job at visualizing
|
||||||
|
it.
|
||||||
|
|
||||||
|
Related help:
|
||||||
|
|
||||||
|
```
|
||||||
|
:h undo.txt
|
||||||
|
:h usr_32
|
||||||
|
```
|
||||||
|
|
||||||
#### Quickfix and location lists?
|
#### Quickfix and location lists?
|
||||||
|
|
||||||
Every time an action has to return a list of locations, _quickfix_ or _location_
|
Every time an action has to return a list of locations, _quickfix_ or _location_
|
||||||
|
Loading…
x
Reference in New Issue
Block a user