Vim的多层视图(Windows,Buffers和Tabs)让我有些困惑。假设我拆分显示(:sp)然后选择一个不同的缓冲区来显示在每个窗口中。现在我想关闭其中一个缓冲区,但我不希望窗口关闭(关闭后它可以显示列表中的下一个缓冲区或空缓冲区,这没关系)。我怎么能这样做?
感谢。
答案 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上有一个脚本可以执行此操作。我不认为有内置可以做你想要的。
答案 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)
我认为没有一种方法可以做到这一点,但你可以:enew
或:ls
列出你的缓冲区并使用:b [number]
交换到另一个缓冲区。
在窗口中有一个不同的缓冲区:bd #
将删除窗口中的前一个缓冲区,并且由于当前缓冲区仍然存在,窗口将不会关闭。
答案 7 :(得分:2)
我以前用过:
:bp<bar>sp<bar>bn<bar>bd<CR>
但是我发现它关闭了窗户的某些场合。
最近我注意到我在处理项目时总是使用此功能,需要在返回工作岗位之前快速打开.tmux.conf
.zshrc
。
对于这种用法,我发现更好:
C-6
:bd#
以删除上一个缓冲区(我已将其映射为:nnoremap <leader>d :bd#<CR>
)它允许我控制我要回到的缓冲区并感觉更自然。
答案 8 :(得分:1)
答案 9 :(得分:1)
我个人使用的一个简单版本是
:bp|bd#
它转到上一个缓冲区,并删除另一个缓冲区(实际上是我们从中跳出的原始缓冲区)。 在没有任何复杂脚本的情况下,这可以实现99%的情况。
作为键盘快捷键,我使用以下
nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>
答案 10 :(得分: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
答案 11 :(得分: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).
答案 12 :(得分:1)
将
:enew
做你想做的事?它将在当前窗口中编辑一个新的未命名缓冲区,使现有文件在任何其他窗口中打开。
答案 13 :(得分:0)
关闭&#39;视图,使用:hid[e]
。如果您已设法拆分视口或打开多个文件,则可以正常工作。您无法隐藏显示的最后一个缓冲区。
1帮助我的进一步提示:使用:e ./path/to/file.work
在视口中打开文件而不拆分窗口。
P.S。进入vim两天后,我仍然无法找到精确的帮助命令。希望这有助于其他人继续工作,直到他们真正有时间了解vim。
答案 14 :(得分:0)
如果您和我一样,并且是来这里尝试对面的,请关闭窗口而不关闭缓冲区,您可以通过以下方式进行操作:
:close
答案 15 :(得分: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>
答案 16 :(得分:-5)
使用“:bd”作为命令。