如何在不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”作为命令。