Vim: Wie kann ich NERDTree mit dem aktuell geöffneten Tab-Dateipfad synchronisieren?

29370
Jichao

Wenn ich eine neue Registerkarte mit einem anderen Pfad als der vorherigen Datei in VIM öffne, bleibt NERDTree immer noch dieselbe Verzeichnishierarchie der vorherigen Datei.

Gibt es eine Sync-Verknüpfung, um das aktuelle Stammverzeichnis in das Verzeichnis der neuen geöffneten Datei zu ändern?

50

8 Antworten auf die Frage

104
shinzui

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

 map <leader>r :NERDTreeFind<cr> 
Ich finde das sehr nützlich, und ich ging zu meinem .vimrc. Ich wollte eine andere Bindung verwenden, um mir das Erinnern zu erleichtern. Und ich habe herausgefunden, dass es bei NERDTree `bereits eine Bindung dafür gibtf` benzen vor 9 Jahren 3
Genial! Beispiel was ich gesucht habe. mawaldne vor 9 Jahren 1
Können Sie das näher erläutern? jterm vor 6 Jahren 0
Wenn Sie dieses erstaunliche vimrc (nicht meins) verwenden, wird es dem folgenden Link zugeordnet: nf: https://github.com/amix/vimrc alpha_989 vor 6 Jahren 0
Welcher Schlüssel ist `"? stillanoob vor 5 Jahren 0
21
Lambart

Ich fand sowohl die vorhandenen Antworten als lehrreich und kombinierte erfolgreich die beiden, so dass das Verhalten eher so ist, wie viele Leute es von einer IDE erwarten würden: Klicken Sie auf ein geöffnetes Fenster / Puffer und lassen Sie diese Datei im NERDTree hervorheben. Ich stelle das in mein ~ / .vimrc:

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

Was macht das?

  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 weiter (das NERDTree-Fenster kann nicht geändert werden)
  3. wincmd p- NERDTreeFind verlässt den Cursor auf den NERDTree; Dadurch wird wieder das Fenster angezeigt, auf das Sie sich ursprünglich konzentriert hatten

Beachten Sie, dass dies nicht auf funktioniert jeden anderen Puffer, die nicht veränderbar ist - aber das ist im Allgemeinen eine gute Sache; ansonsten (zum Beispiel) jedes Mal :help, wenn Sie in vim sind, sucht NERDTree das Verzeichnis, in dem die Hilfedateien gespeichert sind, und fokussiert es - wahrscheinlich nicht etwas, das Sie tun möchten.

Diese einzeilige Lösung funktionierte zunächst sehr gut für mich, aber ich stellte bald fest, 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 nutzen möchten, geben Sie dies stattdessen in Ihre .vimrc 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() 
Was ist der Zweck von `isNTFocused ()`? Deckt der "& modifizierbare" Check diesen Fall nicht ab? jrdioko vor 10 Jahren 1
@jrdioko ja, ich glaube du hast recht, das ist ein bisschen überflüssig. Ich kann mir keinen guten Grund vorstellen, das dort zu haben, und einfacher ist immer besser. Ich werde es bearbeiten, danke! Lambart vor 10 Jahren 0
Ich hatte eine Menge Probleme, weil ich aufgrund des "wincmd p" nicht in der Lage war, Fenster zu navigieren (ich konnte buchstäblich nicht in bestimmte Fenster zurückkehren). Am Ende habe ich `let l: curwinnr = winnr ()` vor `NERDTreeFind` und` exec l: curwnum gemacht. "wincmd w" `danach. Alle Probleme gelöst. Patrick vor 9 Jahren 0
`Funktionsname muss mit einem Großbuchstaben oder" s: "beginnen: rc: isNTOpen ()` Verwenden Sie ein Plugin, das die Gültigkeitsbereiche erweitert? Brian Haak vor 6 Jahren 1
Sorry, aber ich weiß es nicht, @BrianHaak. Ich benutze NerdTree derzeit nicht und habe mein altes ".vimrc", in dem ich diesen Code geschrieben habe, verlegt. Ich kann mich nicht erinnern, warum ich das `rc:` verwendet habe, aber ich denke, es war eine Sache des Namensraums, um Namenskonflikte mit anderen Funktionen zu vermeiden. Soweit ich mich erinnere, habe ich kein spezielles Plugin verwendet. Sie müssen die Dokumente studieren oder es einfach weglassen und sehen, ob etwas kaputt geht. Ich denke jedoch, dass einer der Funktionsnamen mit etwas in NerdTree oder anderswo in Konflikt geraten ist. Niemand hat seit fast 5 Jahren mehr gefragt, daher habe ich das Gefühl, dass es etwas Einfaches ist. :) Lambart vor 6 Jahren 1
@Lambart Ich habe es einfach durch `s:` ersetzt Brian Haak vor 6 Jahren 0
@ Brian Haak super. Ich hoffe es klappt für dich! Lambart vor 6 Jahren 0
@Lambart Ich habe eine verwendbare Konfiguration erstellt, bei der alle Probleme gelöst wurden: https://gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7 Brian Haak vor 6 Jahren 3
Cool. Ich habe seit Jahren meine git-ify Bedeutung für meine verschiedenen .rc-Dateien. Irgendwann mal... Lambart vor 6 Jahren 1
20
schpet

wirf am Ende ein% -Zeichen wie ein Boss

:NERDTree %

Ich habe dies in meiner .vimrc, es Maps Ctrl+ oNerdtree im Verzeichnis des aktuellen Puffers umschalten:

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

Sie wissen, ich war skeptisch. Etwas in der Art, wie Sie es sagten: D. Aber das war das Einzige, was so funktionierte, wie ich es brauchte, gut gemacht. Hugo vor 10 Jahren 2
So eine Chefin Antwort! ecbrodie vor 7 Jahren 0
viel Chef, solche Antwort mhz vor 6 Jahren 1
10
Yaser Sulaiman

Ich bin nicht sicher, ob es eine NERDTree-spezifische Methode gibt, aber Sie können Vim immer so konfigurieren, dass das Arbeitsverzeichnis auf das aktuelle Verzeichnis der Datei gesetzt wird :

autocmd BufEnter * lcd %:p:h 

Alles, was Sie nach dem Öffnen einer Datei in einer neuen Registerkarte tun müssen, befindet sich jetzt :NERDTreeTogglein der neuen Registerkarte.

2
weynhamz

Ich kam in dieser Frage gestern, nach ein paar Stunden zu graben, ich submited eine Pull - Request an den nerdtree Repo scrooloose eine Einführung NERDTreeCWDBefehl, die aktuelle Arbeitsverzeichnis (Update auf 2012.11.12 NERD Baumwurzel zu ändern: Die PR verschmolzen wurde in sollte der Upstream-Master auf einer aktualisierten Version verwendet werden können). 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 

Vergleichen Sie den NERDTreeFindAnsatz von @ shinzui und @ Lambart . Dies ist genau das, was die Frage stellt. Mit NERDTreeFindändert sich die Bildlaufposition des Nerd-Baums und das Ergebnis ist nicht immer gleich (Wenn sich CWD im NERD-Baumstamm befindet, wird der Knoten einfach erweitert, anstatt in ihn zu wechseln).

Vergleichen Sie die Antwort von @Yaser Sulaiman. Diese Lösung hat immer ein NERD-Baumfenster geöffnet und kann leicht codiert werden. Wenn bereits ein NERD-Baumfenster geöffnet wurde, muss die Anwendung NERDTreeTogglezweimal ausgelöst werden (zuerst das vorhandene schließen und dann erneut öffnen). Bei der zweiten Öffnung wird jedoch die gesamte cwd-Verarbeitung übersprungen.

Führt Ihre Lösung nicht dazu, dass NERDTree immer geöffnet ist? Ich finde auch, wenn ich das MRU-Plugin verwende und versuche, Dateien zu öffnen, werden Dateien im NERDtree-Fenster geöffnet, nachdem ich diese Änderung verwendet habe. Aus heutiger Sicht führt diese Änderung zu zahlreichen Problemen und Konflikten mit der MRU (https://github.com/yegappan/mru/wiki/User-Manual). Ich weiß jedoch nicht, warum. Vielleicht können andere Leute prüfen, ob sie ähnliche Probleme haben. Ich finde es gut, dass der NERDtree-Tab immer geöffnet ist. alpha_989 vor 6 Jahren 0
Ja, das führt dazu, dass NERDTree immer offen ist. Traurigkeit. Meredith vor 6 Jahren 0
1
Matthias Braun

Dies verhält sich wie :NERDTreeToggledie aktuelle geöffnete Datei in NERDTree. Wenn Sie noch keine Datei geöffnet haben (dh Sie haben gerade vimIhre Befehlszeile eingegeben ), zeigt NERDTree an /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 
1
Casper Gerritsen

Ich wende beide Lösungen von Aktuelles Verzeichnis mit NERDTree ändern an : Verwenden Sie cd, um das NERDTree-Arbeitsverzeichnis auf das aktuelle Verzeichnis und Cden NERDTree-Stammknoten auf das aktuelle Verzeichnis festzulegen

0
j2fly

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

Willkommen bei Super User! Der Link ist zwar nett, aber (es wäre wünschenswert) (http://meta.stackexchange.com/q/8259), hier etwas Kontext mit einzuschließen und zu erklären, was das Plugin macht, wie es verwendet werden soll, usw . Vielen Dank! slhck vor 10 Jahren 2
Eigentlich könnte dies eine gute Lösung für das sein, was gefragt wurde. alpha_989 vor 6 Jahren 0