如何撤销打开缓冲区以来的所有更改?我想可能会有一些类似于:earlier
的命令可以实现这个功能。
更新:许多人建议通过遍历先前的文件写入解决问题。这不是我所要求的。我想要返回到最初加载到缓冲区的文件的原始状态,无论此后进行了多少次写入。
要将当前缓冲区还原为撤销列表中记录的第一次更改之前的原始状态(参见:help undo-tree
),可以使用以下连续两个调用:undo
命令:
:u1|u
第一个命令(:undo 1
)将回滚到缓冲区在第一次注册更改后的状态, 而第二个命令(:undo
)则回滚到第一次更改本身。
从版本8.1开始(参见:helpg Patch 8.0.1441
),Vim接受编号为0的更改作为:undo
命令的有效参数,最终提供了一种引用到任何注册更改之前状态的方法。这使得可以通过单个命令调用来实现相同的效果:
:u0
在 vim 8.1+ 和 neovim 中,你只需使用 :u0
命令即可。
:u
将会显示“已经回到最早的更改”消息。 - Hope来自文档:
:u[ndo] {N} 跳转到更改编号为{N}之后。有关{N}的含义,请参见|undo-branches|。 {不适用于Vi}
如果您键入:u 1
,则似乎会跳转到第一个更改之后;按u
或键入:u
然后将返回更改。
否则,您可以使用非常大的计数器进行:earlier
或g-
,
例如:earlier 100000000
或100000000g-
如果您将其放入映射/命令中,则可以轻松执行任何操作。 例如:
:nnoremap <C-F12> :earlier 100000000<CR>
:earlier 1f
。根据文档说明: :earlier {N}f Go to older text state {N} file writes before.
When changes were made since the last write
":earlier 1f" will revert the text to the state when
it was written. Otherwise it will go to the write
before that.
When at the state of the first file write, or when
the file was not written, ":earlier 1f" will go to
before the first change.
:earlier {N}m Go to older text state about {N} minutes before.
那应该有所帮助…并且你还有 {N} 小时之前。
:u 1
相同;如果没有任何更改,它将会给出一个错误提示“找不到撤销编号1”(使用:earlier
和大计数可以解决这个问题)。管道语法不是撤销树的一部分;它只是将两个 Vim 命令依次执行。(即等同于:u1
,然后是:u
)。 - benpmorgan|
字符用于分隔单行命令,不像shell管道。上面的命令首先运行:undo 1
命令,然后运行:undo
命令。前者会跳转到第一次更改之后,而后者会撤消第一次更改,将当前缓冲区恢复到没有记忆更改之前的状态。 - ib.