web-dev-qa-db-fra.com

Vim: Comment synchroniser NERDTree avec le chemin du fichier de tabulation actuellement ouvert?

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

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

55
Jichao

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

autocmd BufEnter * lcd %:p:h

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

11
Yaser Sulaiman

J'utilise le mappage suivant pour afficher le tampon actuel dans NERDTree:

 map <leader>r :NERDTreeFind<cr>
110
shinzui

J'ai trouvé les deux réponses existantes éducatives et les a combinées avec succès pour que le comportement ressemble davantage à celui que beaucoup de gens attendaient d'un IDE: Cliquez sur une fenêtre/mémoire tampon ouverte et mettez ce fichier en surbrillance dans l'arbre NERDTree. Je mets ceci dans mon ~/.vimrc:

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

Qu'est-ce que cela 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 concentré sur le NERDTree; cela revient à la fenêtre sur laquelle vous vous concentriez à l'origine

Notez que cela ne fonctionnera pas sur ni aucun autre tampon non modifiable - mais c'est généralement une bonne chose; sinon (par exemple) chaque fois que vous obtenez :help dans vim, NERDTree rechercherait et mettrait en évidence le répertoire dans lequel les fichiers d’aide sont stockés - ce n’est probablement pas quelque chose que vous souhaitiez.

Cette solution à une ligne a très bien fonctionné pour moi au début, mais j’ai vite constaté qu’elle activait NERDTree à chaque fois que j’ouvrais un fichier. En conséquence, elle empêchait la fermeture de NERDTree! Si vous ne souhaitez pas utiliser NERDTree à plein temps, mettez ceci dans votre fichier .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()
23
Lambart

jeter un signe% à la fin comme un patron

:NERDTree %

j'ai ceci dans mon .vimrc, il cartographie Ctrl+o pour basculer nerdtree dans le répertoire du tampon courant:

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

23
schpet

Je suis tombé sur cette question hier, après quelques heures de fouilles, j'ai soumis une demande de tirage à le dépôt de nerdtree de scrooloose introduction d'une commande NERDTreeCWD qui change la racine de l'arborescence NERD en répertoire de travail actuel (Mise à jour le 12/11/2012: le PR a été fusionné dans le maître en amont, il devrait être utilisable dans 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 à l'approche de @ shinzui et @ Lambart NERDTreeFind, cela correspond exactement à la question posée. Utiliser NERDTreeFind changera la position de défilement du nerdtree et le résultat ne sera pas toujours le même (si CWD est dans la racine de l’arborescence NERD, il ne fait que développer le nœud au lieu de le changer).

Comparée à la réponse de @Yaser Sulaiman, cette solution a toujours une fenêtre arborescence NERD ouverte et peut être facilement codée. Si une fenêtre d'arborescence NERD a déjà été ouverte, l'utilisation de NERDTreeToggle devra être déclenchée deux fois (fermez d'abord celle existante, puis ouvrez-la à nouveau). Malheureusement, la deuxième ouverture ignorera le traitement complet de cwd.

2
weynhamz

Cela se comporte comme :NERDTreeToggle mais montrera le fichier actuellement ouvert dans NERDTree. Si vous n’avez pas encore ouvert de fichier (c’est-à-dire que vous venez de saisir vim dans votre ligne de commande), NERDTree affiche /home.

Mettez ceci dans votre .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
1
Matthias Braun

J'applique les deux solutions de Modification du répertoire actuel à l'aide de NERDTree : utilisez cd pour définir le répertoire de travail NERDTree sur le répertoire actuel et C pour définir le nœud racine NERDTree sur le répertoire courant

1
Casper Gerritsen

J'ai trouvé que la réponse affichée par Matthias était une excellente réponse à un problème: cela ne fonctionne pas bien dans quelques cas Edge. Cela fonctionne un peu mieux avec le changement ci-dessous:

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
0
Keith Schaab

Je pense que ce plugin est ce que vous voulez https://github.com/jistr/vim-nerdtree-tabs

0
j2fly