【问题标题】:Vim close buffer but not split windowVim 关闭缓冲区但不拆分窗口
【发布时间】:2011-05-16 23:34:09
【问题描述】:

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

如果我按下 :bd ,关闭缓冲区的窗口也会关闭。

【问题讨论】:

标签: vim buffer


【解决方案1】:

像@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 -- 指示),视觉等。 nmap 中的 n 指定仅添加到正常模式的键映射。查找更多关于映射here

重要提示:

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

补充说明:

  • :windo b# 会将所有窗口切换到之前打开的缓冲区。不确定如何与bd 结合使用。
  • <CR> 可以省略,在这种情况下您必须手动按ReturnEnter 来执行。
  • :nmap , 显示所有以, 开头的普通模式映射。
  • :ls 列出打开的缓冲区。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不喜欢插件。喜欢在 vim 中找到解决方案。我有一个最少数量的插件,在那里我也找到了我需要的东西:nmap,d:b#bd#
      • Rus,我相信您应该已经回答了自己的帖子,然后将其选为正确的。 不管怎样,你的命令 :b#bd# 也正是我想要的。感谢发帖!
      • @DmytriiNagirniak 被用作“输入”管道字符的一种方式 |在你的 .vimrc 中。管道字符可以让您在一行中执行两个命令:stackoverflow.com/a/3249303/61109
      • @RusAles 你真的很摇滚。如此简单但如此有效。让我感觉很糟糕,我自己没有想出这个! ;) 谢谢。
      【解决方案4】:

      您想删除缓冲区但保留拆分?然后你需要一个新的缓冲区 - :new 会为你做这件事,为一个新的/空文件创建一个缓冲区,但你仍然需要杀死旧的缓冲区/窗口。在 vim 中,窗口是缓冲区上的视口,因此如果您想要一个空窗口,则需要一个空缓冲区。

      【讨论】:

        【解决方案5】:

        这是@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>
        

        【讨论】:

          【解决方案6】:

          @RusAlex 版本 + 如果两次删除缓冲区,最终需要激活当前缓冲区。

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

          【讨论】:

            【解决方案7】:

            这里有一些解决方法:

            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>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-23
              • 2010-12-04
              • 1970-01-01
              • 1970-01-01
              • 2010-10-03
              • 1970-01-01
              相关资源
              最近更新 更多