Vim: Wie synchronisiere ich NERDTree mit dem aktuell geöffneten Dateipfad?

60

Wenn ich in VIM eine neue Registerkarte mit einem anderen Pfad als die vorherige Datei öffne, bleibt NERDTree in der Verzeichnishierarchie der vorherigen Datei erhalten.

Gibt es eine Synchronisierungsverknüpfung, um das aktuelle Stammverzeichnis in das Verzeichnis der neu geöffneten Datei zu ändern?

Jichao
quelle

Antworten:

116

Ich verwende die folgende Zuordnung, um den aktuellen Puffer in NERDTree anzuzeigen:

 map <leader>r :NERDTreeFind<cr>
Shinzui
quelle
3
Ich finde das sehr nützlich, und ich ging zu meinem .vimrc. Ich wollte eine andere Bindung verwenden, um es mir leichter zu machen, mich zu erinnern. Und ich habe mit NERDTree<Leader>f
benzen
1
Genial! Beispiel was ich gesucht habe.
Mawaldne
Können Sie das näher erläutern?
jterm
Wenn Sie dieses erstaunliche vimrc (nicht meins) verwenden, wird es wie folgt abgebildet: github.com/amix/vimrc
alpha_989
Welcher Schlüssel ist <leader>?
Stillanoob
29

Wirf wie ein Boss ein% -Schild auf das Ende

:NERDTree %

Ich habe dies in meinem .vimrc, es ordnet Ctrl+ oum Nerdtree in das Verzeichnis des aktuellen Puffers umzuschalten:

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

schpet
quelle
2
Sie wissen, ich war skeptisch. So wie du es gesagt hast: D. Aber das ist das einzige, was so funktioniert hat, wie ich es brauchte, gut gemacht.
Hugo,
Solch eine Chefantwort!
ecbrodie
1
viel Chef, solche Antwort
mhz
Das einzige Problem ist, dass beim Starten von einer leeren Datei der Umschalter nicht funktioniert, da kein Verzeichnis des aktuellen Puffers vorhanden ist.
X.Arthur
25

Ich fand beide vorhandenen Antworten lehrreich und kombinierte sie erfolgreich, so dass das Verhalten eher so ist, wie es viele Leute von einer IDE erwarten würden: Klicken Sie auf ein geöffnetes Fenster / einen offenen Puffer und lassen Sie diese Datei im NERDTree hervorheben. Ich füge dies in meine ~ / .vimrc ein:

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

Was dies bewirkt:

  1. autocmd BufEnter - wird jedes Mal ausgeführt, wenn Sie sich auf einen Puffer konzentrieren (einschließlich des NERDTree-Fensters)
  2. if &modifiable - Wenn Sie auf das NERDTree-Fenster klicken, tun Sie nichts anderes (das NERDTree-Fenster kann nicht geändert werden).
  3. wincmd p- NERDTreeFind lässt den Cursor auf dem NERDTree stehen. Dadurch kehren Sie zu dem Fenster zurück, auf das Sie sich ursprünglich konzentriert hatten

Beachten Sie, dass dies bei keinem anderen Puffer funktioniert , der nicht geändert werden kann. Dies ist jedoch im Allgemeinen eine gute Sache. Andernfalls (zum Beispiel) :helpwürde NERDTree jedes Mal , wenn Sie sich in vim befinden, das Verzeichnis finden und fokussieren, in dem die Hilfedateien gespeichert sind - wahrscheinlich nicht, was Sie möchten.

Diese einzeilige Lösung hat anfangs sehr gut funktioniert, aber bald stellte sich heraus, dass NERDTree jedes Mal aktiviert wird, wenn ich eine Datei öffne. Dadurch wird verhindert, dass NERDTree jemals geschlossen wird! Wenn Sie NERDTree nicht in Vollzeit verwenden möchten, fügen Sie dies stattdessen in Ihre .vimrc-Datei ein:

