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

时间:2009-09-18 12:41:30

标签: vim

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

感谢。

16 个答案:

答案 0 :(得分:118)

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

:bp | sp | bn | bd

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

:bp<bar>sp<bar>bn<bar>bd<CR>

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

将此内容放入.vimrc:

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>

重新启动Vim,或仅:source ~/.vimrc重置更改才能生效。下次要关闭缓冲区时,只需输入:\q(如果\是您的领导者密钥)

答案 1 :(得分:34)

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

:b#|bd#

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

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

如果另一个窗口但当前显示相同的缓冲区,则仍然会破坏分割。您可以使用

将所有窗口更改为先前打开的缓冲区

:windo b#

我在answer to a similar question中添加了关于前一个命令讨论它的映射(以及一些陷阱)的更多细节。

答案 2 :(得分:27)

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

latest version of vim-bufkill is on github

答案 3 :(得分:12)

nmap <leader>d :bprevious<CR>:bdelete #<CR>

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

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

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

答案 4 :(得分:6)

我认为这就是你要找的东西

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

试试这个:

使用

查看您的缓冲区ID
:buffers

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

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

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

:2bw

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

:1,3bw

答案 5 :(得分:4)

对于那些使用NERDTree的人。

我使用此插件https://github.com/jistr/vim-nerdtree-tabs解决了这个问题,现在我可以在不关闭窗口的情况下关闭唯一的buff /文件/选项卡。

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

let g:nerdtree_tabs_autoclose=0

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

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

答案 6 :(得分:2)

我以前用过:

:bp<bar>sp<bar>bn<bar>bd<CR>

但是我发现它关闭了窗户的某些场合。

最近我注意到我在处理项目时总是使用此功能,需要在返回工作岗位之前快速打开.tmux.conf .zshrc

对于这种用法,我发现更好:

  • 切换回我之前使用C-6
  • 处理的缓冲区
  • 键入:bd#以删除上一个缓冲区(我已将其映射为:nnoremap <leader>d :bd#<CR>

它允许我控制我要回到的缓冲区并感觉更自然。

答案 7 :(得分:2)

我认为没有一种方法可以做到这一点,但你可以:enew:ls列出你的缓冲区并使用:b [number]交换到另一个缓冲区。

在窗口中有一个不同的缓冲区:bd #将删除窗口中的前一个缓冲区,并且由于当前缓冲区仍然存在,窗口将不会关闭。

答案 8 :(得分:1)

我最喜欢的解决方案是bufkill.vim插件(GitHub)。它提供了各种:b - 前缀命令的备用版本,它们与对应命令的工作方式相同,但保持窗口打开。它们显示包含的最后一个可见缓冲区,如果没有先前的缓冲区,则显示空/新缓冲区。

来自文档:

When you want to unload/delete/wipe a buffer, use:
  :bun/:bd/:bw to close the window as well (vim command), or
  :BUN/:BD/:BW to leave the window(s) intact (this script).

答案 9 :(得分:1)

这是一个非常易读的vimscript函数,可以很好地处理所有情况

  • 表现类似于内置:bd(如果只有一个窗口,只需调用它!),
    • 发出警告,如果缓冲区已修改则不执行任何操作。
    • 如果没有其他缓冲区,请通过:enew创建一个。
    • 如果存在备用缓冲区并且在buffer-list中,请切换到它,否则请转到:bn
  • 多窗口布局的更合理的行为
    • 没有关闭任何窗口,
    • 始终留在原始窗口。
    • 对于显示当前缓冲区的每个窗口,执行上面列出的操作,然后删除旧的当前缓冲区。
nnoremap <Leader>b :call DeleteCurBufferNotCloseWindow()<CR>

func! DeleteCurBufferNotCloseWindow() abort
    if &modified
        echohl ErrorMsg
        echom "E89: no write since last change"
        echohl None
    elseif winnr('$') == 1
        bd
    else  " multiple window
        let oldbuf = bufnr('%')
        let oldwin = winnr()
        while 1   " all windows that display oldbuf will remain open
            if buflisted(bufnr('#'))
                b#
            else
                bn
                let curbuf = bufnr('%')
                if curbuf == oldbuf
                    enew    " oldbuf is the only buffer, create one
                endif
            endif
            let win = bufwinnr(oldbuf)
            if win == -1
                break
            else        " there are other window that display oldbuf
                exec win 'wincmd w'
            endif
        endwhile
        " delete oldbuf and restore window to oldwin
        exec oldbuf 'bd'
        exec oldwin 'wincmd w'
    endif
endfunc

答案 10 :(得分:1)

:enew

做你想做的事?它将在当前窗口中编辑一个新的未命名缓冲区,使现有文件在任何其他窗口中打开。

答案 11 :(得分:1)

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

:bp|bd#

它转到上一个缓冲区,并删除另一个缓冲区(实际上是我们从中跳出的原始缓冲区)。 在没有任何复杂脚本的情况下,这可以实现99%的情况。

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

nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>

答案 12 :(得分:0)

只需执行:new|bd#或将其粘贴到您的vimrc

let mapleader = " "
" CLOSE current Buffer without closing window
nnoremap <silent><leader>d :new<BAR>bd#<CR>
" CLOSE current window
noremap <leader>x <c-w>c

然后按(空格+ d)或(空格+ x)

编辑:效果更好

nnoremap <silent><leader>d :new<BAR>bd#<BAR>bp<CR>

答案 13 :(得分:0)

如果您和我一样,并且是来这里尝试对面的,请关闭窗口而不关闭缓冲区,您可以通过以下方式进行操作:

:close

答案 14 :(得分:0)

关闭&#39;视图,使用:hid[e]。如果您已设法拆分视口或打开多个文件,则可以正常工作。您无法隐藏显示的最后一个缓冲区。

1帮助我的进一步提示:使用:e ./path/to/file.work在视口中打开文件而不拆分窗口。

P.S。进入vim两天后,我仍然无法找到精确的帮助命令。希望这有助于其他人继续工作,直到他们真正有时间了解vim。

答案 15 :(得分:-5)

使用“:bd”作为命令。