【问题标题】:Vim: Wiping Out Buffers Editing Nonexistent FilesVim:清除缓冲区编辑不存在的文件
【发布时间】:2012-01-13 03:06:37
【问题描述】:

通常当我在 Vim 中编辑时,我最终会恢复一个 Vim 会话,该会话引用了已移动目录中的一些文件。在我使用:n 打开位于新目录中的所有文件后,就会出现问题。现在,当我使用:b <buffer-name> 切换到编辑位于新目录中的特定文件的缓冲区时,存在歧义:在同名文件上打开了两个缓冲区,而其中一个文件不存在。所以我不得不使用:ls,手动搜索正在编辑不存在文件的缓冲区的索引,并在每个缓冲区上调用:bw。是否有一些简单的命令会自动清除缓冲区,为我编辑不存在的文件?

此外,在手动清除有问题的缓冲区后,连续缓冲区之间的索引会突然中断,这使得使用:<n>b 在缓冲区之间切换更加困难。是否有一个命令可以为我重新索引缓冲区,以便索引集是某个连续的范围?

感谢您的帮助!

【问题讨论】:

    标签: vim editor buffer


    【解决方案1】:

    试试下面的命令:

    function s:WipeBuffersWithoutFiles()
        let bufs=filter(range(1, bufnr('$')), 'bufexists(v:val) && '.
                                              \'empty(getbufvar(v:val, "&buftype")) && '.
                                              \'!filereadable(bufname(v:val))')
        if !empty(bufs)
            execute 'bwipeout' join(bufs)
        endif
    endfunction
    command BWnex call s:WipeBuffersWithoutFiles()
    

    用法:

    :BWnex<CR>
    

    注意一些技巧:

    • filter(range(1, bufnr('$')), 'bufexists(v:val)') 将为您提供 vim 当前拥有的所有缓冲区(缓冲区编号)的列表。
    • empty(getbufvar(v:val, '&amp;buftype')) 检查缓冲区是否真的应该有一个文件。有一些插件打开了不应该在文件系统中表示的缓冲区:例如,带有由诸如 minibufexplorer 之类的插件发出的当前打开的缓冲区列表的缓冲区。这些缓冲区总是将&amp;buftype 设置为nofile,普通缓冲区的buftype 为空。

    【讨论】:

    • 谢谢!我刚刚在与我在问题中描述的情况类似的情况下测试了该功能,它按预期工作。
    • @void-pointer 顺便说一下,关于第二个问题(重新索引缓冲区):不,没有这样的命令。缓冲区编号是稳定的,因为没有新的缓冲区将接收任何先前缓冲区的缓冲区编号。您也不能更改缓冲区编号。你所能做的就是重启vim。
    【解决方案2】:

    缓冲区不应该是唯一的吗?

    在这一系列命令之后:

    :e .bashrc
    :e .profile
    :e .bashrc
    :e .profile
    :e .bashrc
    :e .profile
    :e .bashrc
    :e .profile
    :e .bashrc
    

    我仍然只有两个可用的缓冲区,如 :buffers:ls 所示:.bashrc.profile。即使我使用多个窗口和选项卡。

    您是否将“缓冲区”与“窗口”混淆了?

    【讨论】:

    • 感谢您指出这一点;我已经编辑了问题和标题以反映问题的实际原因。我以为问题是我两次使用:e 引起的,当时是因为某些缓冲区引用了不存在的文件。
    • 我认为改变缓冲区列表的顺序是不可能的(至少是“本机”)。
    • 还有一些方法可以自动清除编辑不存在文件的缓冲区吗?
    • 不是内置方式。但是一个自定义函数可以遍历所有缓冲区并检查文件是否存在。
    【解决方案3】:

    我的两个建议都是解决方法,但我认为值得一提。一种方法是 :ls 然后用鼠标抓取,粘贴到暂存缓冲区中,然后从命令行启动。

    当我的缓冲区变得混乱时,我通常会关闭窗口。然后我有一个来自我的 shell 的命令,它从我的源代码控制中启动所有签出的文件——90% 的时间是我感兴趣的文件。

    我通常在 cygwin bash 上。并运行

    gvim `p4list` `svnopened`
    

    函数p4listsvnopened如下:

    function p4list() {
      export tempscript=`mktemp`
      echo "#!bash" > $tempscript
      p4 opened $@ | sed -e 's/#.*//g' | sed -e 's/$/ \\/g' | sed -e '1~300s/^/\
    \
    p4 where /' >> $tempscript
      chmod +x $tempscript
      $tempscript | sed -e 's/.* //g' | sed -e 's/
    

    //g' | sed -e 's/\///g' rm $临时脚本 }

    function svnopened() {
        svn st $@ | grep "^\M" | sed -e 's/^.\{8\}//'
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 2010-10-02
      • 1970-01-01
      • 2016-08-18
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      相关资源
      最近更新 更多