Відповіді:
Я не впевнений, чи існує специфічний для NERDTree спосіб зробити це, але Ви завжди можете налаштувати Vim так, щоб він встановив робочу директорію в каталог поточного файлу :
autocmd BufEnter * lcd %:p:h
Тепер все, що вам потрібно зробити після відкриття файлу в новій вкладці, - :NERDTreeToggle
у самій новій вкладці.
Я використовую таке відображення для перегляду поточного буфера в NERDTree:
map <leader>r :NERDTreeFind<cr>
<leader>
?
киньте знак% в кінці, як начальник
:NERDTree %
у мене це є у моєму .vimrc, він відображає Ctrl+, oщоб перемикати nerdtree у dir поточного буфера:
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 років, тож я маю відчуття, що це щось просте. :)
Я вчора зіткнувся з цим питанням, після декількох годин копання, я подав Запит на виклик на нервову репорту scrooloose, вводячи NERDTreeCWD
команду, яка змінює корінь дерева NERD на поточний робочий каталог (Оновлення 2012-11-12: ОР було об'єднано в головний майстер за течією, він повинен бути придатний для використання в оновленій версії). За допомогою цієї зміни це питання можна просто вирішити за допомогою наступного коду.
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