Ответы:
Я не уверен, есть ли способ сделать это для NERDTree, но вы всегда можете настроить Vim так, чтобы он установил рабочий каталог в каталог текущего файла :
autocmd BufEnter * lcd %:p:h
Теперь все, что вам нужно сделать после открытия файла в новой вкладке, - :NERDTreeToggle
в самой новой вкладке.
Я использую следующее отображение для просмотра текущего буфера в NERDTree:
map <leader>r :NERDTreeFind<cr>
<leader>
?
бросить знак% на конце, как босс
:NERDTree %
у меня есть это в моем .vimrc, он отображает Ctrl+ oдля переключения nerdtree в директории текущего буфера:
map <C-o> :NERDTreeToggle %<CR>
Я нашел оба существующих ответа образовательными и успешно скомбинировал оба, так что поведение больше похоже на то, что многие ожидают от IDE: Нажмите на открытое окно / буфер и выделите этот файл в NERDTree. Я поместил это в мой ~ / .vimrc:
autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif
Что это делает:
autocmd BufEnter
- запускается каждый раз, когда вы сосредотачиваетесь на буфере (включая окно NERDTree)if &modifiable
- когда вы щелкаете окно NERDTree, больше ничего не делаете (окно NERDTree не может быть изменено)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()
isNTFocused()
? Разве &modifiable
чек не покрывает этот случай?
Function name must start with a capital or "s:": rc:isNTOpen()
Вы используете плагин, расширяющий возможности?
.vimrc
в котором я написал этот код. Я не помню, почему я использовал rc:
, но я думаю, что это было пространством имен, чтобы избежать конфликтов имен с другими функциями. Насколько я помню, я не использовал плагин, специально связанный с этим. Вы должны будете изучить документы или просто попытаться опустить их и посмотреть, не сломается ли что-нибудь. Но я думаю, что одно из имен функций конфликтует с чем-то в NerdTree или где-либо еще. Больше 5 лет никто не спрашивал, поэтому у меня такое ощущение, что это что-то простое. :)
Я столкнулся с этим вопросом вчера, после нескольких часов копания, я отправил 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.
Это ведет себя как, :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
Я применяю оба решения из Изменить текущий каталог с помощью NERDTree : используйте cd
для установки рабочего каталога NERDTree в текущий каталог и C
для установки корневого узла NERDTree в текущий каталог
Я думаю, что этот плагин то, что вы хотите https://github.com/jistr/vim-nerdtree-tabs
Я нашел ответ, который опубликовал Матиас, как отличный ответ с одной проблемой, он не очень хорошо работает в нескольких крайних случаях. Это работает немного лучше с изменением ниже:
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
<Leader>f