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ę :NERDTreeToggle
w 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 :help
w 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 &modifiable
czek nie obejmuje tej skrzynki?
Function name must start with a capital or "s:": rc:isNTOpen()
Czy używasz rozszerzeń zakresów wtyczek?
.vimrc
w 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 NERDTreeCWD
polecenie 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 NERDTreeFind
zmieni 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 NERDTreeToggle
bę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, :NERDTreeToggle
ale pokaże aktualnie otwarty plik w NERDTree. Jeśli jeszcze nie otworzyłeś pliku (tj. Właśnie wpisałeś vim
w 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, cd
aby ustawić katalog roboczy NERDTree na bieżący katalog i C
ustawić 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