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

29318
Jichao

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

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

50

8 ответов на вопрос

104
shinzui

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

 map <leader>r :NERDTreeFind<cr> 
Я нахожу это очень полезным, и я пошел в мой .vimrc. Я хотел использовать какую-то другую привязку, чтобы мне было легче ее запомнить. И я узнал, что для этого уже есть привязка с NERDTree `f` benzen 9 лет назад 3
Потрясающие! Пример того, что я искал. mawaldne 9 лет назад 1
Вы можете остановиться на этом? jterm 6 лет назад 0
Если вы используете этот удивительный vimrc (не мой), он отображается на: nf: https://github.com/amix/vimrc alpha_989 6 лет назад 0
Какой ключ ``? stillanoob 5 лет назад 0
21
Lambart

I found both the existing answers educational, and successfully combined the two so that the behavior is more like many people would expect from an IDE: Click on an open window/buffer, and have that file highlighted in the NERDTree. I put this in my ~/.vimrc:

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

What this does:

  1. autocmd BufEnter - runs every time you focus on a buffer (including the NERDTree window)
  2. if &modifiable - when you do click the NERDTree window, do nothing else (the NERDTree window is not modifiable)
  3. wincmd p - NERDTreeFind leaves the cursor focused on the NERDTree; this switches back to the window you'd originally focused on

Note that this won't work on any other buffer that isn't modifiable -- but that's generally a good thing; otherwise (for example) any time you got :help in vim, NERDTree would find and focus the directory where help files are stored--probably not something you want it to do.

That one-line solution worked great for me at first, but I soon found that it causes NERDTree to activate any time I opened a file--and as a result, it prevents NERDTree from ever being closed! If you don't want to use NERDTree full-time, put this in your .vimrc instead:

" 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() 
Какова цель `isNTFocused ()`? Не проверяет ли `& modifiable` этот случай? jrdioko 10 лет назад 1
@ jrdioko да, я думаю, что вы правы, это немного избыточно. Я не могу придумать какой-либо веской причины, чтобы иметь это там, а проще всегда лучше. Я отредактирую это, спасибо! Lambart 10 лет назад 0
Я столкнулся с множеством проблем, связанных с невозможностью навигации по окнам из-за `wincmd p` (я буквально не мог вернуться в определенные окна). В итоге я сделал `let l: curwinnr = winnr ()` перед `NERDTreeFind` и` exec l: curwnum. "wincmd w" `после него. Решены все вопросы. Patrick 9 лет назад 0
`Имя функции должно начинаться с заглавной буквы или" s: ": rc: isNTOpen ()` Используете ли вы плагин, расширяющий области действия? Brian Haak 6 лет назад 1
Извините, но я не знаю, @BrianHaak. В настоящее время я не использую NerdTree, и потерял свой старый `.vimrc`, в котором я написал этот код. Я не помню, почему я использовал `rc:`, но я думаю, что это было пространством имен, чтобы избежать конфликтов имен с другими функциями. Насколько я помню, я не использовал плагин, специально связанный с этим. Вы должны будете изучить документы или просто попытаться опустить их и посмотреть, не сломается ли что-нибудь. Но я думаю, что одно из имен функций конфликтовало с чем-то в NerdTree или где-либо еще. Больше 5 лет никто не спрашивал, поэтому у меня такое ощущение, что это что-то простое. :) Lambart 6 лет назад 1
@Lambart Я просто заменил его на `s:` Brian Haak 6 лет назад 0
@BrianHaak супер. Я надеюсь, что это работает для вас! Lambart 6 лет назад 0
@Lambart Я создал полезную конфигурацию со всеми решенными проблемами: https://gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7 Brian Haak 6 лет назад 3
Здорово. В течение многих лет я собирался использовать мои различные файлы .rc. Когда-нибудь ... Lambart 6 лет назад 1
20
schpet

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

:NERDTree %

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

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

Вы знаете, я был настроен скептически. Что-то, как ты это сказал: D. Но это единственное, что сработало так, как мне было нужно, молодец. Hugo 10 лет назад 2
Такой босс ответ! ecbrodie 7 лет назад 0
большой босс, такой ответ mhz 6 лет назад 1
10
Yaser Sulaiman

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

autocmd BufEnter * lcd %:p:h 

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

2
weynhamz

Я столкнулся с этим вопросом вчера, после нескольких часов копания, я отправил 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 (https://github.com/yegappan/mru/wiki/User-Manual), однако я не знаю почему. Может быть, другие люди могут проверить, есть ли у них похожие проблемы. Мне нравится, что вкладка NERDtree всегда открыта .. alpha_989 6 лет назад 0
Да, это приводит к тому, что NERDTree всегда открыт. Печаль. Meredith 6 лет назад 0
1
Matthias Braun

This behaves like :NERDTreeToggle but will show the currently opened file in NERDTree. If you haven't opened a file yet (i.e., you just entered vim in your commandline) NERDTree shows /home.

Put this in your .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
Casper Gerritsen

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

0
j2fly

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

Добро пожаловать в Супер пользователя! Хотя наличие ссылки приятно, [было бы предпочтительнее] (http://meta.stackexchange.com/q/8259) включить сюда немного контекста и объяснить, что делает плагин, как его использовать и т. Д. . Спасибо! slhck 10 лет назад 2
На самом деле это может быть хорошим решением для того, что спросили .. alpha_989 6 лет назад 0