Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim关闭缓冲区但不拆分窗口_Vim_Buffer - Fatal编程技术网

Vim关闭缓冲区但不拆分窗口

Vim关闭缓冲区但不拆分窗口,vim,buffer,Vim,Buffer,如果我有两个水平/垂直分割的缓冲区,并想关闭其中一个,但我不想关闭窗口。我想保持分割窗口的位置与关闭缓冲区之前相同 如果我按:bd,关闭缓冲区的窗口也会关闭。要删除缓冲区但保留拆分吗?你需要一个新的缓冲区-:new会为你做这件事,为一个新的/空的文件创建一个缓冲区,但是你仍然需要删除旧的缓冲区/窗口。在vim中,窗口是缓冲区上的一个视口,因此如果您想要一个空窗口,您需要一个空缓冲区。我必须检查我的工作计算机,但我认为我用于此的脚本是。在vim中不可能有空窗口,但是您可以在当前窗口中使用:enew

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


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

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

我必须检查我的工作计算机,但我认为我用于此的脚本是。

在vim中不可能有空窗口,但是您可以在当前窗口中使用
:enew

像@RusAlex一样创建一个新的空文件,我不喜欢插件。我还想知道我输入的代码实际上做了什么

nmap,d:b#bd#

简而言之这将向vim的正常模式添加一个按键映射,等待按键序列
,d
。执行此操作时,将切换到以前打开的缓冲区,并尝试删除您切换离开的缓冲区

删除屏幕外缓冲区将保持屏幕分割不变

该命令由三个空格分隔的部分组成:

  • nmap
    -添加/更改正常模式的键映射
  • ,d
    -要响应的按键顺序;首先是
    (逗号),然后是
    d
  • :b#bd#
    -要执行的按键顺序
要执行的命令由五部分组成:

  • -将vim切换到模式命令行
  • b#
    -将窗口切换到以前打开的缓冲区
  • -预期后续命令;表示
    |
    (管道字符);用于链接命令
  • bd#
    -删除以前打开的缓冲区,即刚从
  • -执行命令;表示回车,基本上是键
    return
    Enter
该命令的格式与配置文件中使用的格式相同,如
~/.vimrc
。如果要从vim中添加映射,请预先添加
(冒号)-退出vim时映射将丢失:

:nmap,d:b#bd#

当您打开vim时,它通常处于正常模式,而不是插入模式(在按下
i
后在屏幕底部通过
--insert--
指示)、视觉等。
nmap
中的
n
指定仅添加到正常模式的键映射。查找有关映射的详细信息

重要注意事项:

  • b#
    将切换到当前缓冲区(如果它是唯一已知的缓冲区)
  • b#
    可以切换到隐藏/关闭的缓冲区,例如您刚才按
    ,d
    关闭的缓冲区
  • bd#
    将关闭当前缓冲区,如果它是唯一已知的缓冲区,将释放屏幕上留下的空缓冲区
  • 如果从中切换的缓冲区是隐藏/关闭的缓冲区,
    bd#
    将失败
  • 如果在切换另一个窗口后显示要关闭缓冲区,
    bd#
    仍将取消闪烁
补充说明:

  • :windo b#
    将所有窗口切换到以前打开的缓冲区。不确定如何与
    bd
    组合
  • 可以省略,在这种情况下,您必须手动按
    返回
    输入
    执行
  • :nmap,
    显示所有以
    开头的正常模式映射
  • :ls
    列出打开的缓冲区

    • 以下是一些解决方法:

      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>
      
      函数!CloseSplitOrDeleteBuffer()
      设curNr=winnr()
      设curBuf=bufnr(“%”)
      wincmd w“尝试下一次拆分
      如果winnr()==curNr“没有拆分”
      exe'b删除'
      elseif curBuf!=bufnr(“%”)“存在与另一个缓冲区的拆分
      wincmd W“向后移动”
      exe'b删除'
      否则“存在使用相同缓冲区的拆分”
      wincmd W
      wincmd c
      恩迪夫
      端功能
      nnoremap Q:callclosesplitordeletebuffer()调用
      
      @RusAlex version+如果删除缓冲区两次,最终需要激活当前缓冲区

      nmap ,d :b#<bar>bd#<bar>b<CR>
      
      nmap,d:b#bd#b
      
      以下是@zenbro提供的答案的一个变体,即使您关闭的缓冲区是最后一个,它也会保持所有(拆分)窗口和选项卡打开

      该函数可将指向当前缓冲区(正在关闭)的所有窗口切换到下一个缓冲区(如果当前缓冲区是最后一个缓冲区,则切换到新的缓冲区)

      要绘制地图,请执行以下操作:

      map <silent> <F4> :call CloseBuffer()<cr>
      
      map:callclosebuffer()
      
      不喜欢插件。希望在vim内部找到解决方案。我有一个最少数量的a插件,在那里我也找到了我需要的:nmap,d:b#bd#Rus,我相信你应该回答你自己的帖子,然后选择正确。不管怎样,你的命令:b#bd#也正是我想要的。谢谢你的发帖@DmytriiNagirniak用于在.vimrc中“键入”管道字符。管道角色允许您在一行上执行两个命令:@RusAles.com。这么简单,但这么有效。让我觉得很遗憾我自己没有想到这一点!;)谢谢。可能是第二份
      map <silent> <F4> :call CloseBuffer()<cr>