使用Vim的持久撤销功能?

108

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

不幸的是,我还没有完全成功地启用它,或者我可能使用错误的方法。 我尝试了以下方法:

我在~/.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

根据这个方法,我应该能够打开任何文件,编辑它,然后保存关闭它,当我再次打开它时,我应该能够像从未离开过一样撤消/重做。不幸的是,事实并非如此,因为没有undofile被写入。

注意:

  1. 我在使用Vim without cream项目中的Vim 7.3,并且已经内置了持久化撤销。

  2. $HOME/.vim/undo 文件夹存在于我的文件系统中。


43
强调一下,第二点非常重要。Vim不会为您创建目录,并且持久撤销功能在您执行mkdir ~/.vim/undo之前无法正常工作。 - puk
2
+1。抱歉,在Linux上它可以工作...感谢你告诉我! - Ciro Santilli OurBigBook.com
对于未来访问此问题的任何人:不要在undodir的值周围加上引号!我因为这个问题卡了一段时间 - 使用绝对路径,而不要在周围加上引号。 - naiveai
4个回答

60

如果不存在undodir,将以下代码放入你的.vimrc文件中来创建一个,并启用持久化撤销。在Windows和Linux上测试通过。

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

if stridx(&runtimepath, expand(vimDir)) == -1
  " vimDir is not on runtimepath, add it
  let &runtimepath.=','.vimDir
endif

" 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
谢谢Kyle,如果不存在的话创建.vim是个好主意。不幸的是,在Windows上不存在-p标志,因此我编辑了答案,调用mkdir两次以确保兼容性。 - Matthias Braun
2
啊,我使用“-p”标志的主要原因实际上是为了避免目录存在时出现错误。我将我的命令放在一个“if has('win32')”块中,所以在Windows上我只需使用不带“-p”的“mkdir”。 - Kyle Strand
5
为什么不使用mkdir()函数?这样可以将代码改为call mkdir(myUndoDir, 'p'),效果等同于mkdir -p。请注意,该翻译保持原文意思不变,同时使语言更加通俗易懂,没有解释或提供非翻译内容。 - nelstrom
1
@MatthiasBraun 我刚意识到mkdir()的文档在VimNeovim中是不同的。当我提出这个建议时,我一直在看Neovim的文档,其中指出:“如果您尝试使用{path}设置为“p”创建现有目录,则mkdir()将静默退出。” 显然,在Vim中并非如此。我的错! - nelstrom
显示剩余4条评论

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(结束if语句)“添加注释消息以增加消息长度”。 - Arelav
has('persistent_undo')有什么意义?我为什么需要它?它什么时候为真?什么时候为假? - undefined
如果在运行的vim实例中编译了持久撤销选项,has('persistent_undo')将返回true。这在您在不同环境中使用相同的vimrc文件时非常有用。 - undefined

3

我猜 $HOME 没有像它宣传的那样工作。

在我的系统上,:echo $HOME 显示为 H:\,但是 : e $HOME/ 却显示:~/ invalid filename。

您可以尝试使用绝对路径来查看是否能够解决这个问题。


我可以毫不费力地使用“|:echo $HOME|”和“|:e $ HOME /|”,但我还是试图进行更改。 有时似乎可以正常工作,而有时则不能。 特别是,当我编辑我的“~/.vimrc”文件时,它从未保存备份。 - duckworthd
在Windows 7上,我正在使用$TEMP。当我查看set undodir?时,它显示为~/AppData/Local/Temp。撤销文件被持久化并正确加载。也许$TEMP会更可靠? - slawek
在Linux中,~是命令行中$HOME的快捷方式,你已经知道了。 关于它有时候能工作,我猜可能取决于你从哪个环境启动vim。 我想它在git安装中附带的迷你shell中应该能工作,但在普通的Windows shell中可能无法识别。 无法测试,不再使用Windows了。 也许可以尝试使用H:\ ... - undefined

1
这现在已经按预期工作了:在Windows 7上的Vim 7.4缓冲区中打开file.txt:setlocal undofile,然后保存对缓冲区的更改,就会创建一个名为.file.txt.un~的undofile,因为:set undodir?默认情况下报告“undodir = .”-即无需手动指定。您还可以在modeline中使用:set undofile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接