Vim的多层视图(Windows,Buffers和Tabs)使我有些困惑。假设我分割显示(:sp),然后选择一个不同的缓冲区在每个窗口中显示。现在,我想关闭其中一个缓冲区,但我不想关闭窗口(关闭后,它可以在列表上显示下一个缓冲区或为空缓冲区,这没有关系)。我怎样才能做到这一点?
谢谢。
DeleteCurBufferNotCloseWindow()很好的方法,并且可读性强。(免责声明:我的回答)
                Vim的多层视图(Windows,Buffers和Tabs)使我有些困惑。假设我分割显示(:sp),然后选择一个不同的缓冲区在每个窗口中显示。现在,我想关闭其中一个缓冲区,但我不想关闭窗口(关闭后,它可以在列表上显示下一个缓冲区或为空缓冲区,这没有关系)。我怎样才能做到这一点?
谢谢。
DeleteCurBufferNotCloseWindow()很好的方法,并且可读性强。(免责声明:我的回答)
                Answers:
Vim Wiki上有一个脚本可以做到这一点。我认为没有内置的功能可以满足您的需求。
我对此有些混乱,最后想到了:
: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如果\您的前导键是)
map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>。重新启动VIM,下次您要关闭缓冲区时,只需键入:\q
                    sp)以外的任何窗口拆分配置。
                    sp用vsp。我的.vimrc条目如下所示:cnoremap bd bp<bar>vsp<bar>bn<bar>bd
                    我今天搜索了这个,然后想到了
:b#|bd#
它将当前窗口更改为先前打开的缓冲区,并删除/隐藏刚从其移开的缓冲区。
这需要至少两个已知的缓冲区。
如果另一个窗口但当前窗口显示相同的缓冲区,则仍会破坏拆分。您可以使用以下命令将所有窗口更改为以前打开的缓冲区
:windo b#
:#b|#bd只是在上面交换缓冲区命令和缓冲区编号。
                    :bn|bd#或:bp|bd#切换到上一个或下一个打开的缓冲区,而不是最近访问的缓冲区(b#)。
                    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
nmap <leader>d :ene<CR>:bd #<CR>
                    我想这就是你要找的
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
对于那些使用NERDTree的人。
我使用此插件https://github.com/jistr/vim-nerdtree-tabs修复了该问题,现在我可以关闭唯一的buff / file / tab,而无需关闭窗口。
安装完上述插件后,将以下代码放在我的.vimrc上:
let g:nerdtree_tabs_autoclose=0
上面的变量的描述是:如果其中只有一个窗口并且是NERDTree(默认值为1),则关闭当前选项卡
此处更多信息:https : //github.com/jistr/vim-nerdtree-tabs#configuration
我不认为有一个简单的方法可以做到这一点,但是您可以这样做:enew或:ls列出缓冲区并使用交换到另一个缓冲区:b [number]。
在窗口中找到其他缓冲区后,:bd #将删除该窗口中的先前缓冲区,并且由于当前缓冲区仍然存在,因此不会关闭该窗口。
我最喜欢的解决方案是bufkill.vim插件(GitHub)。它提供了各种版本的替代版本:b -prefix命令的命令的功能 -prefix命令相同,但保持窗口打开。它们显示最后包含的可见缓冲区,如果没有先前的缓冲区,则显示空白/新缓冲区。
从文档中:
当您要卸载/删除/擦除缓冲区时,请使用: :bun /:bd /:bw也可以关闭窗口(vim命令),或者 :BUN /:BD /:BW保持窗口不变(此脚本)。
这是一个非常易读的vimscript函数,可以很好地处理所有情况,
:bd(如果只有一个窗口,只需调用它!),
:enew。buffer-list,则切换到该缓冲区,否则,通过继续:bn。nnoremap <Leader> b:调用DeleteCurBufferNotCloseWindow()<CR>
功能!DeleteCurBufferNotCloseWindow()中止
    如果并修改
        echohl ErrorMsg
        echom“ E89:自上次更改以来没有写入”
        echohl无
    elseif winnr('$')== 1
        d
    其他“多窗口
        让oldbuf = bufnr('%')
        让oldwin = winnr()
        而1英寸所有显示oldbuf的窗口将保持打开状态
            如果buflisted(bufnr('#'))
                b#
            其他
                n
                让curbuf = bufnr('%')
                如果curbuf == oldbuf
                    enew” oldbuf是唯一的缓冲区,创建一个
                万一
            万一
            让胜利= bufwinnr(oldbuf)
            如果获胜== -1
                打破
            否则,还有其他显示oldbuf的窗口
                exec win'wincmd w'
            万一
        最后
        删除oldbuf并将窗口还原到oldwin
        exec oldbuf'bd'
        exec oldwin'wincmd w'
    万一
endfunc