Vim: дерево каталогов

Иногда бывает удобно иметь в Vim дерево каталогов как в большинстве IDE. Оно реализовано в отдельном плагине — NERD Tree. При его включении в левой части экрана открывается дополнительное окно (так же, как если была вызвана команда :vsplit) с деревом каталогов, на которую можно переходить с помощью комбинации клавиш Ctrl+W+W, по ней можно перемещаться, открывать каталоги и открывать файлы для просмотра и редактирования

Устанавливать плагины в Vim рекомендуется через специальный плагин — Pathogen. Про установку Pathogen можно прочитать в Readme на его странице на Github. Если Pathogen уже установлен, установить NERD Tree можно, выполнив следующие команды:
cd ~/.vim/bundle
git clone https://github.com/scrooloose/nerdtree.git
После этого можно в открытом Vim NERD Tree всегда можно вызвать или закрыть командой:
:NERDTreeToggle
Если, находясь в NERD Tree, нажать клавишу Enter на каталоге — в NERD Tree откроется его содержимое, на файле — его содержимое откроется в соседнем окне, вместо текущего открытого файла. Можно открывать файлы в новом окне, разделив экран вериткально (аналогично команде :vsplit) — клавишей s, и горизонтально (аналогично команде :split) — клавишей i.
Также можно отредактировать файл .vimrc для более удобной работой с NERDTree: Показать скрытые файлы в NERD Tree:
let NERDTreeShowHidden=1
При открытии файла автоматически открывать NERD Tree и устанавливать курсор на открытом файле:
autocmd VimEnter * NERDTree
autocmd VimEnter * wincmd p
Использовать клавишу F2 для включения и отключения NERD Tree:
map <F2> :NERDTreeToggle<CR>
Закрывать NERD Tree при закрытии последнего файла можно с помощью такого скрипта в .vimrc:
function! NERDTreeQuit()
  redir => buffersoutput
  silent buffers
  redir END
  let pattern = '^\s*\(\d\+\)\(.....\) "\(.*\)"\s\+line \(\d\+\)$'
  let windowfound = 0

  for bline in split(buffersoutput, "\n")
    let m = matchlist(bline, pattern)

    if (len(m) > 0)
      if (m[2] =~ '..a..')
        let windowfound = 1
      endif
    endif
  endfor

  if (!windowfound)
    quitall
  endif
endfunction

autocmd WinEnter * call NERDTreeQuit()

2 комментария :

  1. Для выхода лучше использовать
    autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

    Иначе переключение не работает.

    ОтветитьУдалить
    Ответы
    1. Эта строка еще и как предложенный выше скрипт работает! Закрывает дерево. СПС

      Удалить