【问题标题】:Using Vim's persistent undo?使用 Vim 的持久撤销?
【发布时间】:2011-08-07 16:59:52
【问题描述】:

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 without cream 项目的 Vim 7.3。持久撤消已内置。

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

【问题讨论】:

  • 强调一下,第 2 点)非常很重要。 Vim 不会为您创建目录,并且在您 mkdir ~/.vim/undo 之前,持久撤消将不起作用
  • +1。抱歉,在 Linux 上它可以工作...感谢您告诉我!
  • 对于这个问题的任何未来访问者:不要在 undodir 的值周围加上引号!我在这个问题上停留了一段时间 - 使用绝对路径,不带引号。

标签: vim undo undo-redo


【解决方案1】:

将其放入您的.vimrc 以创建undodir(如果它不存在)并启用持久撤消。在 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

【讨论】:

  • 这可能更适合创建目录::silent call system('mkdir -p ' . &undodir)
  • 我使用&,因为我使用set undodir 而不是letting 它。 (在我看来,letset 之间的区别是 Vimscript 的许多、许多、许多令人难以置信的可怕“功能”之一,但 YMMV。)
  • 感谢 Kyle,如果 .vim 不存在,最好创建它。不幸的是,-p 标志在 Windows 上不存在,所以我编辑了两次调用 mkdir 的答案以确保 Windows 兼容性。
  • 啊。我使用-p 标志的主要原因实际上是为了避免目录存在时出错。我的命令位于 if has('win32') 块内,所以我只在 Windows 上使用 mkdir 而没有 -p
  • 为什么不使用mkdir()?那么这可以变成:call mkdir(myUndoDir, 'p'),其行为类似于mkdir -p
【解决方案2】:

我在我的 _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')
  • silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
  • set undodir=~/.config/nvim/backups
  • endif " 添加评论消息以增加消息长度
【解决方案3】:

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

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

你可以试试用绝对路径看看能不能治好

【讨论】:

  • 我可以 |:echo $HOME|和 |:e $HOME/|没有问题,但无论如何我都尝试过改变。它似乎有时有效,但在其他时候无效。特别是,当我编辑 ~/.vimrc 文件时,它从不保存备份。
  • 在 Windows 7 上,我使用的是$TEMP。当我查看set undodir? 时,它显示~/AppData/Local/Temp。撤消文件被保留并正确加载。也许$TEMP 会更可靠?
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    如果你正在寻找 %TEMP%.(filename).un~ 你不会找到它

    文件名将是 C%%Users%%(username)%_vimrc 行

    我不知道为什么

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 2013-09-23
      • 2012-09-26
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2020-05-18
      • 2022-11-25
      相关资源
      最近更新 更多