Odpowiedzi:
Nie jestem pewien, czy jest to sposób specyficzny dla NERDTree, ale zawsze możesz skonfigurować Vima, aby ustawił katalog roboczy na katalog bieżącego pliku :
autocmd BufEnter * lcd %:p:h
Teraz wszystko, co musisz zrobić po otwarciu pliku w nowej karcie, znajduje się :NERDTreeTogglew samej nowej karcie.
Korzystam z następującego mapowania, aby wyświetlić bieżący bufor w NERDTree:
map <leader>r :NERDTreeFind<cr>
<leader>?
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>
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:
autocmd BufEnter - działa za każdym razem, gdy skupiasz się na buforze (w tym okno NERDTree)if &modifiable - kiedy klikniesz okno NERDTree, nie rób nic więcej (okna NERDTree nie można modyfikować)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()
isNTFocused()? Czy &modifiableczek nie obejmuje tej skrzynki?
Function name must start with a capital or "s:": rc:isNTOpen()Czy używasz rozszerzeń zakresów wtyczek?
.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. :)
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.
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
Stosuję oba rozwiązania z Zmień bieżący katalog za pomocą NERDTree : użyj, cdaby ustawić katalog roboczy NERDTree na bieżący katalog i Custawić węzeł główny NERDTree na bieżący katalog
Myślę, że ta wtyczka jest tym, czego chcesz https://github.com/jistr/vim-nerdtree-tabs
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
<Leader>f