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".
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".