2009-12-08 5 views
27

Est-ce que quelqu'un sait comment fermer un tampon dans VIM en utilisant NERDTree sans gâcher toutes vos fenêtres? L'arbre NERD découpe normalement votre affichage en deux fenêtres verticales (le navigateur sur votre gauche, puis votre fenêtre principale sur la droite). Si vous fermez un tampon, vous êtes réduit à une fenêtre de navigation de fichiers géants. Si vous sélectionnez un autre fichier, il ouvre une deuxième fenêtre mais en le séparant horizontalement. Des idées?Arbre VIM et NERD - fermer un tampon correctement

Répondre

12

Je n'utilise pas l'arbre NERD, mais si je comprends bien, vous voulez fermer un tampon sans fermer une fenêtre. Si mon raisonnement est correct, essayez ce 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> 
+0

impressionnant ... c'est exactement ce que je cherchais –

+0

thakns, fonctionne très bien - et utile non seulement pour NERDTree! – nihique

5

:bd fonctionne pour moi à 7.3 et NERDTree Vim 4.1.0.

+0

Ouais, juste mis à jour MacVim à 7.3, maintenant ça marche aussi pour moi. – mxgrn

+2

Hm, je suis sur Vim 7.3 et NERDTree 4.1 sur Ubuntu 12.04 et j'ai encore le problème de l'OP. – Milimetric

+0

Ne fonctionne pas pour moi sur Vim 7.4, NERDTree 4.2.0 sur une machine Windows 7. – Juan

8

Le plug-in bufkill semble également résoudre ce problème.

22

Essayez cette application: nnoremap <leader>q :bp<cr>:bd #<cr>

+0

Fonctionne très bien et si simple :) – newUserNameHere

+0

Absolument magnifique solution. C'était sur le bout de ma langue. – cbartondock

Questions connexes