Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VIM and NERD Tree - closing a buffer properly

Tags:

vim

nerdtree

Does anyone know how to close a buffer in VIM when using NERDTree without messing up all your windows? NERD Tree normally breaks up your display into two vertical windows (the browser on your left, and then your main window on the right). 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?

like image 381
Daniel Avatar asked Dec 08 '09 03:12

Daniel


People also ask

How do I close a buffer in Vim?

Vim has two commands for closing a buffer: :bdelete and :bwipeout . The former removes the file from the buffer list, clears its options, variables and mappings. However, it remains in the jumplist, so Ctrl-o takes you back and reopens the file.

Is NERDTree a buffer?

This is a NERDTree plugin that highlights all visible nodes that are open in Vim. It also maps a key w to close (wipeout) the buffer associated with the current node.

How do I quit NERDTree?

If you want to close NERDTree window make sure you are inside the NERDTree menu. You can switch windows by using ctrl+w then type :q to close NERDTree window so that you will be left with the window for editing your code.


2 Answers

Try this mapping: nnoremap <leader>q :bp<cr>:bd #<cr>

like image 162
Paweł G. Avatar answered Sep 24 '22 05:09

Paweł G.


I don't use NERD Tree, but if I understand correctly, you wish to close a buffer without closing a window. 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> 
like image 24
Rook Avatar answered Sep 26 '22 05:09

Rook