My setup, for someone who may want to improve NERDTree behavior.
autocmd FileType nerdtree let t:nerdtree_winnr = bufwinnr('%')
autocmd BufWinEnter * call PreventBuffersInNERDTree()
function! PreventBuffersInNERDTree()
if bufname('#') =~ 'NERD_tree' && bufname('%') !~ 'NERD_tree'
\ && exists('t:nerdtree_winnr') && bufwinnr('%') == t:nerdtree_winnr
\ && &buftype == '' && !exists('g:launching_fzf')
let bufnum = bufnr('%')
close
exe 'b ' . bufnum
call ToggleNerdTree()
endif
endfunction
"close" will close origin nerdtree pane, and ToggleNerdTree() will reopen it.
function NotNerdTreePane()
return bufname('%') !~# 'NERD_tree_' && winnr("$") > 1 && strlen(expand('%')) > 0 && &modifiable && exists("g:NERDTree")
endfunction
function ToggleNerdTree()
if g:NERDTree.IsOpen()
:NERDTreeClose
else
:NERDTreeFind
endif
endfunction
autocmd BufEnter * if (NotNerdTreePane() && g:NERDTree.IsOpen()) | NERDTreeFind | wincmd p | endif
autocmd SessionLoadPost * if (NotNerdTreePane() && !g:NERDTree.IsOpen()) | NERDTreeFind | wincmd p | endif
autocmd VimLeave * NERDTreeClose
NotNerdTreePane() will check current pane and when you enter a buf, it will help to find current file to show in nerdtree.