如何使用撤消文件?


36

vim.org上的最后一条新闻讨论了使用'undofile'保存您的历史记录并撤消更改,即使重启后也是如此:

正如我上周末发现的那样,许多用户并不了解我喜欢使用自己的功能。除了具有任意数量的撤消功能外,Vim还提供了将撤消信息存储在文件中的功能。因此,您可以退出Vim,重新启动计算机,然后仍然撤消所做的更改。请参阅“ undofile”帮助。(布拉姆·摩尔纳尔)

如何启用和使用此功能?


2
布拉姆可能在谈论这个事件
Kurt Pfeifle 2015年

Answers:


37

最简单的版本是:create ~/.vim/undo-dir/directory并将以下内容添加到中.vimrc

set undodir=~/.vim/undo-dir
set undofile

但是,它并非完美无缺,因此最好继续阅读。从我自己的.vimrc

" Let's save undo info!
if !isdirectory($HOME."/.vim")
    call mkdir($HOME."/.vim", "", 0770)
endif
if !isdirectory($HOME."/.vim/undo-dir")
    call mkdir($HOME."/.vim/undo-dir", "", 0700)
endif
set undodir=~/.vim/undo-dir
set undofile

我不希望将随机目录与撤消文件混在一起。因此,我设置了undodir选项,将所有选项都放在一个撤消目录中。这就留下了一个问题-我很懒,不想在所有机器上都创建该目录(我使用版本控制系统.vimrc在多台机器上同步我的目录)。幸运的是,让Vim检查并创建目录(如果不存在)非常容易。

另请注意0700undo目录上的模式(所有者的完全权限,其他任何人均没有权限)。我编辑过的文件,时间等应保持私有。而且由于这是我只能访问的目录,因此我不必担心其他人在其中放置符号链接,他们自己的撤消文件或任何您需要担心使用系统临时目录的问题。

最后,它不是系统临时目录,它不受系统tempfile清理策略的约束。通常,这很短-一个星期左右。但是为了防止其永远增长,我在代码中添加了以下内容crontab

# m h  dom mon dow   command
 43 00 *   *   3     find /home/anthony/.vim/undo-dir -type f -mtime +90 -delete

因此,在90天未修改后,它们将被删除。(老实说,它们并不是那么大,您可以轻易地将它们永久地保留在磁盘便宜的情况下。但是,如果您的计算机受到损害,还请考虑自己的隐私权。)


感谢您详细的答案@derobert!我知道这是一个老问题,但是我一直在尝试提出一种删除旧的vim撤消文件(vi.stackexchange.com/questions/16053/…)的vimscript方法。我认为这样做比较干净,但是事实证明这并不容易。您是否曾经考虑过使用vimscript删除旧的vim文件?如果没有,您仍然会在vimscript上使用crontab吗?
罗根

1
@Logan仅在vim运行时使用vim脚本,如果有多个vim在运行,怎么办?那条cron线很简单,不会遭受那些问题的困扰,而且显然是正确的……
derobert

似乎该mkdir()函数支持使用parameter "p"选项创建多个目录结构{path}。因此上述脚本可以简化一些。使用call mkdir($HOME."/.vim/undo-dir", "p", 0700)在Vim的7.4.160对我的作品至少。
jdhao
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.