Автоматически выходить из vim, если NERDTree является последним и единственным буфером

У меня есть следующее в моем.vimrc:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Open NERDTree by default
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
autocmd VimEnter * NERDTree
autocmd VimEnter * wincmd p

Так,

% vim file.txt

открывает NERDTree и фокусирует курсор в буфере file.txt. Я делаю свои правки и нажимаю:q в буфере, и я остаюсь с.,, NERDTree. Это раздражает.

Я мог бы использовать:qa, чтобы закрыть все буферы, и выйти из vim, но я привык к:q trope. Поэтому мне интересно, есть ли способ обнаружить, что единственным оставшимся буфером является NERDTree, и "объединить" два буфера для целей:q

редактировать

Спросите, и вы получите: https://github.com/scrooloose/nerdtree/issues

5 ответов

Решение

Сценарий, чтобы сделать именно это был опубликован в списке проблем NERDTree. Оформить заказ № 21 на GitHub для ботаников.

Это приводит к однострочной команде для вашего vimrc здесь:

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
function! s:CloseIfOnlyControlWinLeft()
  if winnr("$") != 1
    return
  endif
  if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
        \ || &buftype == 'quickfix'
    q
  endif
endfunction
augroup CloseIfOnlyControlWinLeft
  au!
  au BufEnter * call s:CloseIfOnlyControlWinLeft()
augroup END

Из моего vimrc, основанного на версии от репозитория Janus.

Улучшения: также закройте, если осталось только окно быстрого исправления. Он использует BufEnter вместо автокоманды, которая требуется для &bt работать правильно.

Идея нуждается в реализации:

Вы могли бы написать функцию, которая, при вызове, проверяет, является ли единственный оставшийся буфер (или, возможно, единственный буфер без помощи, если вы предпочитаете), буфером NERDTree и, если так, удаляет его (или просто выходит).

Затем пусть autocmd запускает его всякий раз, когда буфер удаляется / скрывается / что бы на самом деле не происходило, когда вы:q (мне стыдно признаться, что я не совсем уверен!).

Мне нравится делать это: cmap bq :bufdo q<CR> закрыть все буферы двумя нажатиями клавиш в командном режиме.

Вы могли бы :cabbrv q qa но я бы посоветовал против этого, потому что вы забудете об этом, когда на самом деле хотите q,

Ответ @MrD хорошо работает для меня, я использую vim 8.1 из brew на macOS.

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif 
Другие вопросы по тегам