ChatGPT解决这个技术问题 Extra ChatGPT

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

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

vim a/*.php

打开 23 个文件。

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

:q

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

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

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

i
ib.

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

更多来自手册:

:bd

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

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

:bw

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


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

如果前面的答案不明显:

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


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

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

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

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

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

:2bw

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

:1,3bw

您还可以使用 :%bw 擦除所有缓冲区
检查缓冲区 id 的快捷方式:2 CTRL-G
g
guv'

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


k
kenorb

利用:

:ls - 列出缓冲区

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

例子:

删除缓冲区 2: :bd2


Y
Yi Jiang

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

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

来自我的 vimrc


W
Wolfson

关闭缓冲区而不关闭窗口

如果您想在不破坏窗口布局(当前布局基于拆分)的情况下关闭缓冲区,可以使用 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。 :)
S
Santi

怎么样

vim -O a a

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


L
Leonid Shevtsov

[编辑:这是一个愚蠢的建议,因为我对 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。
N
New Alexandria

那些使用缓冲区或树导航插件(如 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