82 votes

Vim : Comment synchroniser NERDTree avec le chemin du fichier de l'onglet ouvert en cours ?

Lorsque j'ouvre un nouvel onglet avec un chemin différent de celui du fichier précédent dans VIM, NERDTree conserve la même hiérarchie de répertoires que le fichier précédent.

Existe-t-il un raccourci de synchronisation pour changer le répertoire racine actuel en répertoire du nouveau fichier ouvert ?

154voto

shinzui Points 1491

J'utilise le mappage suivant pour afficher la mémoire tampon actuelle dans NERDTree :

 map <leader>r :NERDTreeFind<cr>

46voto

schpet Points 1049

Ajoutez un signe % à la fin comme un patron.

:NERDTree %

J'ai ceci dans mon .vimrc, il s'agit de cartes Ctrl + o pour basculer nerdtree dans le dir du buffer courant :

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

40voto

Lambart Points 1032

J'ai trouvé les deux réponses existantes éducatives, et j'ai réussi à combiner les deux pour que le comportement soit plus proche de ce que beaucoup de gens attendent d'un IDE : Cliquez sur une fenêtre/buffer ouverte, et le fichier est mis en évidence dans le NERDTree. J'ai mis cela dans mon ~/.vimrc :

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

Ce que ça fait :

  1. autocmd BufEnter - s'exécute chaque fois que vous vous concentrez sur un tampon (y compris la fenêtre NERDTree).
  2. if &modifiable - lorsque vous cliquez sur la fenêtre NERDTree, ne faites rien d'autre (la fenêtre NERDTree n'est pas modifiable)
  3. wincmd p - NERDTreeFind laisse le curseur sur l'arbre NERDTree ; cela permet de revenir à la fenêtre sur laquelle vous vous étiez initialement concentré.

Notez que cela ne fonctionnera pas sur tout autre buffer qui n'est pas modifiable -- mais c'est généralement une bonne chose ; autrement (par exemple) chaque fois que vous avez :help dans vim, NERDTree trouverait et mettrait en avant le répertoire où sont stockés les fichiers d'aide - ce qui n'est probablement pas ce que vous voulez qu'il fasse.

Cette solution en une ligne a bien fonctionné pour moi au début, mais je me suis vite rendu compte qu'elle fait en sorte que NERDTree s'active chaque fois que j'ouvre un fichier - et par conséquent, elle empêche NERDTree de se fermer ! Si vous ne voulez pas utiliser NERDTree à plein temps, mettez ceci dans votre .vimrc à la place :

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

21voto

4tomic Points 391

Je ne suis pas sûr qu'il existe un moyen spécifique à NERDTree pour faire cela, mais vous pouvez toujours configurer Vim pour qu'il définisse le répertoire de travail comme le répertoire du fichier courant :

autocmd BufEnter * lcd %:p:h

Maintenant, tout ce que vous avez à faire après avoir ouvert un fichier dans un nouvel onglet est de :NERDTreeToggle dans le nouvel onglet lui-même.

3voto

weynhamz Points 129

Je suis tombé sur cette question hier, et après quelques heures de recherche, j'ai soumis une demande à la Commission européenne. Demande de retrait a Le repo nerdtree de scrooloose l'introduction d'un NERDTreeCWD qui change la racine de l'arbre NERD en répertoire de travail actuel (Mise à jour le 2012-11-12 : Le PR a été fusionné dans le master amont,il devrait être utilisable sur une version mise à jour). Avec ce changement, cette question peut être simplement résolue par le code suivant.

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

Comparez avec celles de @shinzui et de @Lambart. NERDTreeFind approche, cela fait exactement ce que la question demandait. En utilisant NERDTreeFind modifie la position de défilement de l'arbre NERD et le résultat n'est pas toujours le même (si le CWD se trouve à la racine de l'arbre NERD, il se contente d'étendre le nœud au lieu de se transformer en lui).

Comparez avec la réponse de @Yaser Sulaiman, cette solution a toujours une fenêtre d'arbre NERD ouverte et peut être facilement codable. Si une fenêtre d'arbre NERD a déjà été ouverte, l'utilisation de la fonction NERDTreeToggle devra être activé deux fois (d'abord fermer l'existant, puis l'ouvrir à nouveau), malheureusement, la deuxième ouverture sautera le traitement complet du cwd.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X