vim:需要解决 undofile() 中的错误

vim: need to workaround a bug in undofile()

vim 中的永久撤消功能使用内部函数 undofile() 来确定当前缓冲区的撤消文件的文件名。在我的一台机器上 vim 8.0 中有一个错误,其中 undofile() 没有正确转义路径分隔符。

:echo undofile(@%)
/home/bhawkins/.vim/undo/%home%bhawkins%some%path%to%code.c

那些 % 字符在这台机器上不起作用(不知道为什么)。该命令的正确结果应该是:

:echo undofile(@%)
/home/bhawkins/.vim/undo/\%home\%bhawkins\%some\%path\%to\%code.c

所以它无法加载撤消历史记录,即使它正确地保存了历史记录。例如,当我手动加载撤消文件时,持久撤消神奇地开始工作(仅针对那个缓冲区):

:rundo /home/bhawkins/.vim/undo/\%home\%bhawkins\%some\%path\%to\%code.c

我尝试通过将 undofile() 的结果放入 let 变量中,在我的 .vimrc 中将其设置为 autocmd FileReadPost——但我想不通了解如何转义 % 个字符。

你可以试试这个:

1  redir => oldundo
2  echo undofile(@%)
3  redir end
4  let oldundo=oldundo[1:]
5  let newundo=substitute(oldundo,"%","\\%","g")

前三行捕获 oldundo 变量中的撤消路径。 第 4 行从 oldundo 中删除第一个字符 (^@)。最后一行将 % 替换为 \% 并将结果存储在 newundo 中。最后要使用新路径,您可以键入:

:rundo <c-r>=newundo<cr>

这里的<c-r>表示Ctrl + r。而 <cr> 代表 Enter 键。

结果证明在 autocmd 中引用变量非常棘手:

autocmd BufReadPost * :let undofilename=substitute(undofile(@%), "%", "\\%", "g")
autocmd BufReadPost * :silent execute "rundo ".g:undofilename

在我看来,这是 vim 应该使用像 python 这样的 well-organized 语言作为其命令行和脚本的另一个原因,而不是用这种自创的混乱来折磨人们称为 "vimscript".