51

Когда я открываю новую вкладку с путем, отличным от предыдущего файла в VIM, NERDTree по-прежнему остается той же иерархии каталогов предыдущего файла.

Существует ли ярлык синхронизации для изменения текущего корневого каталога на каталог нового открытого файла?

8 ответов8

106

Я использую следующее отображение для просмотра текущего буфера в NERDTree:

 map <leader>r :NERDTreeFind<cr>
21

Я нашел оба существующих ответа образовательными и успешно скомбинировал оба, так что поведение больше похоже на то, что многие ожидают от IDE: Нажмите на открытое окно / буфер и выделите этот файл в NERDTree. Я поместил это в мой ~ / .vimrc:

autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif

Что это делает:

  1. autocmd BufEnter - запускается каждый раз, когда вы сосредотачиваетесь на буфере (включая окно NERDTree)
  2. if &modifiable - когда вы щелкаете окно NERDTree, больше ничего не делаете (окно NERDTree не модифицируется)
  3. wincmd p - NERDTreeFind оставляет курсор сфокусированным на NERDTree; это переключается обратно на окно, на котором вы изначально сосредоточены

Обратите внимание, что это не будет работать на любом другом буфере, который нельзя изменить, но это, как правило, хорошо; в противном случае (например) в любое время, когда вы получаете :help в vim, NERDTree найдет и сфокусирует каталог, в котором хранятся файлы справки - вероятно, это не то, что вам нужно.

Поначалу это одностроковое решение отлично сработало, но вскоре я обнаружил, что оно вызывает активацию NERDTree каждый раз, когда я открываю файл, и, как следствие, предотвращает закрытие NERDTree! Если вы не хотите использовать NERDTree полный рабочий день, поместите это в ваш .vimrc:

" returns true iff is NERDTree open/active
function! rc:isNTOpen()        
  return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1)
endfunction

" calls NERDTreeFind iff NERDTree is active, current window contains a modifiable file, and we're not in vimdiff
function! rc:syncTree()
  if &modifiable && rc:isNTOpen() && strlen(expand('%')) > 0 && !&diff
    NERDTreeFind
    wincmd p
  endif
endfunction

autocmd BufEnter * call rc:syncTree()
21

бросить знак% на конце, как босс

:NERDTree %

у меня есть это в моем .vimrc, он отображает Ctrl+o для переключения nerdtree в директории текущего буфера:

map <C-o> :NERDTreeToggle %<CR>

10

Я не уверен, есть ли способ сделать это для NERDTree, но вы всегда можете настроить Vim так, чтобы он установил рабочий каталог в каталог текущего файла:

autocmd BufEnter * lcd %:p:h

Теперь все, что вам нужно сделать после открытия файла в новой вкладке, это :NERDTreeToggle в самой новой вкладке.

2

Я столкнулся с этим вопросом вчера, после нескольких часов копания, я отправил Pull Request в репозиторий scrooloose nerdtree, представляя команду NERDTreeCWD которая изменяет корень дерева NERD на текущий рабочий каталог (Обновление 2012-11-12: PR был объединен в вышестоящий мастер, он должен использоваться в обновленной версии). С этим изменением этот вопрос может быть просто решен с помощью следующего кода.

autocmd BufEnter * silent! if bufname('%') !~# 'NERD_tree_' | cd %:p:h | NERDTreeCWD | wincmd p | endif

По сравнению с подходом @ shinzui и @ Lambart NERDTreeFind , это именно то, что задал вопрос. Использование NERDTreeFind изменит положение прокрутки у дерева ботаников, и результат не всегда будет одинаковым (если CWD находится в корне дерева NERD, он просто расширяет узел, вместо этого превращаясь в него).

По сравнению с ответом @Yaser Sulaiman, это решение всегда имеет открытое окно дерева NERD и может легко кодироваться. Если окно дерева NERD уже было открыто, использование NERDTreeToggle нужно будет запустить дважды (сначала закройте существующее, затем откройте его снова), к сожалению, второе открытие пропустит всю обработку cwd.

1

Это ведет себя как :NERDTreeToggle но покажет текущий открытый файл в NERDTree. Если вы еще не открыли файл (то есть, вы только что ввели vim в командной строке), NERDTree показывает /home .

Поместите это в ваш .vimrc:

" Open NERDTree in the directory of the current file (or /home if no file is open)
nmap <silent> <C-i> :call NERDTreeToggleInCurDir()<cr>
function! NERDTreeToggleInCurDir()
  " If NERDTree is open in the current buffer
  if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
    exe ":NERDTreeClose"
  else
    exe ":NERDTreeFind"
  endif
endfunction
1

Я применяю оба решения из Изменить текущий каталог, используя NERDTree: используйте cd чтобы установить рабочий каталог NERDTree в текущий каталог, и C чтобы установить корневой узел NERDTree в текущий каталог.

0

Я думаю, что этот плагин то, что вы хотите https://github.com/jistr/vim-nerdtree-tabs

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .