2010-11-19 28 views
22

Lorsque j'ai un panneau NERDtree et que j'enregistre une session Vim (mksession [nom_fichier]), puis j'ouvre la session (vim -S filename), le panneau est ouvert et étiqueté "NERDtree" mais n'est pas peuplé. Si j'essaie ": NERDtree" à partir de la ligne de commande, la fenêtre est remplie, mais un autre panneau s'ouvre maintenant.Vim, NERDtree non restauré dans la restauration de session

Des idées pour ce comportement étrange?

Répondre

1

La meilleure façon de faire agir de NERDTree comme prévu des séances est probablement patcher NERD_tree.vim, en ajoutant un autocommand au groupe autocommande NERDTree (juste après la ligne augroup NERDTree):

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

Ce n'est pas largement testé , mais cela semble fonctionner pour moi avec plusieurs dispositions et avec des nombres différents de fenêtres NERDTree ouvertes. Edit: En fait, cela ne fonctionne pas très bien parce que NERDTree a des fenêtres primaires et secondaires, et il n'y a aucune indication dans le fichier de session si un tampon NERDTree est l'un ou l'autre. Il semble que l'ajout d'un support fiable pour le plugin ne soit pas un gros challenge, mais c'est plus que trivial. En attendant, pour les cas simples, en ajoutant le autocommand suivant (au lieu de celle ci-dessus) pourrait faire ce que vous voulez:

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

ne fonctionne pas avec NERDtree courant 5,0 ... –

6

J'ai eu le même problème et au cours de mes recherches, j'ai trouvé deux solutions:

Vous pouvez utiliser un plugin appelé "session.vim", qui a un support de base pour la restauration du NERDTree. Vous pouvez le trouver ici: http://www.vim.org/scripts/script.php?script_id=3150

J'ai découvert par moi-même que ce plugin n'est pas pour moi, donc j'ai pris une autre approche. Vous pouvez configurer vim pour définir automatiquement le répertoire de votre tampon égal à votre répertoire de travail.

autocmd BufEnter * lcd %:p:h 

Depuis le NERDTree ouvre le répertoire de travail lorsque vous l'ouvrez la première fois, vous êtes déjà où vous voulez être!

Il suffit d'ouvrir le NERDTree après vous avez ouvert votre fichier ou votre session dans ce cas.

Toutefois, étant donné que la magie ne fonctionnera que pour la première fois dans un onglet, vous pouvez utiliser la commande suivante pour que le NERDTree trouve votre fichier dans l'arborescence.

map <leader>r :NERDTreeFind<cr> 

Pour désencombrer l'arbre juste monter quelques repertoires que vous le souhaitez en utilisant la commande « p » et puis tapez « C ».

J'ai trouvé les commandes grâce aux gars dans ce poste: Juste

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

+0

+1 Pour: ' "Session.vim", qui a une base support' ce qui est vrai! Et en plus session.vim a une option dernière session autorestore. Exactement ce que je veux ... –

19

a décidé de traiter moi-même question.Dans mon cas, la session est créé lorsque je quitte Vim avec ce qui suit dans mon vimrc:

autocmd VimLeave * mksession! [filename]

je tente aussi d'ouvrir NERDTree automatiquement lorsque Vim ouvert avec:

autocmd VimEnter * NERDTree

Le résultat a été que ma session s'est ouverte avec deux instances de NERDTree, comme décrit dans le post original. Ma solution était de simplement fermer NERDTree avant d'enregistrer la session, de cette façon mon appel auto-ouvert n'ouvrirait qu'une seule instance de NERDTree.

Ma solution

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

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

Il fonctionne comme un charme pour moi jusqu'à présent. J'espère que cela t'aides.

+1

simple et clair. BTW, j'ai utilisé le code de restauration de session ici: http://stackoverflow.com/questions/5142099/auto-save-vim-session-on-quit-and-auto-reload-session-on-start/6052704#6052704 –

+0

Au lieu de 'NERDTreeClose', je préfère utiliser la méthode' NERDTreeTabsClose' des onglets utilisée par [vim-nerdtree-tabs] (https://github.com/jistr/vim-nerdtree-tabs). Cette combinaison fonctionne également parfaitement pour plusieurs sessions d'onglets. – Egel

4

Pour corriger la session NERDTress avec le plugin de session, les nouvelles commandes de session intégrées dans le plugin session: "SaveSession" et "OpenSession" doivent être utilisées, au lieu de "mksession" et "source".

Selon le plug-in session de commentaires de l'auteur: Vim: commande mksession est pas vraiment compatible avec les plug-ins qui créent des tampons avec le contenu généré et de ce Session.vim comprend des solutions de contournement spécifiques pour ces plug-ins: • Les fenêtres BufExplorer, Project et NERD sont supportées; • Lorsque shell.vim est installé, l'état plein écran de Vim est conservé; • Les plug-ins netrw et taglist.vim prennent en charge les sessions prêtes à l'emploi. Peut-être que c'est pourquoi nous devrions utiliser les nouvelles commandes pour résoudre le problème de session NERDTree. Pour plus de détails, veuillez vous référer au http://peterodding.com/code/vim/session/.

2

Ou vous pouvez utiliser Vimpanel, il a la prise en charge de la session intégrée, entre autres fonctionnalités.

0

est une autre solution basée sur stevelove:

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