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

标签 vim

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

au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview

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

但有时,您希望清除 View 信息,以便文件以全新状态启动。

我认为这样做的唯一方法是:

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

这些都很麻烦并且需要在 vim 之外做事情。有没有办法:

  1. 打开一个文件而不执行loadview(或者可能是一种将选项传递给vimrc以跳过loadview的方法?),所以当我们关闭时,我们将有一个清晰的mkview
  2. 删除/清除由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/

相关文章:

regex - Vim 在一个正则表达式中进行否定前瞻和否定后视

vim - 如何在 Vim 中打开以前打开的缓冲区?

vim - 修改 vim 高亮优先级

vim - 在 scala sbt 控制台中使用 vim,scala repl ?

bash - 不要在 vim 的 shell 中自动完成文件名的某些扩展名

vim - 默认情况下,为VIM或GVIM的某些文件扩展名添加语法突出显示

linux - Vim 在其他程序上的移动

vim - 命令定义后处理感叹号为:wq

vim - GVim : find out if guifont is available

Vim 命令注释掉选定的行?