Es gibt drei Hauptschritte, um das zu erreichen, was Sie verlangen:
- Abrufen des Namens der alternativen Datei
- Öffnen dieser Datei im aktuellen Fenster oder in einem anderen Fenster nach Wunsch
- Wiederherstellen der Cursorposition in dieser Datei
Um den alternativen Dateinamen zu finden, möchten Sie den aktuellen Dateinamen in "root" und "extension" aufteilen. Ein einfacher Weg, dies zu tun, ist:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Wenn Sie wissen, dass Sie immer nur zwischen .h
und .cpp
Dateien wechseln, können Sie die Erweiterung einfach von einer zur anderen ändern:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
Alternativ können Sie ein Wörterbuch erstellen, das bekannte Erweiterungen potenziell gültigen alternativen Erweiterungen zuordnet. Oder verwenden Sie globpath()
, um alle möglichen Alternativen für die aktuelle Datei abzurufen:
let alternates = globpath(expand("%:h"), root . ".*")
und wähle den ersten oder was auch immer. Ich bevorzuge den globpath
Ansatz, mit einigen zusätzlichen Intelligenz, die ich später beschreiben werde. Nachdem Sie die Zielerweiterung ausgewählt haben, bilden Sie den vollständigen Zielpfad:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Jetzt können Sie die alternative Datei im aktuellen Fenster öffnen:
execute "edit " . target
Oder verwenden Sie winnr()
, um die Nummer des "anderen Fensters" abzurufen ( winnr("#")
ist das Fenster, <C-W>p
zu dem gesprungen wird, oder Sie können es hart codieren, wenn Sie wissen, dass es für Ihr Setup immer gleich ist) und tun Sie etwas wie:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Dies gibt Ihnen eine wirklich einfache Lösung zum Öffnen alternativer Dateien. Es gibt ein paar Mängel bei dem obigen Ansatz, da ich ihn so geschrieben habe, dass er unkompliziert ist und ein bisschen von der Stange ist. Ich habe ein Plugin geschrieben , das das alternative Wechseln von Dateien "nach meinen Wünschen" durchführt (durch alle verfügbaren globpath()
Ergebnisse blättern). Es behebt einige der Probleme mit der Einfachheit des oben genannten. Sie können die Implementierung überprüfen, wenn Sie mehr erfahren möchten.
Schließlich der Punkt "Cursorposition wiederherstellen". Ich habe es zum letzten Mal gespeichert, da es orthogonal zum alternativen Schaltobjekt ist (mein Plugin behandelt es zum Beispiel nicht), aber Sie könnten es in Ihre Funktion einfügen, wenn Sie Ihr eigenes rollen wollen. :help line()
hat einen automatischen Befehl, der nützlich ist, um die Cursorposition an der Stelle wiederherzustellen, an der sie sich befand, als die Datei zuletzt geöffnet wurde:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
Ich habe das oder etwas sehr Ähnliches einfach in meine aufgenommen, .vimrc
da ich das Verhalten die ganze Zeit bevorzuge. Sie können den Code aber auch einfach woanders platzieren.
:h line()
(generische Lösung): "Dieser automatische Befehl springt direkt nach dem Öffnen zur letzten bekannten Position in einer Datei, wenn die Markierung '" gesetzt ist :: au BufReadPost * if line ("' "")> 1 && Zeile ("'") <= Zeile ("$") | exe "normal! g` \" | endif