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

时间:2018-02-21 14:46:25

标签: vim undo

vim中的持久性撤消功能使用内部函数undofile()来确定当前缓冲区的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

我尝试将autocmd FileReadPost的结果放入.vimrc变量中,在undofile()中将其设置为let - 但我无法弄清楚如何逃避%个字符。

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

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 键。

答案 1 :(得分:0)

autocmd中引用变量是非常棘手的:

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

在我看来,这是另一个原因,即vim应该使用像python这样组织良好的语言作为其命令行和脚本,而不是用这个被称为“vimscript”的这个庞大的本土混乱来折磨人们。