如何在不closures窗口的情况下closures缓冲区?

Vim的多层视图(Windows,Buffers和Tabs)让我有点困惑。 比方说,我分割显示(:SP),然后select一个不同的缓冲区显示在每个窗口。 现在我想closures其中一个缓冲区,但是我不希望窗口closures(closures之后,它可以显示列表上的下一个缓冲区或一个空的缓冲区,没关系)。 我怎样才能做到这一点?

谢谢。

Vim wiki上有一个脚本可以做到这一点。 我不认为有一个内build的是你想要的。

最新版本的vim-bufkill在github上 。

我搞砸了这一点,终于想出了:

:bp | sp | bn | bd

以下是密钥映射的复制/粘贴版本:

:bp<bar>sp<bar>bn<bar>bd<CR>

我已经testing了一下,它在各种条件下始终如一地工作。 当在最后一个缓冲区上使用时,它会留下一个新的空白缓冲区。

把这个放在你的.vimrc中:

 map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>. 

重新启动Vim,或者只是:source ~/.vimrc以使更改生效。 下一次你想closures一个缓冲区,只需input: \q (如果\是你的领导键)

我今天search了这个,想出来了

:b#|bd#

它将当前窗口改变为先前打开的缓冲区,并删除/隐藏刚切换的缓冲区。

这需要至less两个已知的缓冲区。

如果另一个窗口,但当前显示相同的缓冲区,这仍然会破坏拆分。 您可以将所有窗口更改为先前打开的缓冲区

:windo b#

我在前面的命令中增加了更多的细节,在回答类似的问题时讨论它的映射(以及一些陷阱)。

 nmap <leader>d :bprevious<CR>:bdelete #<CR> 

按照原样工作,直到在多个窗口中打开一个缓冲区。 除非你想使用更大的脚本,否则就足够好了。

编辑:这是我现在使用的:

 function! BufferDelete() if &modified echohl ErrorMsg echomsg "No write since last change. Not closing buffer." echohl NONE else let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) if s:total_nr_buffers == 1 bdelete echo "Buffer deleted. Created new buffer." else bprevious bdelete # echo "Buffer deleted." endif endif endfunction 

我想这是你要找的

http://www.vim.org/htmldoc/windows.html#window-moving

尝试这个:

看看你的缓冲区ID使用

 :buffers 

你会看到像这样的缓冲区列表

 1 a.cpp 2 b.py 3 c.php 

如果你想从缓冲区中删除b.py

 :2bw 

如果你想删除/closures所有的缓冲区

 :1,3bw 

对于那些使用NERDTree的人。

我使用这个插件修复了这个问题https://github.com/jistr/vim-nerdtree-tabs现在我可以在不closures窗口的情况下closures唯一的buff / file / tab。

安装上面的插件后,将下面的代码放在我的.vimrc文件中:

 let g:nerdtree_tabs_autoclose=0 

上面的variables的描述是:closures当前选项卡,如果只有一个窗口,它是NERDTree(默认1)

更多信息在这里: https : //github.com/jistr/vim-nerdtree-tabs#configuration

我不认为有一个单一的方法来做到这一点,但你可以这样做:enew:ls列出你的缓冲区,并使用:b [number]来交换不同的缓冲区。

一旦在窗口中有不同的缓冲区:bd #将删除窗口中的前一个缓冲区,并且由于当前的缓冲区仍然存在,窗口将不会closures。

 :enew 

做你想做的? 它将在当前窗口中编辑一个新的未命名的缓冲区,使现有文件在任何其他窗口中打开。

我最喜欢的解决scheme是bufkill.vim插件( GitHub )。 它提供了各种不同版本的:b -prefix命令,它们与对应的命令相同,但是保持窗口打开状态。 它们显示包含的最后一个可见缓冲区,或者如果没有先前的缓冲区,则显示一个空的/新的缓冲区。

从文档:

 当你想卸载/删除/擦除一个缓冲区,使用:
   :bun /:bd /:bwclosures窗口(vim命令),或者
   :BUN /:BD /:BW离开窗口(s)完好(此脚本)。 

我曾经使用:

 :bp<bar>sp<bar>bn<bar>bd<CR> 

但是我发现在某些场合我的窗户closures了。

最近我注意到,当我在一个项目上工作时,我总是使用它,并且在返回工作之前需要快速打开我的.tmux.conf

对于这个用法,我觉得更好:

  • 切换回我之前用C-6工作的缓冲区
  • 键入:bd#删除以前的缓冲区(我已经这样映射: nnoremap <leader>d :bd#<CR>

它允许我控制我要回来的缓冲区,感觉更自然。

这是一个非常可读的vimscript函数,可以很好地处理所有的情况

  • performance类似于内置的:bd (如果只有一个窗口,就调用它!),
    • 发出警告,如果缓冲区被修改,则不做任何事情。
    • 如果没有其他缓冲区,通过:enew创build一个。
    • 如果备用缓冲区存在,并在buffer-list ,切换到它,否则去下一个,通过:bn
  • 更合理的多窗口布局行为
    • 不closures任何窗口,
    • 始终保持原来的窗口。
    • 对于每个显示当前缓冲区的窗口,按照上面列出的操作,然后删除旧的当前缓冲区。
 nnoremap <Leader> b:调用DeleteCurBufferNotCloseWindow()<CR>

 FUNC!  DeleteCurBufferNotCloseWindow()中止
    如果修改
         echohl ErrorMsg
         echom“E89:自上次更改以来没有写入”
         echohl无
     elseif winnr('$')== 1
         BD
    其他“多个窗口
        让oldbuf = bufnr('%')
        让oldwin = winnr()
        而1“显示oldbuf的所有窗口将保持打开状态
            如果buflisted(bufnr('#'))
                 b#
            其他
                 BN
                让curbuf = bufnr('%')
                如果curbuf == oldbuf
                     enew“oldbuf是唯一的缓冲区,创build一个
                万一
            万一
            让win = bufwinnr(oldbuf)
            如果赢得== -1
                打破
            否则“还有其他窗口显示oldbuf
                 exec win'wincmd w'
            万一
         ENDWHILE
         “删除oldbuf并恢复到oldwin的窗口
         exec oldbuf'bd'
         exec oldwin'wincmd w'
    万一
 ENDFUNC

要“closures”视图,请使用:hid[e] 。 如果您设法分割视口或打开多个文件,则工作。 您不能隐藏显示的最后一个缓冲区。

1帮助我的其他技巧:使用:e ./path/to/file.work在视口中打开一个文件而不分割窗口。

PS在vim的两天,我仍然无法find精确的帮助命令。 希望这会帮助别人继续工作,直到他们真的有时间了解vim。

使用“:bd”作为命令。