【问题标题】:Vim: How to remove/clear views created by mkview from inside of vimVim:如何从 vim 内部删除/清除 mkview 创建的视图
【发布时间】:2015-02-07 15:53:15
【问题描述】:

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. 删除/清除任何由 loadview 设置的状态,或者从 vim 中删除给定文件的相应 loadview 文件

我想你可以编写一个 shell 脚本来获取文件路径并尝试找出 vim 的 .vim/view 目录中路径的 '=+' 编码并将其删除,然后从 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() 来检查您当前是否在文件中。

【问题讨论】:

    标签: vim


    【解决方案1】:

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

    添加后,您可以简单地这样做:

    :delview
    

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

    您的 $HOME 环境变量必须设置为 vim 认为 '~' 的任何值

    【讨论】:

    【解决方案2】:

    由于自动视图处理是由:autocmd触发的,您可以通过暂时禁用视图的加载

    :noautocmd edit myfile
    

    请注意,这也会关闭其他插件/自定义项所做的任何挂钩。


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

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

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

    【讨论】:

    • 禁用视图的加载不会删除它,所以下次我们编辑时我们将重新加载视图。我想我必须编写一个 vimscript,但实际上似乎应该有三个命令: mkview loadview deleteview (或一些类似的) 特别是考虑到在views目录中引用vim的文件没有记录(如果一个文件怎么办?路径中有'=+'??)
    • 虽然我想我们可以打开 vim,使用 ":noautocmd 编辑文件",执行 mkview,然后至少 mkview 会被清除,但我希望将其作为单个命令执行。你的 &viewdir 给了我足够的灵感,让我写了一个 vimscript,作为答案发布在这里。
    猜你喜欢
    • 2014-03-08
    • 1970-01-01
    • 2023-04-11
    • 2010-10-16
    • 2021-12-09
    • 1970-01-01
    • 2015-02-13
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多