Vim:如何 remove/clear 由 mkview 从 vim 内部创建的视图

Vim: How to remove/clear views created by mkview from inside of vim

mkview 和 loadview 是在 vim 中保存状态的绝妙方法,许多人使用 .vimrc 命令来自动保存所有文件的状态。

au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview

这将创建状态文件(在诸如 ~/.vim/view 的位置)

不过,有时您希望清除视图信息,以便文件以全新状态启动。

我能看到的唯一方法是:

  1. 从命令行中找到并删除相应的 .vim/view/ 文件
  2. 暂时编辑您的 .vimrc 以关闭加载视图,打开文件,然后恢复 .vimrc

这些都很麻烦,而且涉及在 vim 之外做事。有没有办法:

  1. 打开一个文件而不做 loadview(或者可能是一种将选项传递给 vimrc 以跳过 loadview 的方法?)所以当我们关闭时我们将有一个清晰的 mkview
  2. Remove/clear loadview 设置的任何状态,或者从内部删除给定文件的相应 loadview 文件 vim

我想你可以编写一个 shell 脚本,它获取文件路径并试图找出 .vim/view 目录中的 vim 路径的“=+”编码并删除它,然后从 vim 内部调用 shell 脚本,但似乎 vim 应该对此有某种支持。

用户@pkeu 指出,如果您有自动视图创建功能,那么如果您当前正在查看要为其删除视图的文件,则需要将其关闭,否则当您退出时它会再次创建它,您可以通过更改 mkview 自动命令来确保这一点:

au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview

捆绑在一个名为 "keepview" 的组中 - 这使得它们很容易关闭:

:augroup keepview
: autocmd BufWinLeave ?* mkview
: autocmd BufWinEnter ?* silent loadview
:autogroup END

然后可以通过在 endfunction 之前添加这一行来关闭它们:

:autocmd! keepview

此方法的唯一问题是 MyDeleteView 不够智能,无法检查您当前是否正在查看要删除的文件,如果没有,则不会保存当前文件的视图.另一种选择是根本不添加它,只删除当前未打开的文件的视图。或者编写一个更智能的 MyDeleteView() 来检查您当前是否在文件中。

由于自动视图处理是由:autocmd触发的,您可以通过

暂时禁用视图加载
:noautocmd edit myfile

请注意,这也会关闭由其他插件/自定义完成的任何挂钩。


要从 Vim 中删除文件,您可以使用 delete() 定义自定义命令:

:command! -nargs=1 DeleteView call delete(&viewdir . '/' . <q-args>)

这可以通过构建 globbing 甚至 Vim 的文件规范转义到它来进一步改进。

看起来 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

从命令行删除为当前 buffer/file

创建的视图

您的 $HOME 环境变量必须设置为 vim 认为“~”的值