Vim: Jak zsynchronizować NERDTree z aktualnie otwartą ścieżką do pliku karty?

60

Kiedy otworzę nową kartę z inną ścieżką niż poprzedni plik w VIM, NERDTree pozostanie tą samą hierarchią katalogów co poprzedni plik.

Czy istnieje skrót synchronizacji, aby zmienić bieżący katalog główny na katalog nowego otwartego pliku?

Jichao
źródło

Odpowiedzi:

116

Korzystam z następującego mapowania, aby wyświetlić bieżący bufor w NERDTree:

 map <leader>r :NERDTreeFind<cr>
shinzui
źródło
3
Uważam to za bardzo przydatne i poszedłem do mojego .vimrc. Chciałem użyć innego wiązania, aby ułatwić mi zapamiętanie. I dowiedziałem się, że jest już to związane z NERDTree <Leader>f
benzen
1
Niesamowite! Przykład, czego szukałem.
mawaldne
Czy możesz to rozwinąć?
jterm
Jeśli używasz tego niesamowitego vimrc (nie mojego), jest on mapowany na, nf: github.com/amix/vimrc
alpha_989
Jaki jest klucz <leader>?
stillanoob
29

rzuć znakiem% na końcu jak szef

:NERDTree %

mam to w moim .vimrc, mapuje Ctrl+, oaby przełączyć nerdtree w katalogu bieżącego bufora:

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

schpet
źródło
2
Wiesz, że byłem sceptyczny. Coś w sposób, w jaki to powiedziałeś: D. Ale to jedyna rzecz, która działała tak, jak potrzebowałem, dobra robota.
Hugo
Taka odpowiedź szefa!
ecbrodie
1
dużo szefa, taka odpowiedź
mhz
Jedynym problemem jest to, że gdy zaczynasz od pustego pliku, przełącznik nie działa, ponieważ nie ma katalogu bieżącego bufora.
X.Arthur
25

Znalazłem obie istniejące odpowiedzi edukacyjne i z powodzeniem połączyłem obie tak, że zachowanie jest bardziej takie, jak wiele osób mogłoby oczekiwać od IDE: Kliknij otwarte okno / bufor i podświetl ten plik w drzewie NERDTree. Umieszczam to w moim ~ / .vimrc:

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

Co to robi:

  1. autocmd BufEnter - działa za każdym razem, gdy skupiasz się na buforze (w tym okno NERDTree)
  2. if &modifiable - kiedy klikniesz okno NERDTree, nie rób nic więcej (okna NERDTree nie można modyfikować)
  3. wincmd p- NERDTreeFind pozostawia kursor skupiony na NERDTree; spowoduje to powrót do okna, na którym pierwotnie się skupiłeś

Zauważ, że to nie zadziała na żadnym innym buforze, który nie jest modyfikowalny - ale ogólnie jest to dobra rzecz; w przeciwnym razie (na przykład) za każdym razem, gdy wejdziesz :helpw vima, NERDTree znajdzie i skoncentruje katalog, w którym przechowywane są pliki pomocy - prawdopodobnie nie jest to coś, co chcesz zrobić.

To jedno-liniowe rozwiązanie na początku działało dla mnie świetnie, ale wkrótce odkryłem, że powoduje aktywację NERDTree za każdym razem, gdy otwieram plik - w rezultacie uniemożliwia NERDTree kiedykolwiek zamknięcie! Jeśli nie chcesz korzystać z NERDTree w pełnym wymiarze godzin, umieść to w swoim .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()
Lambart
źródło
1
Jaki jest cel isNTFocused()? Czy &modifiableczek nie obejmuje tej skrzynki?
jrdioko
2
Function name must start with a capital or "s:": rc:isNTOpen()Czy używasz rozszerzeń zakresów wtyczek?
Brian Haak
1
Przepraszam, ale nie wiem, @BrianHaak. Obecnie nie używam NerdTree i zgubiłem mój stary, .vimrcw którym napisałem ten kod. Nie pamiętam, dlaczego użyłem tej opcji rc:, ale myślę, że unikanie konfliktów nazw z innymi funkcjami było kwestią przestrzeni nazw. O ile pamiętam, nie korzystałem z żadnej wtyczki specjalnie z tym związanej. Musisz przestudiować dokumenty lub po prostu spróbować je pominąć i sprawdzić, czy coś się zepsuło. Ale myślę, że jedna z nazw funkcji była w konflikcie z czymś w NerdTree lub gdzie indziej. Nikt inny nie pytał przez prawie 5 lat, więc mam wrażenie, że to coś prostego. :)
Lambart
4
@Lambart Stworzyłem użyteczną konfigurację ze wszystkimi rozwiązanymi problemami: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak
1
Chłodny. Od lat chciałem pobrać różne pliki .rc. Pewnego dnia ...
Lambart
2

