Wie erhalte ich den Dateipfad eines Puffers?

Wie erhalte ich den Dateipfad eines Puffers?

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.xsddurch 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:

verwandte Informationen