如何在不关闭窗口的情况下关闭缓冲区?

Mos*_*osh 114 vim

Vim的多层视图(Windows,Buffers和Tabs)让我有些困惑.假设我拆分显示(:sp)然后选择一个不同的缓冲区来显示在每个窗口中.现在我想关闭其中一个缓冲区,但我不希望窗口关闭(关闭后它可以显示列表中的下一个缓冲区或空缓冲区,这没关系).我怎样才能做到这一点?

谢谢.

Jon*_*aun 127

我搞砸了一下,最后提出来:

:bp | sp | bn | bd
Run Code Online (Sandbox Code Playgroud)

这是键映射的复制/粘贴版本:

:bp<bar>sp<bar>bn<bar>bd<CR>
Run Code Online (Sandbox Code Playgroud)

我已经对它进行了一些测试,它在各种条件下都能正常工作.在最后一个缓冲区上使用时,它将为您留下一个新的空白缓冲区.

把这个放在你的.vimrc中:

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>
Run Code Online (Sandbox Code Playgroud)

重新启动Vim,或只是:source ~/.vimrc让更改生效.下次要关闭缓冲区时,只需键入:( \q如果\是您的领导键)

  • 对于初学者,将其放入*.vimrc*:`map <leader> q:bp <bar> sp <bar> bn <bar> bd <CR>`.重新启动VIM,下次要关闭缓冲区时只需键入:`\ q` (15认同)
  • 如果您有一个垂直分割的窗口,这将有意想不到的结果.实际上,除标准之外的任何窗口分割配置(由`sp`创建). (5认同)
  • 我认为放在.vimrc中的内容的片段不应该包括最后的句号.除此之外,太棒了!这应该是公认的答案. (2认同)
  • 这很优雅。正如其他人所说的,如果您主要使用垂直分割,请将`sp`与`vsp`切换。我的.vimrc条目如下所示:`cnoremap bd bp &lt;bar&gt; vsp &lt;bar&gt; bn &lt;bar&gt; bd` (2认同)

val*_*lid 37

我今天搜索了这个并想出了

:b#|bd#

它将当前窗口更改为先前打开的缓冲区,并删除/隐藏刚刚切换的缓冲区.

这需要至少两个已知的缓冲区.

如果另一个窗口但当前显示相同的缓冲区,这仍然会破坏分裂.您可以将所有窗口更改为先前打开的缓冲区

:windo b#

我在回答类似问题的过程中添加了更多关于前命令的详细信息,讨论了它的映射(以及一些陷阱).

  • 您还可以执行 `:bn|bd#` 或 `:bp|bd#` 来分别切换到上一个或下一个打开的缓冲区,而不是最近访问的缓冲区 (b#)。 (4认同)

Bri*_*per 28

Vim wiki上有一个脚本来执行此操作.我不认为有内置可以做你想要的.

VIM-bufkill的最新版本在GitHub上.

  • 很棒的答案,它让我看到了脚本的最终版本:http://www.vim.org/scripts/script.php?script_id = 1147 (4认同)

ggu*_*son 12

nmap <leader>d :bprevious<CR>:bdelete #<CR>
Run Code Online (Sandbox Code Playgroud)

在几个窗口中打开一个缓冲区之前,它应该正常工作.除非你想在那里使用更大的脚本,否则它足够好.

编辑:这就是我现在使用的:

function! BufferDelete()
    if &modified
        echohl ErrorMsg
        echomsg "No write since last change. Not closing buffer."
        echohl NONE
    else
        let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

        if s:total_nr_buffers == 1
            bdelete
            echo "Buffer deleted. Created new buffer."
        else
            bprevious
            bdelete #
            echo "Buffer deleted."
        endif
    endif
endfunction
Run Code Online (Sandbox Code Playgroud)

  • 我尝试过这种方式,但在使用多个拆分窗口时效果不佳。如果有人遇到同样的问题,这是我的解决方案:`nmap &lt;leader&gt;d :ene&lt;CR&gt;:bd #&lt;CR&gt;` (2认同)

Nop*_*ope 7

我想这就是你要找的东西

http://www.vim.org/htmldoc/windows.html#window-moving

试试这个:

查看你的缓冲区ID

:buffers
Run Code Online (Sandbox Code Playgroud)

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

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

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

:2bw
Run Code Online (Sandbox Code Playgroud)

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

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


小智 6

我个人使用的一个简单版本是

:bp|bd#
Run Code Online (Sandbox Code Playgroud)

它转到前一个缓冲区并删除另一个缓冲区(这实际上是我们跳转的原始缓冲区)。这在 99% 的情况下都能满足您的期望,无需任何复杂的脚本。

作为键盘快捷键,我使用以下命令

nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>
Run Code Online (Sandbox Code Playgroud)


Luc*_*fim 5

对于那些使用NERDTree的人。

我使用此插件https://github.com/jistr/vim-nerdtree-tabs修复了此问题,现在我可以关闭唯一的buff / file / tab,而无需关闭窗口。

在安装完上面的插件之后,将以下代码放在我的.vimrc上:

let g:nerdtree_tabs_autoclose=0
Run Code Online (Sandbox Code Playgroud)

上面的变量的描述是:如果其中只有一个窗口并且是NERDTree(默认值为1),则关闭当前选项卡

此处更多信息:https : //github.com/jistr/vim-nerdtree-tabs#configuration