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?

Odpowiedzi:



116

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

 map <leader>r :NERDTreeFind<cr>

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>


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()

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.


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



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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.