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