简体   繁体   English

VIM 和 NERD 树 - 正确关闭缓冲区

[英]VIM and NERD Tree - closing a buffer properly

Does anyone know how to close a buffer in VIM when using NERDTree without messing up all your windows?有谁知道如何在使用 NERDTree 时关闭 VIM 中的缓冲区而不会弄乱所有窗口? NERD Tree normally breaks up your display into two vertical windows (the browser on your left, and then your main window on the right). NERD Tree 通常将您的显示分成两个垂直窗口(左侧是浏览器,右侧是主窗口)。 If you close a buffer, then you are reduced to one giant file browsing window.如果您关闭一个缓冲区,那么您将减少到一个巨大的文件浏览窗口。 If you select another file, then it opens up a second window but separating it horizontally.如果您选择另一个文件,则它会打开第二个窗口,但将其水平分隔。 Any ideas?有任何想法吗?

试试这个映射: nnoremap <leader>q :bp<cr>:bd #<cr>

I don't use NERD Tree, but if I understand correctly, you wish to close a buffer without closing a window. 我不使用NERD树,但如果我理解正确,你希望在不关闭窗口的情况下关闭缓冲区。 If my reasoning is correct, try this script. 如果我的推理是正确的,请尝试此脚本。

" Delete buffer while keeping window layout (don't close buffer's windows).
" Version 2008-11-18 from http://vim.wikia.com/wiki/VimTip165
if v:version < 700 || exists('loaded_bclose') || &cp
finish
endif
let loaded_bclose = 1
if !exists('bclose_multiple')
let bclose_multiple = 1
endif

" Display an error message.
function! s:Warn(msg)
echohl ErrorMsg
echomsg a:msg
echohl NONE
endfunction

" Command ':Bclose' executes ':bd' to delete buffer in current window.
" The window will show the alternate buffer (Ctrl-^) if it exists,
" or the previous buffer (:bp), or a blank buffer if no previous.
" Command ':Bclose!' is the same, but executes ':bd!' (discard changes).
" An optional argument can specify which buffer to close (name or number).
function! s:Bclose(bang, buffer)
if empty(a:buffer)
let btarget = bufnr('%')
elseif a:buffer =~ '^\d\+$'
let btarget = bufnr(str2nr(a:buffer))
else
let btarget = bufnr(a:buffer)
endif
if btarget < 0
call s:Warn('No matching buffer for '.a:buffer)
return
endif
if empty(a:bang) && getbufvar(btarget, '&modified')
call s:Warn('No write since last change for buffer '.btarget.' (use :Bclose!)')
return
endif
" Numbers of windows that view target buffer which we will delete.
let wnums = filter(range(1, winnr('$')), 'winbufnr(v:val) == btarget')
if !g:bclose_multiple && len(wnums) > 1
call s:Warn('Buffer is in multiple windows (use ":let bclose_multiple=1")')
return
endif
let wcurrent = winnr()
for w in wnums
execute w.'wincmd w'
let prevbuf = bufnr('#')
if prevbuf > 0 && buflisted(prevbuf) && prevbuf != w
buffer #
else
bprevious
endif
if btarget == bufnr('%')
" Numbers of listed buffers which are not the target to be deleted.
let blisted = filter(range(1, bufnr('$')), 'buflisted(v:val) && v:val != btarget')
" Listed, not target, and not displayed.
let bhidden = filter(copy(blisted), 'bufwinnr(v:val) < 0')
" Take the first buffer, if any (could be more intelligent).
let bjump = (bhidden + blisted + [-1])[0]
if bjump > 0
execute 'buffer '.bjump
else
execute 'enew'.a:bang
endif
endif
endfor
execute 'bdelete'.a:bang.' '.btarget
execute wcurrent.'wincmd w'
endfunction
command! -bang -complete=buffer -nargs=? Bclose call <SID>Bclose('<bang>', '<args>')
nnoremap <silent> <Leader>bd :Bclose<CR>
nnoremap <silent> <Leader>bD :Bclose!<CR>

bufkill插件似乎也解决了这个问题。

:bd在Vim 7.3和NERDTree 4.1.0中为我工作。

我有同样的问题, bufdelete插件解决了这个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM