Может ли VIM автоматически закрывать NERDTree при удалении буфера? - PullRequest
0 голосов
/ 07 декабря 2018

Проблема:

  • В VIM откройте NERDTree
  • Выберите файл и откройте его в новом буфере (Enter)
  • Сделайте некоторую работу с буфером и сохраните его
  • Удалите буфер с помощью: bd

Теперь NERDTree занимает все окно - само по себе это не проблема, но ...

  • Перейти к следующему буферу с помощью: bnext
  • Продолжить работу
  • Теперь попробуйте снова открыть NERDTree, нажав Ctrl-N

Вы видите, NERDTree остается «развернутым», и вы должны изменить его размер.

Моя попытка решить эту проблему:

Мой подход заключался в том, что указано в заголовке: закрыть NERDTreeавтоматически при удалении буфера, а затем снова открывать его при вводе другого.

function! g:CloseNERDTree()
  if exists("g:NERDTree") && g:NERDTree.IsOpen()
    NERDTreeClose
  else
    echo "already closed"
  endif
endfunction
autocmd BufDelete * call CloseNERDTree()

function! g:OpenNERDTree()
  if exists("g:NERDTree") && g:NERDTree.IsOpen()
    echo "already open"
  else
    NERDTree
  endif
endfunction
autocmd BufEnter * call OpenNERDTree()

Это приводит к тому, что VIM становится непригодным для использования, и моих знаний VimScript недостаточно, чтобы знать, что происходит.

1 Ответ

0 голосов
/ 11 декабря 2018

Я не могу воспроизвести вашу конкретную проблему (для меня NERDTree всегда открывается на боковой панели), но я думаю (или одна) проблема с вашим подходом связана с событием BufDelete.:help BufDelete имеет следующее предупреждение:

Не переходите на другой буфер, это вызовет проблемы.

Я думаю, что это будетЛучше вызвать на WinEnter и использовать количество видимых окон (winnr('$')) для проверки, как это (не проверено):

function! OnWinEnter()
    if winnr('$') == 1
        if exists("g:NERDTree") && g:NERDTree.IsOpen()
            NERDTreeClose
        endif
    else
        if ! (exists("g:NERDTree") && g:NERDTree.IsOpen())
            NERDTreeOpen
        endif
    endif
endfunction
autocmd WinEnter * call OnWinEnter()
...