2010-11-19 15 views
22

Quando ho un pannello NERDtree e salvi una sessione Vim (mksession [nome file]), quindi apro la sessione (vim -S nome file), il pannello viene aperto e taggato "NERDtree" ma non è popolato. Se provo ": NERDtree" dalla riga di comando, la finestra viene popolata, ma ora si apre un altro pannello.Vim, NERDtree non ripristinato nel ripristino della sessione

Qualche idea di questo strano comportamento?

risposta

1

Il modo più semplice per fare NERDTree agire come previsto con le sessioni è probabilmente quello di rattoppare NERD_tree.vim, l'aggiunta di un autocomando al gruppo NERDTree autocomando (subito dopo la linea augroup NERDTree):

exec "autocmd BufEnter ". s:NERDTreeBufName ."* call <SID>initNerdTreeInPlace(\"\")" 

Non è ampiamente testati , ma questo sembra funzionare per me con diversi layout e con diversi numeri di finestre NERDTree aperte.

Modifica: In realtà, questo non funziona in modo ottimale perché NERDTree ha finestre primarie e secondarie e non c'è indicazione nel file di sessione se un buffer NERDTree è uno o l'altro. Sembra che aggiungere un supporto affidabile per questo al plug-in non sia una sfida così grande, ma è più che banale. Nel frattempo, per i casi semplici, aggiungendo la seguente autocomando (al posto di quello di cui sopra) potrebbe fare quello che vuoi:

exec "autocmd BufEnter ". s:NERDTreeBufName ."* :NERDTreeToggle | :NERDTreeToggle" 
+0

non funziona con NERDtree corrente 5,0 ... –

6

Ho avuto lo stesso problema e durante la mia ricerca ho trovato due soluzioni:

È possibile utilizzare un plug-in chiamato "session.vim", che ha un supporto di base per il ripristino di NERDTree. Lo trovi qui: http://www.vim.org/scripts/script.php?script_id=3150

Ho scoperto da solo che questo plugin non fa per me, quindi ho preso un altro approccio. È possibile configurare vim per impostare automaticamente la directory del buffer uguale alla directory di lavoro.

autocmd BufEnter * lcd %:p:h 

Dal momento che l'NERDTree apre la directory di lavoro quando lo si apre la prima volta, sei già dove vuoi essere!

Basta aprire il NERDTree dopo in questo caso il file o la sessione è stato aperto.

Tuttavia, dal momento che la magia funzionerà solo per la prima volta all'interno di una scheda, è possibile utilizzare il seguente comando per consentire a NERDTree di trovare il proprio file nell'albero nella colonna.

map <leader>r :NERDTreeFind<cr> 

Per sgomberare l'albero basta salire su alcune directorys come si desidera usando il comando "p" e quindi digitare "C".

ho scoperto che i comandi grazie ai ragazzi in questo post:

https://superuser.com/questions/195022/vim-how-to-synchronize-nerdtree-with-current-opened-tab-file-path

+0

+1 Per: ' "Session.vim", che ha una base support' ciò che è vero! Inoltre, session.vim dispone di un'opzione per l'esecuzione automatica dell'ultima sessione. Esattamente quello che voglio ... –

19

appena deciso di affrontare questo tema io stesso.Nel mio caso, la sessione viene creato quando ho lasciato Vim con il seguente nel mio vimrc:

autocmd VimLeave * mksession! [filename]

stavo anche cercando di aprire NERDTree automaticamente quando Vim è aperta con:

autocmd VimEnter * NERDTree

Il risultato è stato che la mia sessione si è aperta con due istanze di NERDTree, come descritto nel post originale. La mia soluzione era semplicemente chiudere NERDTree prima di salvare la sessione, in questo modo la mia chiamata auto-aperta avrebbe aperto solo l'istanza di NERDTree.

mia soluzione

" Save session on quitting Vim 
autocmd VimLeave * NERDTreeClose 
autocmd VimLeave * mksession! [filename] 

" Restore session on starting Vim 
autocmd VimEnter * call MySessionRestoreFunction() 
autocmd VimEnter * NERDTree 

Sta funzionando come un fascino per me finora. Spero che questo ti aiuti.

+1

semplice e chiaro. btw, ho utilizzato il codice di ripristino della sessione qui: http://stackoverflow.com/questions/5142099/auto-save-vim-session-on-quit-and-auto-reload-session-on-start/6052704#6052704 –

+0

Invece di 'NERDTreeClose', preferisco usare il metodo tabs' NERDTreeTabsClose' usato da [vim-nerdtree-tabs] (https://github.com/jistr/vim-nerdtree-tabs). Questa combinazione funziona anche in modo impeccabile per sessioni con più schede. – Egel

4

Per correggere la sessione NERDTress con il plug-in di sessione, i nuovi comandi di sessione incorporati nel plug-in di sessione: "SaveSession" e "OpenSession" devono essere utilizzati, anziché "mksession" e "source".

Secondo le osservazioni della sessione plug dell'autore: di Vim: comando mksession realtà non è compatibile con i plug-in in grado di creare i buffer con contenuti generati e per questo Session.vim include soluzioni specifiche per tali plug-in: • Sono supportate le finestre dell'albero di BufExplorer, Project e NERD; • Quando shell.vim è installato Lo stato a schermo intero di Vim è persistente; • I plug-in netrw e taglist.vim supportano le sessioni immediatamente.

Forse è per questo che dovremmo usare i nuovi comandi per superare il problema della sessione NERDTree.

Per ulteriori dettagli, fare riferimento a http://peterodding.com/code/vim/session/.

2

Oppure è possibile utilizzare Vimpanel, con il supporto di sessione integrato, tra le altre funzionalità.

0

Un'altra soluzione basata su stevelove di:

fun! Mksession(name) 
    let need_tree = g:NERDTree.IsOpen() 
    NERDTreeClose 
    execute "mksession! " . a:name 
    if need_tree 
     call writefile(readfile(a:name)+['NERDTree'], a:name) 
     NERDTree 
    endif 
endfun 

command! -nargs=1 Mksession call Mksession(<f-args>) 
Problemi correlati