518

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

vim a/*.php

打开 23 个文件。

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

:q

这关闭了我所有的缓冲区。

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

4

10 回答 10

670
于 2009-09-04T21:34:06.293 回答
371

如果前面的答案不明显:

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

于 2009-08-13T02:49:32.117 回答
115

使用 :buffers 检查你的缓冲区 ID

你会看到那里的缓冲区列表,比如

1  a.php
2  b.php
3  c.php

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

:2bw

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

:1,3bw
于 2009-08-13T02:15:14.963 回答
50

与其浏览 :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 命令查找其编号。

于 2012-07-20T16:59:59.533 回答
45

采用:

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

例子:

  • 删除缓冲区 2:

    :bd2
    
于 2009-08-13T02:16:39.843 回答
19

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

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

来自我的 vimrc

于 2011-11-17T05:37:51.367 回答
4

关闭缓冲区而不关闭窗口

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

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

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

:nnoremap <Leader>q :Bdelete<CR>

优于 vim 的 :bdelete 和 :bwipeout

插件的文档中:

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

:bdelete 与 :bwipeout

插件的文档中:

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

于 2020-05-25T08:39:48.433 回答
3

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

也许切换到使用标签?

vim -p a/*.php在选项卡中打开相同的文件

gtgT来回切换标签

:q仅关闭当前选项卡

:qa关闭一切并退出

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

于 2009-09-05T07:12:05.587 回答
2

怎么样

vim -O a a

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

于 2009-08-13T02:14:11.720 回答
1

那些使用缓冲区或树导航插件(如 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。您可以修改此功能以与您自己的配置集成。

于 2013-01-02T15:38:42.613 回答