Natknąłem się na to pytanie wczoraj, po kilku godzinach kopania, wysłałem żądanie ściągnięcia do repozytorium nerdtro scrooloose, wprowadzając NERDTreeCWDpolecenie zmieniające katalog główny drzewa NERD na bieżący katalog roboczy (Aktualizacja 2012-11-12: PR został włączony do nadrzędny master, powinien być użyteczny w zaktualizowanej wersji). Dzięki tej zmianie to pytanie można po prostu rozwiązać za pomocą następującego kodu.

autocmd BufEnter * silent! if bufname('%') !~# 'NERD_tree_' | cd %:p:h | NERDTreeCWD | wincmd p | endif

W porównaniu z podejściem @ shinzui i @ Lambart NERDTreeFind, robi to dokładnie to, o co pytano. Użycie NERDTreeFindzmieni pozycję przewijania drzewa nerdt, a wynik nie zawsze będzie taki sam (jeśli CWD znajduje się w katalogu głównym drzewa NERD, po prostu rozszerza węzeł, zamiast tego zmieniając się w niego).

W porównaniu z odpowiedzią @Yaser Sulaiman, to rozwiązanie ma zawsze otwarte okno drzewa NERD i można je łatwo kodować. Jeśli okno drzewa NERD zostało już otwarte, użycie NERDTreeTogglebędzie wymagało dwukrotnego uruchomienia (najpierw zamknij istniejące, a następnie otwórz je ponownie), niestety drugie otwarcie pominie całe przetwarzanie cwd.

weynhamz
źródło
Czy twoje rozwiązanie nie powoduje, że NERDTree jest zawsze otwarte? Zauważyłem też, że jeśli użyję wtyczki MRU i spróbuję otworzyć pliki, po użyciu tej zmiany zostaną one otwarte w oknie NERDtree. W obecnej formie ta modyfikacja spowoduje wiele problemów i konfliktów z MRU ( github.com/yegappan/mru/wiki/User-Manual ), jednak nie wiem dlaczego. Może inni ludzie mogą sprawdzić, czy mają podobne problemy. Podoba mi się, że karta NERDtree jest zawsze otwarta ..
alpha_989
Tak, to powoduje, że NERDTree jest zawsze otwarty. Smutek.
Meredith
1

Zachowuje się jak, :NERDTreeToggleale pokaże aktualnie otwarty plik w NERDTree. Jeśli jeszcze nie otworzyłeś pliku (tj. Właśnie wpisałeś vimw linii poleceń) NERDTree pokazuje /home.

Umieść to w swoim .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
Matthias Braun
źródło
0

Myślę, że ta wtyczka jest tym, czego chcesz https://github.com/jistr/vim-nerdtree-tabs

j2fly
źródło
2
Witamy w Super User! Posiadanie linku jest przyjemne, jednak lepiej byłoby tu dołączyć trochę kontekstu i wyjaśnić, co robi wtyczka, jak powinna być używana, itp. Dzięki!
slhck
Właściwie może to być dobre rozwiązanie tego, o co pytano ...
alpha_989
0

Znalazłem odpowiedź opublikowaną przez Matthiasa, która jest świetną odpowiedzią na jeden problem, nie działa dobrze w kilku przypadkowych przypadkach. Działa nieco lepiej z poniższą zmianą:

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
Keith Schaab
źródło