Ich weiß, dass das Register % den vollständigen Pfad des aktuellen Puffers enthält. Aber wie erhalte ich den vollständigen Pfad eines anderen Puffers anhand seiner Nummer?
Gibt es eine solche Funktion/einen solchen Befehl in VIM?
Ich möchte erklären, wie ich zu dieser Frage gekommen bin...
Es waren 2 Puffer geöffnet. Der erste war eine XML-Datei im linken Fenster und der andere war eine XSD-Datei im rechten Fenster. Ich habe beide bearbeitet. Während der Bearbeitung wollte ich das XML anhand des Schemas validieren.
Der Befehl
!xmllint --schema /tmp/schema.xsd %
funktionierte natürlich nur, wenn der aktuelle Puffer der mit dem XML war. Daher war ich neugierig, ob es möglich wäre, es /tmp/schema.xsd
durch einen Befehl oder Funktionsaufruf zu ersetzen, der den vollständigen Pfad anhand der Puffernummer ermittelt. So etwas wie:
!xmllint --schema getBufferPath(3) %
Antwort1
Sie können den Anruf verwenden expand()
. Zum Beispiel
:echo expand("#2:p")
Gibt den vollständigen Pfad der Datei in Puffer #2 aus. Sie können alle Puffer auflisten mit:ls
Sie können andere Modifikatoren und andere Schlüsselwörter verwenden (die vollständige Infoseite finden Sie unter :help expand()
)
Hier ist ein kurzer Auszug:
When {expr} starts with '%', '#' or '<', the expansion is done like for the cmdline-special variables with their associated modifiers. Here is a short overview: % current file name # alternate file name #n alternate file name n <cfile> file name under the cursor <afile> autocmd file name <abuf> autocmd buffer number (as a String!) <amatch> autocmd matched name <sfile> sourced script file name <slnum> sourced script file line number <cword> word under the cursor <cWORD> WORD under the cursor <client> the {clientid} of the last received message server2client() Modifiers: :p expand to full path :h head (last path component removed) :t tail (last path component only) :r root (one extension removed) :e extension only Example: :let &tags = expand("%:p:h") . "/tags" Note that when expanding a string that starts with '%', '#' or '<', any following text is ignored. This does NOT work: :let doesntwork = expand("%:h.bak") Use this: