2010-11-28 127 views
20

如果我有2个缓冲区水平/垂直分割,并且想关闭其中一个,但我不想关闭一个窗口。我想保留分割窗口的位置与关闭缓冲区之前的位置相同。Vim关闭缓冲区但不分割窗口

如果我按:bd,其中关闭缓冲区的窗口也变为关闭。

+0

[Vim的:删除缓冲器不失分割窗口]的可能重复(HTTP://计算器。com/questions/4465095/vim-delete-buffer-without-losing-split-window) – thirtythreeforty 2015-05-27 18:44:43

回答

24

像@RusAlex我不喜欢插件。我也想知道我输入的代码实际上是做什么的。

nmap ,d :b#<bar>bd#<CR>

总之这增加键映射到Vim的正常模式,等待键序列,d。当执行时,它切换到以前打开的缓冲区并尝试删除您切换的缓冲区。

删除屏幕外的缓冲区会使屏幕保持原样。

该命令由三个空间分离的部分:

  • nmap - 添加/改变键映射模式下的正常
  • ,d - 键序列到反应;第一,(逗号),然后d
  • :b#<bar>bd#<CR> - 键序列执行

的命令要被执行由五个部分组成:

  • : - 切换VIM到模式命令行
  • b# - 切换窗口到以前打开的缓冲区
  • <bar> - 期待后续命令;代表|(管道字符);用于链接命令
  • bd# - 删除以前打开缓冲器,即缓冲器刚从
  • <CR>切换远 - 执行命令(一个或多个);表示回车,基本上键ReturnEnter

的命令是在其在配置文件中使用像~/.vimrc的格式。如果你想从VIM内添加映射你在前面加上:(冒号) - 则映射将丢失退出vim时:

:nmap ,d :b#<bar>bd#<CR>

当您打开VIM它通常是在正常模式下,而不是模式插入(按下i后按-- INSERT --在屏幕底部指示),视觉等。 nnmap中指定仅将密钥映射添加到正常模式。寻找更多的映射here

重要提示:

  • b#将切换到当前的缓冲区,如果它是唯一已知的缓冲区。
  • b#可以切换到隐藏/关闭的缓冲区,例如,您刚刚按,d关闭的那个。
  • bd#将关闭当前缓冲区,如果它是唯一已知的缓冲区未分割屏幕留下一个空的缓冲区。
  • bd#将失败,如果缓冲区切换远离隐藏/封闭的缓冲区。
  • bd#如果在切换另一个窗口后显示缓冲区关闭,仍然不会分离。

其他注意事项:

  • :windo b#将所有窗口切换到先前打开的缓冲区。不知道如何结合bd
  • <CR>可以省略,在这种情况下,您必须手动按ReturnEnter执行。
  • :nmap ,显示从,开始的所有正常模式映射。
  • :ls列出打开的缓冲区。
2

你想删除缓冲区,但保持分裂?你需要一个新的缓冲区,然后 - :new会为你做,为一个新的/空文件创建一个缓冲区,但你仍然需要杀死旧的缓冲区/窗口。在vim中,一个窗口是一个缓冲区上的视口,所以如果你想要一个空的窗口,你需要一个空的缓冲区。

+0

我做了一个很好的选择: – RusAlex 2010-11-30 08:59:42

+0

nmap,d:b# bd# RusAlex 2010-11-30 09:00:15

4

我必须检查我的工作计算机,但我认为我使用的脚本是BufClose

+14

不喜欢插件。喜欢在vim中找到解决方案。我有一个最低数量的插件,还有我发现我需要:nmap,d:b# bd# RusAlex 2010-11-30 09:01:25

9

在vim中不可能有空的窗口,但是您可以使用:enew在当前窗口中创建一个新的空文件。

0

下面是一些解决方法:

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> 
1

@RusAlex版+激活电流缓冲到底需要两次,如果删除缓存。

nmap ,d :b#<bar>bd#<bar>b<CR> 
1

这里有@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>