Vim:清除缓冲区编辑不存在的文件

标签 vim editor buffer

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

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

谢谢你的帮助!

最佳答案

尝试以下命令:

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, '&buftype'))检查缓冲区实际上是否应该有一个文件。有一些插件打开缓冲区永远不应该在文件系统中表示:例如,缓冲区带有由插件(如 minibufexplorer)发出的当前打开的缓冲区列表。这些缓冲区总是有 &buftype设置为类似 nofile , 普通缓冲区有空的 buftype。
  • 关于Vim:清除缓冲区编辑不存在的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8845400/

    相关文章:

    editor - 用于文本插入的术语 "caret"是如何演变的?

    c - 在 C 程序中从 Web 服务器接收网页

    c++ - 控制台未返回 cin 缓冲区中预期的字符数

    regex - vim 可视 block 搜索/替换仅替换一行中的第一次出现

    Vim:如何更改当前行号的字体颜色

    vim - 有没有办法配置 vimdiff 以忽略具有非空白差异的行上的空白?

    vim - 关闭除事件标签之外的所有标签吗?

    vim - 值得投入时间学习使用 Emacs 吗?

    html - 什么所见即所得的编辑器可以推荐给非编码人员制作网站?

    检查缓冲区中的子字符串