Vim:如何从vim内部删除/清除mkview创建的视图

Dav*_*lar 12 vim

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

au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
Run Code Online (Sandbox Code Playgroud)

这将创建状态文件(在〜/ .vim/view等位置)

但有时,您希望清除视图信息,以便文件以新的状态启动.

我能看到这样做的唯一方法是:

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

这些都很麻烦,涉及到vim以外的事情.是不是有某种方法:

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

我想你可以编写一个带有文件路径的shell脚本,并试图找出.vim/view目录中vim的'= +'路径编码并删除它然后从vim内部调用shell脚本,但看起来好像vim应该对此有一些支持.

Dav*_*lar 6

看起来vim没有这种能力,所以我需要写一个正确引用的vimscript(感谢灵感和来自Ingo的'&viewdir'的注释).

这是vimscript,您可以将其添加到.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>
Run Code Online (Sandbox Code Playgroud)

添加此内容后,您只需执行以下操作:

:delview
Run Code Online (Sandbox Code Playgroud)

从命令行,它将删除为当前缓冲区/文件创建的视图

您的$ HOME环境变量必须设置为vim认为'〜'的任何内容