2009-11-10 2 views
36

In Vim, wenn ich einen Puffer geöffnet habe, muss ich oft eine andere Datei im selben Verzeichnis, in dem die Datei ist, laden, aber da ich normalerweise nicht cd Darin ist der pwd ein übergeordneter Ordner, daher muss ich den Pfad jedes Mal neu eingeben. Gibt es eine Abkürzung dafür? oder eine Möglichkeit, das Pwd in das Verzeichnis zu ändern, in dem sich die Datei befindet?Öffnen von Dateien im selben Ordner wie die aktuelle Datei, in vim

Beispiel:

cd /src 
vi lib/foo/file.js 

lib/foo hat zwei Dateien: file.js und file2.js

in vi:

:e file2.js # doesn't work 

Antwort

27

Neuere Versionen von vim haben einen autochdir-Befehl eingebaut, wenn nicht, können Sie auf ein BufEnter-ähnliches Setup zurückgreifen.

" set vim to chdir for each file 
if exists('+autochdir') 
    set autochdir 
else 
    autocmd BufEnter * silent! lcd %:p:h:gs/ /\\/
endif 
+0

Wenn Sie das tun, dann warum nicht einfach "cd" in dieses Verzeichnis an erster Stelle, bevor Sie die Datei öffnen beide gleichermaßen restriktiv in Bezug auf den Zugriff auf andere Verzeichnisse nach dem Öffnen der Datei? @ Hgmnz Lösung unten ist viel eleganter und flexibler. – trim

9

Fügen Sie diese Zeile in vimrc Konfiguration

autocmd BufEnter * cd %:p:h 

% aktuellen Dateinamen
: p zu vollständigen Pfad erweitern
: h Kopf (letzte entfernt Pfadkomponente)

:help expand Siehe für weitere Informationen.

+0

Das funktioniert super, danke. Nun zu lernen, was diese '%: p: h' bedeutet :) – cloudhead

+1

Diese Seite hilft mir sehr beim Nachschlagen von vim-stuff: http://rayninfo.co.uk/vimtips.html – flokra

+0

danke für die zusätzlichen Informationen. – cloudhead

12

Versuchen Sie Folgendes:

:e %:p:h/file2.js 
+0

Dies ist die kürzeste Antwort mit der allgemeinsten Lösung. Das Lernen über '%: p: h /' als Abkürzung für den aktuellen Pfad hilft dabei, es auf andere Situationen anzuwenden, in denen der aktuelle Pfad benötigt wird, wie ': r',': w', ... – eMBee

1

Eine weitere Option ist zu tun:

:e <Tab> 

Diese Zyklen durch die Ordner in Ihrem Arbeitsverzeichnis.

+0

Dies funktioniert nicht, weil mein Arbeitsverzeichnis nicht das ist, in dem die Datei bearbeitet wird. – cloudhead

2

Sie wissen wahrscheinlich, dass, wenn Sie in vim sind, Sie

:cd lib/foo 

können in lib/foo ändern.

Auf der anderen Seite, in das Verzeichnis der Datei, die Sie aktuelle Bearbeitung, versuchen

sind zu ändern
:cd %:p:h 

Sie immer

:pwd 

können Ihr aktuelles Arbeitsverzeichnis zu überprüfen.

Und natürlich, wenn Sie vergessen haben, welche Datei Sie gerade bearbeiten, drücken Sie einfach ctrl-g.

2

Auf der "Shortcut" -Front, haben Sie den :Sex Befehl angesehen? Dies öffnet den Dateibrowser in einem Split, so dass Sie andere Dateien leicht öffnen können. :Sex Standard auf das Verzeichnis des aktuellen Puffers. Ziemlich raffiniert, wenn ich das selbst sage.
Ich binde es ;o für einen einfachen Zugang:

map ;o :Sex <CR> 

Sie auch :Ex verwenden können, wenn Sie es in den aktuellen Puffer behalten wollen stattdessen eine Spaltung zu schaffen.

+0

genial. Ich wünschte, die Datei würde sich im anderen Fenster öffnen! – cloudhead

+0

Oh, das ist ': Ex'. Ich bin in Splits verliebt, also denke ich so. Ich werde die Antwort dafür bearbeiten. –

+0

hehe nein, ich weiß, was ich meinte, ist die Aufteilung zu halten, aber wenn du eine Datei öffnest, öffnet sie sie im anderen Fenster, nicht in der Dateiliste. – cloudhead

3

Ich habe dies in meinem.vimrc-Datei, die das aktuelle Verzeichnis in die Datei im Puffer ändert. Dadurch wird das aktuelle Verzeichnis für den Puffer festgelegt und beim Wechseln der Puffer aktualisiert.

autocmd BufEnter * lcd %:p:h 
+0

rcs schlagen dich dazu! – cloudhead

3

Also vim hat einen: find Befehl, der die Variable 'path' benutzt. Wenn Sie konsistente Verzeichnisstrukturen für Ihren Code haben, wie z. B. alle Quellen unter einem Verzeichnis "src", können Sie dies einfach zur Variablen "path" hinzufügen. Dann, wenn Sie tun: foo.js finden, wird es sowohl Ihre aktuelle Position als auch die Ordner suchen, die in Ihrer Pfadvariablen aufgelistet sind. Es emuliert grundsätzlich die Art und Weise, wie bash oder eine andere Shell die PATH-Variable verwendet, um die richtige Binärdatei zum Ausführen zu finden.

