Vim: Как синхронизировать NERDTree с текущим открытым файлом вкладки?


60

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

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

Ответы:


15

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

autocmd BufEnter * lcd %:p:h

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


116

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

 map <leader>r :NERDTreeFind<cr>

3
Я нахожу это очень полезным, и я пошел в мой .vimrc. Я хотел использовать другое связывание, чтобы мне было легче его запомнить. И я узнал, что с NERDTree уже есть привязка для этого <Leader>f
benzen

1
Потрясающие! Пример того, что я искал.
Мавальдне

Вы можете остановиться на этом?
jterm

Если вы используете этот удивительный vimrc (не мой), он отображается на: nf: github.com/amix/vimrc
alpha_989

Какой ключ <leader>?
Stillanoob

30

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

:NERDTree %

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

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


2
Вы знаете, я был настроен скептически. Что-то, как ты это сказал: D. Но это единственное, что сработало так, как мне было нужно, молодец.
Хьюго

Такой босс ответ!
Ecbrodie

1
много босса, такой ответа
мгц

Единственная проблема заключается в том, что при запуске из пустого файла переключатель не будет работать, поскольку в текущем буфере нет директории.
X. Артур

25

Я нашел оба существующих ответа образовательными и успешно скомбинировал оба, так что поведение больше похоже на то, что многие ожидают от 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()

1
Какова цель isNTFocused()? Разве &modifiableчек не покрывает этот случай?
Джридиоко

2
Function name must start with a capital or "s:": rc:isNTOpen()Вы используете плагин, расширяющий возможности?
Брайан Хаак

1
Извините, но я не знаю, @BrianHaak. Я не использую NerdTree в настоящее время, и потерял мой старый, .vimrcв котором я написал этот код. Я не помню, почему я использовал rc:, но я думаю, что это было пространством имен, чтобы избежать конфликтов имен с другими функциями. Насколько я помню, я не использовал плагин, специально связанный с этим. Вы должны будете изучить документы или просто попытаться опустить их и посмотреть, не сломается ли что-нибудь. Но я думаю, что одно из имен функций конфликтует с чем-то в NerdTree или где-либо еще. Больше 5 лет никто не спрашивал, поэтому у меня такое ощущение, что это что-то простое. :)
Ламбарт

4
@Lambart Я создал полезную конфигурацию со всеми решенными проблемами: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Брайан Хаак,

1
Здорово. В течение многих лет я собирался собрать свои различные файлы .rc. Когда-нибудь ...
Ламбарт

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.


Разве ваше решение не приводит к тому, что NERDTree всегда открыт? Также я обнаружил, что если я использую плагин MRU и пытаюсь открыть файлы, он открывает файлы в окне NERDtree после того, как я использую это изменение. В настоящее время эта модификация вызовет много проблем и конфликтов с MRU ( github.com/yegappan/mru/wiki/User-Manual ), однако я не знаю почему. Может быть, другие люди могут проверить, есть ли у них похожие проблемы. Мне нравится, что вкладка NERDtree всегда открыта ..
alpha_989

Да, это приводит к тому, что NERDTree всегда открыт. Печаль.
Мередит

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


0

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


2
Добро пожаловать в Супер пользователя! Несмотря на то, что ссылка полезна, было бы желательно включить здесь немного контекста и объяснить, что делает плагин, как его использовать и т. Д. Спасибо!
Slhck

На самом деле это может быть хорошим решением для того, что спросили ..
alpha_989

0

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

function! NERDTreeToggleInCurDir()
  " If NERDTree is open in the current buffer
  if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
    exe ":NERDTreeClose"
  elseif bufname('%')
    exe ":NERDTreeFind"
  else
    exe ":NERDTreeCWD"
  endif
endfunction
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.