如果我有2个缓冲区水平/垂直分割,并且想关闭其中一个,但我不想关闭一个窗口。我想保留分割窗口的位置与关闭缓冲区之前的位置相同。Vim关闭缓冲区但不分割窗口
如果我按:bd,其中关闭缓冲区的窗口也变为关闭。
如果我有2个缓冲区水平/垂直分割,并且想关闭其中一个,但我不想关闭一个窗口。我想保留分割窗口的位置与关闭缓冲区之前的位置相同。Vim关闭缓冲区但不分割窗口
如果我按:bd,其中关闭缓冲区的窗口也变为关闭。
像@RusAlex我不喜欢插件。我也想知道我输入的代码实际上是做什么的。
nmap ,d :b#<bar>bd#<CR>
总之这增加键映射到Vim的正常模式,等待键序列,d
。当执行时,它切换到以前打开的缓冲区并尝试删除您切换的缓冲区。
删除屏幕外的缓冲区会使屏幕保持原样。
该命令由三个空间分离的部分:
nmap
- 添加/改变键映射模式下的正常,d
- 键序列到反应;第一,
(逗号),然后d
:b#<bar>bd#<CR>
- 键序列执行的命令要被执行由五个部分组成:
:
- 切换VIM到模式命令行b#
- 切换窗口到以前打开的缓冲区<bar>
- 期待后续命令;代表|
(管道字符);用于链接命令bd#
- 删除以前打开缓冲器,即缓冲器刚从<CR>
切换远 - 执行命令(一个或多个);表示回车,基本上键Return
或Enter
的命令是在其在配置文件中使用像~/.vimrc
的格式。如果你想从VIM内添加映射你在前面加上:
(冒号) - 则映射将丢失退出vim时:
:nmap ,d :b#<bar>bd#<CR>
当您打开VIM它通常是在正常模式下,而不是模式插入(按下i
后按-- INSERT --
在屏幕底部指示),视觉等。 n
在nmap
中指定仅将密钥映射添加到正常模式。寻找更多的映射here
重要提示:
b#
将切换到当前的缓冲区,如果它是唯一已知的缓冲区。b#
可以切换到隐藏/关闭的缓冲区,例如,您刚刚按,d
关闭的那个。bd#
将关闭当前缓冲区,如果它是唯一已知的缓冲区未分割屏幕留下一个空的缓冲区。bd#
将失败,如果缓冲区切换远离隐藏/封闭的缓冲区。bd#
如果在切换另一个窗口后显示缓冲区关闭,仍然不会分离。其他注意事项:
:windo b#
将所有窗口切换到先前打开的缓冲区。不知道如何结合bd
。<CR>
可以省略,在这种情况下,您必须手动按Return
或Enter
执行。:nmap ,
显示从,
开始的所有正常模式映射。:ls
列出打开的缓冲区。在vim中不可能有空的窗口,但是您可以使用:enew
在当前窗口中创建一个新的空文件。
下面是一些解决方法:
function! CloseSplitOrDeleteBuffer()
let curNr = winnr()
let curBuf = bufnr('%')
wincmd w " try to move on next split
if winnr() == curNr " there is no split"
exe 'bdelete'
elseif curBuf != bufnr('%') " there is split with another buffer
wincmd W " move back"
exe 'bdelete'
else " there is split with same buffer"
wincmd W
wincmd c
endif
endfunction
nnoremap <silent> Q :call CloseSplitOrDeleteBuffer()<CR>
@RusAlex版+激活电流缓冲到底需要两次,如果删除缓存。
nmap ,d :b#<bar>bd#<bar>b<CR>
这里有@zenbro所提供的答案的变化您所有的(分割)的窗口和标签打开,即使你关闭缓存是最后一个。
该函数将指向当前缓冲区(即正在关闭的)的所有窗口切换到下一个缓冲区(如果当前缓冲区是最后一个缓冲区,则会切换到新缓冲区)。
function! CloseBuffer()
let curBuf = bufnr('%')
let curTab = tabpagenr()
exe 'bnext'
" If in last buffer, create empty buffer
if curBuf == bufnr('%')
exe 'enew'
endif
" Loop through tabs
for i in range(tabpagenr('$'))
" Go to tab (is there a way with inactive tabs?)
exe 'tabnext ' . (i + 1)
" Store active window nr to restore later
let curWin = winnr()
" Loop through windows pointing to buffer
let winnr = bufwinnr(curBuf)
while (winnr >= 0)
" Go to window and switch to next buffer
exe winnr . 'wincmd w | bnext'
" Restore active window
exe curWin . 'wincmd w'
let winnr = bufwinnr(curBuf)
endwhile
endfor
" Close buffer, restore active tab
exe 'bd' . curBuf
exe 'tabnext ' . curTab
endfunction
要映射它:
map <silent> <F4> :call CloseBuffer()<cr>
[Vim的:删除缓冲器不失分割窗口]的可能重复(HTTP://计算器。com/questions/4465095/vim-delete-buffer-without-losing-split-window) – thirtythreeforty 2015-05-27 18:44:43