" 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()
Lambart
quelle
1
Was ist der Zweck von isNTFocused()? Deckt der &modifiableScheck diesen Fall nicht ab?
jrdioko
2
Function name must start with a capital or "s:": rc:isNTOpen()Verwenden Sie ein Plugin, das die Gültigkeitsbereiche erweitert?
Brian Haak
1
Entschuldigung, aber ich weiß nicht, @BrianHaak. Ich verwende NerdTree derzeit nicht und habe meinen alten .vimrcCode, in den ich ihn geschrieben habe, verlegt. Ich erinnere mich nicht, warum ich die verwendet habe rc:, aber ich denke, es war ein Namensraum, um Namenskonflikte mit anderen Funktionen zu vermeiden. Soweit ich mich erinnere, habe ich kein spezielles Plugin dafür verwendet. Sie müssen die Dokumente lesen oder einfach weglassen, um zu sehen, ob etwas kaputt geht. Aber ich denke, einer der Funktionsnamen widerspricht etwas in NerdTree oder anderswo. Niemand anders hat in fast 5 Jahren danach gefragt, also habe ich das Gefühl, dass es etwas Einfaches ist. :)
Lambart
4
@ Lambart Ich habe eine verwendbare Konfiguration mit allen gelösten Problemen erstellt: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak
1
Cool. Ich habe seit Jahren vorgehabt, meine verschiedenen .rc-Dateien zu git-ify. Eines Tages ...
Lambart
2

Ich bin gestern auf diese Frage gestoßen, als ich nach ein paar Stunden des Grabens einen Pull Request an scrooloose's Nerdtree Repo gesendet habe, mit dem ein NERDTreeCWDBefehl eingeführt wurde, mit dem das NERD-Baumstammverzeichnis in das aktuelle Arbeitsverzeichnis geändert wird (Aktualisierung am 2012-11-12: Der PR wurde zusammengeführt dem Upstream-Master sollte es auf einer aktualisierten Version verwendbar sein). Mit dieser Änderung kann diese Frage einfach durch den folgenden Code gelöst werden.

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

Im Vergleich zu @ shinzuis und @ Lambarts NERDTreeFindAnsatz macht dies genau das, was die Frage gestellt hat. Durch NERDTreeFinddie Verwendung von wird die Bildlaufposition des Nerd-Baums geändert, und das Ergebnis ist nicht immer dasselbe.

Im Vergleich zu der Antwort von @Yaser Sulaiman hat diese Lösung immer ein NERD-Baumfenster geöffnet und kann leicht codiert werden. Wenn bereits ein NERD-Baumfenster geöffnet wurde, muss using NERDTreeTogglezweimal ausgelöst werden (zuerst das vorhandene schließen, dann es erneut öffnen). Leider wird beim zweiten Öffnen die gesamte CWD-Verarbeitung übersprungen.

weynhamz
quelle
Führt Ihre Lösung nicht dazu, dass NERDTree immer offen ist? Außerdem stelle ich fest, dass, wenn ich das MRU-Plugin verwende und versuche, Dateien zu öffnen, es Dateien im NERDtree-Fenster öffnet, nachdem ich diese Änderung vorgenommen habe. Gegenwärtig wird diese Änderung viele Probleme und Konflikte mit MRU verursachen ( github.com/yegappan/mru/wiki/User-Manual ), ich weiß jedoch nicht warum. Vielleicht können andere Leute prüfen, ob sie ähnliche Probleme haben. Mir gefällt, dass der NERDtree-Tab immer geöffnet ist.
alpha_989
Ja, das führt dazu, dass NERDTree immer offen ist. Traurigkeit.
Meredith
1

Dies verhält sich wie :NERDTreeToggle, zeigt aber die aktuell geöffnete Datei in NERDTree an. Wenn Sie noch keine Datei geöffnet haben (dh Sie haben sie gerade vimin Ihre Befehlszeile eingegeben ), wird NERDTree angezeigt /home.

Fügen Sie dies in Ihre .vimrc ein:

" 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
Matthias Braun
quelle
0

Ich denke, dieses Plugin ist das, was Sie wollen https://github.com/jistr/vim-nerdtree-tabs

j2fly
quelle
2
Willkommen bei Super User! Obwohl der Link schön ist, ist es besser , hier ein wenig Kontext einzubeziehen und zu erklären, was das Plugin macht, wie es verwendet werden sollte usw. Danke!
Slhck
Eigentlich könnte dies eine gute Lösung für das sein, was gefragt wurde.
alpha_989
0

Ich fand die Antwort, die Matthias gepostet hat, eine großartige Antwort mit einem Problem, das in einigen Randfällen nicht gut funktioniert. Mit der folgenden Änderung funktioniert es ein bisschen besser:

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