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
- 但我无法弄清楚如何逃避%
个字符。
答案 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”的这个庞大的本土混乱来折磨人们。