使用Vim的永久撤消?


96

Vim 7.3的新功能之一是“持久撤消”,它允许在退出缓冲区时将撤消树保存到文件中。

不幸的是,我还没有完全能够正确启用它,否则我一定使用错了。到目前为止,这是我尝试过的方法:

我将以下内容添加到〜/ .vimrc

set undofile                " Save undos after file closes
set undodir=$HOME/.vim/undo " where to save undo histories
set undolevels=1000         " How many undos
set undoreload=10000        " number of lines to save for undo

在此之后,我应该应该能够打开任何文件,对其进行编辑,然后保存-关闭它,并且当我再次打开它时,我应该能够撤消/重做,就像我永远不会离开一样。不幸的是,事实似乎并非如此,因为从未编写过撤消文件。

笔记:

  1. 我在Win 7上使用无奶油Vim项目中的Vim 7.3。持久撤消已完成。

  2. $ HOME / .vim / undo在我的文件系统上存在


38
仅强调一下,点2)非常重要。Vim不会为您创建目录,并且永久撤消操作要到您为止mkdir ~/.vim/undo
2012年

2
+1。抱歉,在Linux上可以使用...谢谢您告诉我!
Ciro Santilli郝海东冠状病六四事件法轮功

对于未来的任何游客到这个问题:你不要把引号undodir的价值!我在这个问题上停留了一段时间-使用绝对的泰铢,不加引号。
naiveai

Answers:


51

将其放入您的容器中.vimrc以创建一个(undodir如果不存在)并启用持久撤消。在Windows和Linux上都经过测试。

" Put plugins and dictionaries in this dir (also on Windows)
let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
    " Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif

5
这对于创建目录可能是更好的选择::silent call system('mkdir -p ' . &undodir)
Kyle Strand

1
我用的&,因为我setundodir,而不是let婷它。(在我看来,let和之间的区别set是Vimscript令人难以置信的众多“功能”之一,但YMMV却是其中之一。)
Kyle Strand

1
感谢Kyle,.vim如果不存在,创建一个好主意。不幸的是,该-p标志在Windows上不存在,因此我编辑了mkdir两次调用的答案以确保Windows兼容性。
Matthias Braun 2015年

2
啊。使用该-p标志的主要理由实际上是为了避免目录存在时出现错误。我的命令位于一个if has('win32')块内,因此我只在Windows上mkdir不使用-p它。
凯尔·斯特兰德

4
为什么不使用mkdir()?然后可以变成:call mkdir(myUndoDir, 'p'),其行为类似于mkdir -p
纳尔斯特伦

8

我在_gvimrc中尝试了此操作:

" Persistent undo
try 
    set undodir=C:\vim\undodir
    set undofile
catch
endtry

当我删除try-catch支架时,它开始按广告宣传工作,因此:

" Persistent undo
set undodir=C:\vim\undodir
set undofile

我必须创建目录。


if has('persistent_undo')
Arelav

silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav

set undodir=~/.config/nvim/backups
Arelav

1
endif“添加评论消息以增加消息长度
Arelav

3

我想$ HOME不能像宣传的那样工作。

在我的系统上,:echo $HOME显示H:\,但显示: e $HOME/~/无效的文件名。

您可以尝试使用绝对路径来查看它是否可以治愈


我可以|:echo $ HOME | 和|:e $ HOME / | 没问题,但是我还是尝试着改变一切。它似乎有时起作用,而不是别人起作用。特别是,当我编辑〜/ .vimrc文件时,它从不保存备份。
duckworth

在Windows 7上,我正在使用$TEMP。当我看set undodir?它时显示~/AppData/Local/Temp。撤消文件将保留并正确加载。也许$TEMP会更可靠?
slawek 2013年

1

现在这可以按预期工作:file.txt在Windows 7的Vim 7.4缓冲区中打开:setlocal undofile,然后将更改保存到缓冲区,并在旁边.file.txt.un~创建undofile,因为:set undodir?报告为“ undodir =”。默认情况下-即无需手动指定。您也可以:set undofile在模型中。

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.