【问题标题】:How do I close a single buffer (out of many) in Vim?如何在 Vim 中关闭单个缓冲区(在许多缓冲区中)?
【发布时间】:2010-11-19 04:06:53
【问题描述】:

我在 Vim 中打开了几个文件,例如,运行

vim a/*.php

打开 23 个文件。

然后我进行编辑并运行以下两次

:q

关闭我所有的缓冲区。

如何在 Vim 中只关闭一个缓冲区?

【问题讨论】:

  • 请注意,您可以使用 vim -o a/*.php(或 -O 使用垂直窗口)在单独的 Vim 窗口中打开文件并避免缓冲区导航 - 这对于少数文件来说是一个很好的方法,但是有 23 个文件,每个文件只有几行/几列。
  • @Jefromi:感谢您指出这一点!我以前从未使用过 -o 选项。
  • 关于窗口拆分的主题。如果你已经在 Vim 中并且想在拆分中打开另一个文件 :esp 用于水平 :evsp 用于垂直。

标签: vim buffer


【解决方案1】:

请注意:“bw 中的 w 不代表写入,而是代表擦除!”

更多来自手册:

:bd

卸载缓冲区[N](默认:当前 缓冲区)并将其从 缓冲区列表。如果缓冲区已更改,则会失败, 除非指定了 [!],在这种情况下更改是 丢失。 该文件不受影响。

如果您知道自己在做什么,也可以使用:bw

:bw

喜欢|:bdelete|,但确实删除了 缓冲区。

【讨论】:

  • 还可以使用 ':M,Nbd' 关闭缓冲区编号 M 到 N。或者 ':bd N1 N2...' 其中 N# 是缓冲区编号
  • 手册说只有在“你知道自己在做什么”的情况下才使用:bw,我不知道,所以我想我会使用:bd
  • w 根据 Vim 手册是 write 命令的缩写,此外没有提到任何“清除”。该命令的描述 (help write) 以“将整个缓冲区写入当前文件”开头。
  • @amn 使用:help bw 你会看到bw 代表擦除。
  • @amn 我也很困惑,但他的意思是wbw 命令中意味着消灭他不是在谈论w 命令。他把这个警告放在那里,所以人们不认为bw 命令意味着缓冲区写入(它并不意味着缓冲区擦除。)
【解决方案2】:

如果前面的答案没有说明这一点:

:bd 将关闭当前缓冲区。如果你不想抓取缓冲区列表。

【讨论】:

  • 在找到 :bd 之前,我认为人们在执行 :ls 时没有任何问题 -> 扫描文档编号 -> 按编号卸载缓冲区。人们真的觉得这有效吗?
  • @svend 肯定适用于一系列缓冲区,但对于一个单独的缓冲区来说,a :bd 可能更有效。
  • :bd 只关闭缓冲区,而(无论如何):bw 也会清除所有变量,并真正将其从ls 缓冲区中消除。
【解决方案3】:

使用检查您的缓冲区 ID :缓冲区

你会在那里看到像

这样的缓冲区列表
1  a.php
2  b.php
3  c.php

如果你想从缓冲区中删除 b.php

:2bw

如果您想从缓冲区中删除/关闭所有内容

:1,3bw

【讨论】:

  • 您也可以使用 :%bw 擦除所有缓冲区
  • 检查缓冲区 id 的捷径:2 CTRL-G
【解决方案4】:

与其浏览 :ls 命令的输出并通过指定缓冲区的编号来删除(卸载、擦除..)缓冲区,我发现使用文件名通常更有效。

例如,在我打开几个 .txt 文件以刷新我对某些细节的记忆之后..复制并粘贴几行文本以用作各种模板..等等。我会输入以下内容:

:bd txt <Tab>

请注意,匹配的字符串不必位于文件名的开头。

上面在屏幕底部显示了与“txt”匹配的文件名列表,并保持我最初键入的 :bd 命令不变,准备完成。

这是一个例子:

doc1.txt doc2.txt
:bd txt 

我可以在 'txt' 位上退格并输入我想删除的文件名,但这变得非常方便的地方是我不必这样做:如果我第二次按下 Tab 键,Vim 会自动用第一场比赛完成我的命令:

:bd doc1.txt

如果我想摆脱这个特定的缓冲区,我只需要按 Enter。

如果我要删除的缓冲区恰好是第二个(第三个……等等)匹配项,我只需要一直按 Tab 键就可以使我的 :bd 命令在匹配项列表中循环。

当然,这种方法也可以通过 :b.. :sb.. 等命令切换到给定的缓冲区。

当设置了 'hidden' Vim 选项时,这种方法特别有用,因为缓冲区列表会很快变得非常大,覆盖多个屏幕,并且很难找到我正在寻找的特定缓冲区。

要充分利用此功能,最好阅读以下 Vim 帮助文件并相应地调整 Tab 命令行完成的行为,使其最适合您的工作流程:

:help wildmode

我上面描述的行为来自以下设置,出于一致性的考虑,我选择了该设置以模拟 bash 完成:

:set wildmode=list:longest,full

与使用缓冲区编号相反,这种方法的优点是我通常至少记住给定文件名的一部分,让我可以直接定位缓冲区,而不必先通过 :ls 命令查找其编号。

【讨论】:

    【解决方案5】:

    用途:

    • :ls - 列出缓冲区
    • :bd#n - 关闭缓冲区,其中#n 是缓冲区号(使用ls 获取)

    例子:

    • 删除缓冲区 2:

      :bd2
      

    【讨论】:

      【解决方案6】:

      您也可以将下一个和上一个映射到功能键,让循环通过缓冲区变得轻而易举

      map <F2> :bprevious<CR>
      map <F3> :bnext<CR>
      

      来自我的 vimrc

      【讨论】:

        【解决方案7】:

        关闭缓冲区而不关闭窗口

        如果您想在不破坏窗口布局(当前布局基于拆分)的情况下关闭缓冲区,您可以使用像bbye 这样的插件。基于此,您可以使用

        :Bdelete (instead of :bdelete)
        :Bwipeout (instead of :bwipeout)
        

        或者只是在您的.vimrc 中创建一个映射以便于访问,例如

        :nnoremap <Leader>q :Bdelete<CR>
        

        优于 vim 的 :bdelete 和 :bwipeout

        来自plugin's documentation

        • 关闭并移除缓冲区。
        • 在该窗口中显示另一个文件。
        • 如果您没有打开其他文件,请显示一个空文件。
        • 如果您决定在该窗口中编辑另一个文件,请不要留下无用的 [no file] 缓冲区。
        • 即使文件在多个窗口中打开也能正常工作。
        • 可以使用各种缓冲区浏览器和标签栏。

        :bdelete 与 :bwipeout

        来自plugin's documentation

        Vim 有两个关闭缓冲区的命令::bdelete:bwipeout。前者从缓冲区列表中删除文件,清除其选项、变量和映射。但是,它仍保留在跳转列表中,因此Ctrl-o 带您返回并重新打开该文件。如果这不是您想要的,请使用 :bwipeout 或 Bbye 的等效 :Bwipeout,您将使用 :bdelete

        【讨论】:

        • 谢谢,这正是我想要的,它也适用于coc-explorer。 :)
        【解决方案8】:

        [编辑:在我对 Vim 不够了解的时候,这是一个愚蠢的建议。请不要使用制表符代替缓冲区;选项卡是 Vim 的“窗口布局”]

        也许切换到使用标签?

        vim -p a/*.php 在标签页中打开相同的文件

        gtgT 来回切换标签

        :q 只关闭当前标签页

        :qa 关闭一切并退出

        :tabo 关闭除当前选项卡以外的所有内容

        【讨论】:

        • 你为什么说使用标签是一个愚蠢的建议?我只问是因为我一直使用制表符... :^/
        • @Nate:我决定详细说明leonid.shevtsov.me/en/…
        • 那是一篇很棒的帖子——它启发了我更深入地挖掘——你看过wildmenu吗?它类似于 lustyjuggler(虽然更简单),但它是内置的(这对我来说很好,因为 lustyjuggler 需要 +ruby,以及 ubuntu oneiric 船舶的默认 vim -ruby)。
        • @Nate:是的,我正在使用 wildmenu 打开文件,但是当项目中有很多文件时,它就无法扩展。此外,来自 Ubuntu 的 vim-nox 软件包支持 Ruby。
        【解决方案9】:

        怎么样

        vim -O a a
        

        这样您就可以在左侧编辑单个文件并在右侧导航整个目录... 只是一个想法,而不是解决方案......

        【讨论】:

          【解决方案10】:

          那些使用缓冲区或树导航插件(如 Buffergator 或 NERDTree)的用户需要在销毁当前缓冲区之前切换这些拆分 - 否则您会将拆分发送到 wonkyville

          我用:

          "" Buffer Navigation                                                                                                                                                                                        
          " Toggle left sidebar: NERDTree and BufferGator                                                                                                                                                             
          fu! UiToggle()                                                                                                                                                                                              
            let b = bufnr("%")                                                                                                                                                                                        
            execute "NERDTreeToggle | BuffergatorToggle"                                                                                                                                                              
            execute ( bufwinnr(b) . "wincmd w" )                                                                                                                                                                      
            execute ":set number!"                                                                                                                                                                                    
          endf                                                                                                                                                                                                        
          map  <silent> <Leader>w  <esc>:call UiToggle()<cr>   
          

          该列表中的“NERDTreeToggle”与键入:NERDTreeToggle 相同。您可以修改此功能以与您自己的配置集成。

          【讨论】:

          • 为此,bbye 插件是完美的,它可以在使用:bdelete:bwipeout 时保留您的窗口布局。见my answer
          猜你喜欢
          • 2012-05-27
          • 1970-01-01
          • 1970-01-01
          • 2017-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多