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


445

我通过运行以下命令在Vim中打开了几个文件:

vim a/*.php

打开23个文件。

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

:q

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

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


8
请注意,您可以使用vim -o a/*.php(或-O使用垂直窗口)在单独的Vim窗口中打开文件,并避免缓冲区导航-这是仅用于少数几个文件的好方法,但是对于23个文件,它们将只有几行/列每。
卡斯卡贝尔

1
@Jefromi:谢谢你指出这一点!我以前从未使用过-o选项。
莱奥波德·赫兹(LéoLéopoldHertz),2009年

关于窗口分割的主题。如果您已经在Vim中,并且想在split:esp中打开另一个文件,则水平:evsp打开垂直文件。
Lanzafame 2014年

Answers:


557

请注意:“ bw中的w并不代表写,而是代表消失!”

手册中的更多内容:

:bd

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

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

:体重

与|:bdelete |类似,但实际上是删除缓冲区。


4
也可以执行':M,Nbd'将缓冲区号M封闭为N。或':bd N1 N2 ...',其中N#是缓冲区号
2014年

61
该手册说仅:bw在“您知道自己在做什么”时使用,而我不知道,所以我猜我会使用:bd
jberryman 2014年

1
起初我对此感到困惑-我正在打开一个新的选项卡以关闭缓冲区...但是关闭选项卡中的缓冲区(使用直线:bd)也会关闭该选项卡。您可能想要的是:bd n .. [m]:n,mbd要关闭特定数字或特定数字范围,而无需查看缓冲区即可完成
JonnyRaa 2015年

5
wwrite根据Vim手册,它是命令的缩写,此外,也没有提及任何“清除”。命令(help write)的描述以“将整个缓冲区写入当前文件”开头。
2013年

3
@amn我也很困惑,但是他的意思wbw命令中的意味着他并不是在谈论w命令。他在此处发出此警告,使人们不认为该bw命令意味着缓冲区写入(这并不意味着缓冲区擦除)。–
John,

350

如果前面的答案没有使这变得显而易见:

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


4
在找到:bd之前,人们对:ls->扫描文档号->按编号卸载缓冲区没有问题,这对我来说从来没有任何意义。人们真的觉得这有效吗?
Svend

3
@svend可以确保一定范围的缓冲区,但是对于一个单独的缓冲区,:bd可能更有效。
法老


10
:bd只关闭缓冲区(而这意味着),而:bw同时也将清除所有变量,并从ls缓冲区中真正消除它。
RedX

1

103

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

您将看到类似的缓冲区列表

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

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

:2bw

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

:1,3bw

4
您也可以使用:%bw擦除所有缓冲区
cdleonard 2011年

7
检查缓冲区ID的快捷方式:2 CTRL-G
2014年

43

我发现使用文件名通常更有效,而不是浏览: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命令查找其编号。


40

采用:

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

例子:

  • 删除缓冲区2:

    :bd2
    

16

您也可以将下一个和上一个映射到功能键,轻松地通过缓冲区循环

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

从我的vimrc


2

怎么样

vim -O a a

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


2

[编辑:这是从我不太了解Vim以来的愚蠢建议。请不要使用制表符代替缓冲区;标签是Vim的“窗口布局”]

也许切换到使用标签页?

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

gtgT开关选项卡来回

:q 仅关闭当前标签

:qa 关闭所有内容并退出

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


2
为什么说使用制表符是一个愚蠢的建议?我之所以只问是因为我一直都在使用制表符...:^ /
Nate 2012年

2
@Nate:我决定详细介绍一下leonid.shevtsov.me/en/…–
Leonid Shevtsov

1
那是一个很棒的帖子-它激发了我进行更深入的研究-您是否看过wildmenu?它类似于lustyjuggler(虽然更简单),但是它是内置的(这对我很有用,因为lustyjuggler需要+ruby,并且是Ubuntu 惯性船的默认vim -ruby)。
Nate 2012年

@Nate:是的,我正在使用wildmenu打开文件,但是当您在项目中有很多文件时,它将无法缩放。另外,vim-nox来自Ubuntu 的软件包具有Ruby支持。
Leonid Shevtsov 2012年

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。您可以修改此功能以与您自己的配置集成。


为此,bbye插件非常完美,可以在使用:bdelete或时保留窗口布局:bwipeout。看我的回答
沃尔夫森

0

关闭缓冲区而不关闭窗口

如果要关闭缓冲区而不破坏窗口布局(基于拆分的当前布局),则可以使用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地方使用或Bbye的等效物:bdelete

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.