如何关闭Vim中的单个缓冲区(多个)?

Léo*_* 준영 429 vim buffer

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

vim a/*.php
Run Code Online (Sandbox Code Playgroud)

打开23个文件.

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

:q
Run Code Online (Sandbox Code Playgroud)

它关闭了我所有的缓冲区.

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

hhh*_*hhh 526

需要注意的是:"w不代表写作,而是代表畏缩!"

更多来自手册:

:BD

卸载缓冲区[N](默认值:当前缓冲区)并将其从缓冲区列表中删除.如果缓冲区已更改,则此操作将失败,除非指定了[!],否则更改将丢失.该文件不受影响.

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

:BW

像|:bdelete |,但真的删除了缓冲区.

  • 手册说只使用`:bw`,如果"你知道你在做什么",我不这样做,所以我猜我会用`:bd`. (54认同)
  • 还可以做':M,Nbd'来关闭M到N的缓冲区数.或者':bd N1 N2 ...'其中N#是缓冲区数 (4认同)
  • 根据Vim手册,`w`是`write`命令的缩写,没有提到任何"wipeout".命令(`help write`)的描述以"将整个缓冲区写入当前文件"开头. (4认同)
  • 起初我对此感到困惑 - 我正在打开一个新选项卡来关闭缓冲区......但是关闭选项卡中的缓冲区(使用直接的`:bd`)也会关闭该选项卡。您可能想要的是 `:bd n .. [m]` 或 `:n,mbd` 用于特定数字或要关闭的数字范围,您无需查看缓冲区即可完成 (2认同)
  • @amn 通过使用`:help bw` 你会看到`bw` 代表wipe。 (2认同)
  • @amn我也很困惑,但是他的意思是bw命令中的w意味着他并不是在谈论w命令。他把这个警告放在那里,所以人们并不认为`bw`命令意味着缓冲区写入(这并不意味着缓冲区擦除)。 (2认同)

Red*_*ing 347

如果以前的答案没有明显这一点:

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

  • `:bd`只关闭缓冲区而(无论这意味着什么),而`:bw`也将清除所有变量,并且真正将它从`ls`缓冲区中删除. (10认同)
  • 在找到之前:bd对我来说没有任何意义,人们在做一个问题时没有任何问题:ls - >扫描文档编号 - >按编号卸载缓冲区.人们真的发现这有效吗? (4认同)
  • @svend对于一系列缓冲区肯定,但对于一个单独的a:bd可能更有效. (3认同)

nig*_*2k1 102

使用:buffers检查缓冲区ID

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

1  a.php
2  b.php
3  c.php
Run Code Online (Sandbox Code Playgroud)

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

:2bw
Run Code Online (Sandbox Code Playgroud)

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

:1,3bw
Run Code Online (Sandbox Code Playgroud)

  • 快捷方式检查缓冲区ID:2 CTRL-G (5认同)
  • 您还可以使用:%bw擦除所有缓冲区 (4认同)

小智 42

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

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

:bd txt <Tab>
Run Code Online (Sandbox Code Playgroud)

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

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

这是一个例子:

doc1.txt doc2.txt
:bd txt 
Run Code Online (Sandbox Code Playgroud)

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

:bd doc1.txt
Run Code Online (Sandbox Code Playgroud)

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

如果我想要删除的缓冲区恰好是第二个(第三个......等)匹配,我只需要继续按Tab键使my:bd命令在匹配列表中循环.

当然,此方法也可用于通过以下命令切换到给定缓冲区:b ..:sb ..等.

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

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

:help wildmode
Run Code Online (Sandbox Code Playgroud)

我上面描述的行为来自以下设置,为了模仿bash完成,我为了一致性而选择了这个设置:

:set wildmode=list:longest,full
Run Code Online (Sandbox Code Playgroud)

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


Sha*_*aun 37

使用:

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

例子:


小智 14

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

map <F2> :bprevious<CR>
map <F3> :bnext<CR>
Run Code Online (Sandbox Code Playgroud)

来自我的vimrc


Wol*_*son 9

关闭缓冲区而不关闭窗口

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

:Bdelete (instead of :bdelete)
:Bwipeout (instead of :bwipeout)
Run Code Online (Sandbox Code Playgroud)

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

:nnoremap <Leader>q :Bdelete<CR>
Run Code Online (Sandbox Code Playgroud)

相对于 vim 的 :bdelete 和 :bwipeout 的优势

来自插件的文档

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

:bdelete 与 :bwipeout

来自插件的文档

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