【发布时间】:2011-05-16 23:34:09
【问题描述】:
如果我有 2 个水平/垂直拆分的缓冲区并想关闭其中一个,但我不想关闭窗口。我想保持拆分窗口的位置与关闭缓冲区之前相同。
如果我按下 :bd ,关闭缓冲区的窗口也会关闭。
【问题讨论】:
如果我有 2 个水平/垂直拆分的缓冲区并想关闭其中一个,但我不想关闭窗口。我想保持拆分窗口的位置与关闭缓冲区之前相同。
如果我按下 :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 -- 指示),视觉等。 nmap 中的 n 指定仅添加到正常模式的键映射。查找更多关于映射here
重要提示:
b# 将切换到当前缓冲区,如果它是唯一已知的缓冲区。b# 可以切换到隐藏/关闭的缓冲区,例如您刚刚按,d 关闭的那个。bd# 将关闭当前缓冲区,如果它是唯一已知的不分割屏幕的缓冲区,则留下一个空缓冲区。bd# 将失败。bd# 仍将不拆分。补充说明:
:windo b# 会将所有窗口切换到之前打开的缓冲区。不确定如何与bd 结合使用。 <CR> 可以省略,在这种情况下您必须手动按Return 或Enter 来执行。:nmap , 显示所有以, 开头的普通模式映射。:ls 列出打开的缓冲区。【讨论】:
在 vim 中不可能有一个空窗口,但你可以在当前窗口中使用 :enew 创建一个新的空文件。
【讨论】:
我必须检查我的工作计算机,但我认为我使用的脚本是 BufClose。
【讨论】:
您想删除缓冲区但保留拆分?然后你需要一个新的缓冲区 - :new 会为你做这件事,为一个新的/空文件创建一个缓冲区,但你仍然需要杀死旧的缓冲区/窗口。在 vim 中,窗口是缓冲区上的视口,因此如果您想要一个空窗口,则需要一个空缓冲区。
【讨论】:
这是@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>
【讨论】:
@RusAlex 版本 + 如果两次删除缓冲区,最终需要激活当前缓冲区。
nmap ,d :b#<bar>bd#<bar>b<CR>
【讨论】:
这里有一些解决方法:
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>
【讨论】: