Vim: Come sincronizzare NERDTree con il percorso del file della scheda attualmente aperto?


60

Quando apro una nuova scheda con un percorso diverso dal file precedente in VIM, NERDTree rimarrà comunque la stessa gerarchia di directory del file precedente.

Esiste un collegamento di sincronizzazione per cambiare la directory principale corrente nella directory del nuovo file aperto?

Risposte:



116

Uso il seguente mapping per visualizzare il buffer corrente in NERDTree:

 map <leader>r :NERDTreeFind<cr>

3
Lo trovo molto utile e sono andato al mio .vimrc. Volevo usare qualche altra rilegatura per farmi ricordare più facilmente. E ho scoperto che esiste già un legame per questo con NERDTree <Leader>f
benzen,

1
Eccezionale! Esempio quello che stavo cercando.
mawaldne,

Puoi approfondire questo?
jterm,

Se stai usando questo fantastico vimrc (non il mio), è mappato su, nf: github.com/amix/vimrc
alpha_989

Quale chiave è <leader>?
Stillanoob,

30

lancia un segno% alla fine come un boss

:NERDTree %

ho questo nel mio .vimrc, mappa Ctrl+ oper attivare / disattivare nerdtree nella directory del buffer corrente:

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


2
Sai che ero scettico. Qualcosa nel modo in cui l'hai detto: D. Ma questa è l'unica cosa che ha funzionato come avevo bisogno, ben fatto.
Hugo,

Una tale risposta del capo!
ecbrodie,

1
molto capo, tale risposta
mhz

L'unico problema è quando si inizia da un file vuoto, l'interruttore non funzionerà poiché non c'è dir del buffer corrente.
X. Arthur

25

Ho trovato educative entrambe le risposte esistenti e le ho combinate con successo in modo che il comportamento sia più simile a quello che molte persone si aspetterebbero da un IDE: fare clic su una finestra / buffer aperto e fare in modo che il file sia evidenziato in NERDTree. Ho inserito questo nel mio ~ / .vimrc:

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

Cosa fa questo:

  1. autocmd BufEnter - viene eseguito ogni volta che ti concentri su un buffer (inclusa la finestra NERDTree)
  2. if &modifiable - quando fai clic sulla finestra NERDTree, non fare nient'altro (la finestra NERDTree non è modificabile)
  3. wincmd p- NERDTreeFind lascia il cursore focalizzato su NERDTree; questo ritorna alla finestra su cui inizialmente ti eri concentrato

Nota che questo non funzionerà su nessun altro buffer che non sia modificabile, ma generalmente è una buona cosa; altrimenti (ad esempio) ogni volta che :helpentri in vim, NERDTree trova e focalizza la directory in cui sono archiviati i file di aiuto - probabilmente non è qualcosa che vuoi che faccia.

Quella soluzione a una riga ha funzionato alla grande all'inizio per me, ma ho presto scoperto che provoca l'attivazione di NERDTree ogni volta che apro un file e, di conseguenza, impedisce che NERDTree venga mai chiuso! Se non vuoi usare NERDTree a tempo pieno, inseriscilo nel tuo .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
Qual è lo scopo di isNTFocused()? L' &modifiableassegno non copre questo caso?
jrdioko,

2
Function name must start with a capital or "s:": rc:isNTOpen()Stai usando un plugin che estende gli ambiti?
Brian Haak,

1
Scusa ma non lo so, @BrianHaak. Attualmente non uso NerdTree e ho smarrito il mio vecchio .vimrcin cui avevo scritto quel codice. Non ricordo perché ho usato il rc:, ma penso che sia stata una cosa spaziale per evitare conflitti di nomi con altre funzioni. Per quanto ricordo, non stavo usando alcun plugin specificamente correlato a quello. Dovrai studiare i documenti o semplicemente provare a lasciarli fuori e vedere se qualcosa si rompe. Ma penso che uno dei nomi delle funzioni sia in conflitto con qualcosa in NerdTree o altrove. Nessun altro ha chiesto in quasi 5 anni, quindi ho la sensazione che sia qualcosa di semplice. :)
Lambart

4
@Lambart Ho creato una configurazione utilizzabile con tutti i problemi risolti: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak

1
Freddo. Ho intenzione di anni per git-ify i miei vari file .rc. Un giorno ...
Lambart,

2

Mi sono imbattuto in questa domanda ieri, dopo alcune ore di scavo, ho inviato una richiesta pull al repository nerdtree di scrooloose introducendo un NERDTreeCWDcomando che cambia la radice dell'albero NERD nella directory di lavoro corrente (Aggiornamento del 2012-11-12: il PR è stato unito in il master upstream, dovrebbe essere utilizzabile su una versione aggiornata). Con questa modifica, questa domanda può essere semplicemente risolta dal seguente codice.

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

Confronta con l'approccio di @ shinzui e @ Lambart NERDTreeFind, questo fa esattamente quello che ha posto la domanda. L'utilizzo NERDTreeFindcambierà la posizione di scorrimento del nerdtree e il risultato non sarà sempre lo stesso (se CWD è nella radice dell'albero NERD, espande semplicemente il nodo invece di cambiarlo).

Confronta con la risposta di @Yaser Sulaiman, questa soluzione ha sempre una finestra ad albero NERD aperta e può essere facilmente codificabile. Se una finestra ad albero NERD è già stata aperta, NERDTreeTogglesarà necessario attivare due volte l'uso (prima chiudi quella esistente, quindi riaprila), sfortunatamente, la seconda apertura salterà l'intera elaborazione cwd.


La tua soluzione non porta a NERDTree sempre aperto? Inoltre trovo che se uso il plug-in MRU e provo ad aprire i file, i file si aprono nella finestra NERDtree dopo aver utilizzato questa modifica. Allo stato attuale, questa modifica causerà molti problemi e conflitti con MRU ( github.com/yegappan/mru/wiki/User-Manual ), tuttavia non so perché. Forse altre persone possono verificare se hanno problemi simili. Mi piace il fatto che la scheda NERDtree sia sempre aperta ..
alpha_989

Sì, questo si traduce in NERDTree sempre aperto. Tristezza.
Meredith,

1

Questo si comporta come :NERDTreeTogglema mostrerà il file attualmente aperto in NERDTree. Se non hai ancora aperto un file (ovvero, hai appena inserito la vimtua riga di comando) mostra NERDTree /home.

Metti questo nel tuo .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

Ho trovato la risposta che Matthias ha pubblicato per essere un'ottima risposta con un problema, non funziona bene in un paio di casi limite. Funziona un po 'meglio con la modifica seguente:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.