mkview 和 loadview 是在 vim 中保存状态的绝佳方法,许多人使用诸如此类的 .vimrc 命令来自动保存所有文件的状态。
au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
这将创建状态文件(位于 ~/.vim/view 等位置)
但有时,您希望清除 View 信息,以便文件以全新状态启动。
我认为这样做的唯一方法是:
- 从命令行查找并删除相应的 .vim/view/文件
- 暂时编辑 .vimrc 以关闭 loadview、打开文件并恢复 .vimrc
这些都很麻烦并且需要在 vim 之外做事情。有没有办法:
- 打开一个文件而不执行loadview(或者可能是一种将选项传递给vimrc以跳过loadview的方法?),所以当我们关闭时,我们将有一个清晰的mkview
- 删除/清除由loadview设置的任何状态,或者从vim内部删除给定文件的相应loadview文件
我想你可以编写一个 shell 脚本,它获取文件路径并尝试找出 .vim/view 目录中路径的 vim '=+' 编码并将其删除,然后从 vim 内部调用 shell 脚本,但是看起来 vim 应该对此有某种支持。
用户@pkeu指出,如果您有自动 View 创建,那么如果您当前正在查看要删除其 View 的文件,则需要将其关闭,否则当您退出时,它只会再次创建它,您可以通过更改 mkview 自动命令来确保这一点:
au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
捆绑在一个名为“keepview”的组中 - 这使得它们很容易关闭:
:augroup keepview
: autocmd BufWinLeave ?* mkview
: autocmd BufWinEnter ?* silent loadview
:autogroup END
然后可以通过在结束函数之前添加此行来关闭它们:
:autocmd! keepview
这种方法的唯一问题是 MyDeleteView 不够智能,无法检查您当前是否正在查看要删除的文件,如果不是,则不会保存当前文件的 View 。另一种选择是根本不添加此选项,而只删除当前未打开的文件 View 。或者编写一个更智能的 MyDeleteView() 来检查您当前是否位于文件中。
最佳答案
看起来 vim 没有这种能力,所以我需要编写一个 vim 脚本来进行正确的引用(感谢 Ingo 的灵感和关于 '&viewdir' 的注释)。
这是 vim 脚本,您可以将其添加到 .vimrc 以将命令添加到 vim:
" # Function to permanently delete views created by 'mkview'
function! MyDeleteView()
let path = fnamemodify(bufname('%'),':p')
" vim's odd =~ escaping for /
let path = substitute(path, '=', '==', 'g')
if empty($HOME)
else
let path = substitute(path, '^'.$HOME, '\~', '')
endif
let path = substitute(path, '/', '=+', 'g') . '='
" view directory
let path = &viewdir.'/'.path
call delete(path)
echo "Deleted: ".path
endfunction
" # Command Delview (and it's abbreviation 'delview')
command Delview call MyDeleteView()
" Lower-case user commands: http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev
cabbrev delview <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'Delview' : 'delview')<CR>
添加此后,您可以简单地执行以下操作:
:delview
从命令行,它将删除为当前缓冲区/文件创建的 View
你的 $HOME 环境变量必须设置为 vim 认为 '~' 的值
关于Vim:如何从 vim 内部删除/清除 mkview 创建的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28384159/