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
Дивовижно! Приклад того, що я шукав.
mawaldne

Чи можете ви детальніше зупинитися на цьому?
jterm

Якщо ви використовуєте цей дивовижний vimrc (не мій), він відображається на nf: github.com/amix/vimrc
alpha_989

Який ключ <leader>?
stillanoob

29

киньте знак% в кінці, як начальник

:NERDTree %

у мене це є у моєму .vimrc, він відображає Ctrl+, oщоб перемикати nerdtree у dir поточного буфера:

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


2
Ви знаєте, що я скептично поставився. Щось так, як ви це сказали: D. Але це єдине, що працювало так, як мені потрібно, добре зроблене.
Гюго

Така відповідь начальника!
ecbrodie

1
багато начальника, така відповідь
mhz

Єдине питання, коли починається з пустого файлу, перемикач не працюватиме, оскільки немає поточного буфера.
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чек не покриває цей випадок?
jrdioko

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
Класно. Я роками маю на увазі, щоб git-ify мій різних .rc файлів.
Якогось

2

Я вчора зіткнувся з цим питанням, після декількох годин копання, я подав Запит на виклик на нервову репорту 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.


Чи не ваше рішення призводить до того, що 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.