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


60

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?

Réponses:



116

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

 map <leader>r :NERDTreeFind<cr>

3
Je trouve cela très utile, et je suis allé à mon .vimrc. Je voulais utiliser une autre reliure pour me rappeler plus facilement. Et j'ai découvert qu'il y a déjà une liaison pour cela avec NERDTree <Leader>f
benzen

1
Impressionnant! Exemple de ce que je cherchais.
Mawaldne

Pouvez-vous élaborer sur ce sujet?
Jterm

Si vous utilisez cet incroyable vimrc (pas le mien), il est mappé sur, nf: github.com/amix/vimrc
alpha_989

Quelle clé est <leader>?
stillanoob

30

jeter un signe% à la fin comme un patron

:NERDTree %

J'ai ceci dans mon fichier .vimrc, il mappe Ctrl+ opour basculer nerdtree dans le répertoire du tampon courant:

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


2
Tu sais que j'étais sceptique. Quelque chose dans la façon dont vous l'avez dit: D. Mais c’est la seule chose qui a fonctionné comme j’en avais besoin, bien fait.
Hugo

Un tel patron répond!
ecbrodie

1
beaucoup patron, telle réponse
mhz

Le seul problème est que lorsque vous démarrez à partir d'un fichier vide, la bascule ne fonctionnera pas car il n'y a pas de répertoire du tampon actuel.
X.Arthur

25

J'ai trouvé les deux réponses existantes instructives 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 sur aucun autre tampon non modifiable, mais c'est généralement une bonne chose. sinon (par exemple) chaque fois que vous :helpaccéderez à 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 - ce qui évitait donc que NERDTree ne soit jamais fermé! Si vous ne voulez pas utiliser NERDTree à temps plein, 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()

1
Quel est le but de isNTFocused()? Le &modifiablechèque ne couvre- t-il pas ce cas?
jrdioko

2
Function name must start with a capital or "s:": rc:isNTOpen()Utilisez-vous un plugin qui étend les portées?
Brian Haak

1
Désolé mais je ne sais pas, @BrianHaak. Je n'utilise pas NerdTree actuellement, et ai égaré mon ancien .vimrcdans lequel j'avais écrit ce code. Je ne me souviens pas pourquoi j'ai utilisé le rc:mais Je n'utilisais aucun plugin spécifiquement lié à cela, autant que je m'en souvienne. Vous devrez étudier la documentation ou simplement essayer de la laisser et de voir si quelque chose se casse. Mais je pense que l'un des noms de fonction était en conflit avec quelque chose dans NerdTree ou ailleurs. Personne d'autre n'a demandé depuis presque 5 ans, alors j'ai l'impression que c'est quelque chose de simple. :)
Lambart

4
@Lambart J'ai créé une configuration utilisable avec tous les problèmes résolus: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak

1
Cool. Cela fait des années que je veux dire git-ify mes différents fichiers .rc. Un jour ...
Lambart

2

Je suis tombé sur cette question hier, après quelques heures de fouilles, j'ai soumis une demande d' extraction pour scrooloose le dépôt de nerdtree introduisant une NERDTreeCWDcommande qui change la racine de l'arborescence NERD en un répertoire de travail courant (Mise à jour le 12/11/2012: le PR a été fusionné dans le maître en 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 à l'approche de @ shinzui et de @ Lambart NERDTreeFind, cela correspond exactement à la question posée. Utiliser NERDTreeFindchangera 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’arbre NERD, le noeud sera simplement agrandi au lieu d’être modifié).

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 NERDTreeToggledevra ê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.


Votre solution ne conduit-elle pas à ce que NERDTree soit toujours ouvert? De plus, je constate que si j'utilise le plug-in MRU et tente d'ouvrir des fichiers, il ouvre les fichiers de la fenêtre NERDtree après avoir utilisé cette modification. Dans l'état actuel des choses, cette modification entraînera de nombreux problèmes et conflits avec MRU ( github.com/yegappan/mru/wiki/User-Manual ), mais je ne sais pas pourquoi. Peut-être que d'autres personnes peuvent vérifier si elles ont des problèmes similaires. J'aime que l'onglet NERDtree soit toujours ouvert.
alpha_989

Ouais, cela a pour résultat que NERDTree est toujours ouvert. Tristesse.
Meredith

1

Cela se comporte :NERDTreeTogglemais affichera le fichier actuellement ouvert dans NERDTree. Si vous n'avez pas encore ouvert de fichier (c'est-à-dire que vous venez d'entrer vimdans votre ligne de commande), NERDTree s'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



0

J'ai trouvé que la réponse affichée par Matthias était une excellente réponse à un problème: cela ne fonctionnait pas bien dans quelques cas extrêmes. 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.