35

Ich habe die folgenden drei Zeilen auf meinem .vimrc:

map ,e :e <C-R>=expand("%:p:h") . "/" <CR> 
map ,t :tabe <C-R>=expand("%:p:h") . "/" <CR> 
map ,s :split <C-R>=expand("%:p:h") . "/" <CR> 

Jetzt ,e <some-file> öffnet sich auf diesem Puffer. ,t und ,s machen dasselbe, aber auf einem neuen Tab/Split-Fenster.

+4

Dies ist mein Favorit der hier veröffentlichten Lösungen. Ich mag es nicht, automatisch in das Verzeichnis der aktuellen Datei zu wechseln. Ich öffne vim lieber im Root-Verzeichnis eines Projekts, und das bedeutet, dass ': e' immer von oben nach unten bohrt. Wenn ich bisher eine Datei im selben Verzeichnis wie die aktuelle Datei öffnen wollte, würde ich ': E' verwenden, was den netrw Datei-Explorer anzeigt. Die Verwendung Ihres ', e'-Mappings fühlt sich viel schneller an. Es ist großartig, wie Sie die Dateien im aktuellen Verzeichnis durchsuchen können. – nelstrom

+0

Stimmen Sie mit Ihnen überein. Auch wenn ich nie das Verzeichnis wechseln muss, gibt es immer ': cd%: h' – hgmnz

+0

Vielen Dank für diese Lösung! Es funktioniert erstaunlich! – Eric

24

Eine einfache Idee ist es, die autochdir Einstellung zu verwenden. Versuchen Sie dies in Ihrem .vimrc:

set autochdir 

Dies wird das Arbeitsverzeichnis von vim in das Verzeichnis der Datei, die Sie geöffnet ändern.

Hinweis: Ich bin mir nicht sicher, welche Version diese Funktion hinzugefügt hat. Ich habe von Vim 6 auf 7.2 aktualisiert, um dies zum Laufen zu bringen.

+0

aus irgendeinem Grund funktioniert dies nicht für mich, auf '7.2.108' – cloudhead

+0

Es ist nur verfügbar, wenn Vim mit Netbeans Integration oder Sun Visual Workshop Integration gebaut wurde. Ersteres ist häufiger als letzteres, aber es ist nicht ungewöhnlich, dass es nicht eingebaut ist. Aus diesem Grund testet die Antwort von gregf auf die Existenz einer funktionierenden Autochdir-Option. – jamessan

+0

autochdir ist auch ein Problem, weil es die Verzeichnisse wechselt, bevor es versucht, die Datei zu laden. Wenn Sie also in der Befehlszeile 'gvim path/to/file.c' eingeben, wird cd in path/to und dann versuchen, den Pfad zu öffnen. to/file.c, wodurch Sie einen leeren Puffer an einem nicht vorhandenen Speicherort erhalten. :((sowieso (64-Bit 7.2 unter Windows). –

5

Die Lösung mit Autochdir hat ihre eigenen Tücken. Zum Beispiel müssen Sie in dem Verzeichnis bleiben, in dem Sie sich befinden, da Tags mit einem relativen Pfad definiert sind oder Sie Makefile oder pom.xml im aktuellen Verzeichnis benötigen.

können Sie

:e <C-R>% 

verwenden und dann Pfad ändern, indem Sie Namen der aktuellen Datei zu löschen und neu eintragen. Or. über die Karte

nnoremap <leader>e :edit <C-R>=fnamemodify(@%, ':p:h')<CR>/ 

Und dann durch Drücken \e oder ,e (auf Leader Einstellungen abhängig) Sie Befehl erhält, dass offenes Verzeichnis, in dem Sie Ihre aktuelle Datei ist und Sie können Vervollständigen Sie diesen Befehl manuell und verwenden Sie ctrlD, um alle Dateien aus dem aktuellen Dateiverzeichnis anzuzeigen.

Or. En Sie können versuchen 0scan Plugin.

Keys f

+0

Tags können "rekursiv" gefunden werden. Wir haben unsere Tags in einem _tags/Ordner an der Wurzel. ' set tags = _tags/tags; c:/work' bedeutet "gehe hoch, bis du etwas gefunden hast, das zu' _tags/tags' passt, aber stopp wenn du 'c:/work' drückst. Also wenn ich c:/work/bearbeite project/main/src/lib/subdir/file.c (aus dem Verzeichnis dieser Datei) kann es immer noch meine Tagdatei finden c:/work/project/main/_tags/tags –

36

: Ex kurz für: Entdecken Sie tut genau das, was Sie gefragt.

+3

Dies scheint die einfachste Antwort mit einer funktionierenden Lösung zu sein. – klokop

+0

Ermöglicht es Ihnen, eine neue Datei zu erstellen? –

+1

Drücken Sie%, wenn Sie in Ex sind, und Sie werden gefragt für eine neue Datei. @JacobScharf – Alan