¿Cómo obtener la ruta del archivo de un búfer?

¿Cómo obtener la ruta del archivo de un búfer?

Sé que el registro % contiene la ruta completa del búfer actual. Pero, ¿cómo obtener la ruta completa de otro búfer por su número?

¿Existe tal función/comando en VIM?

Quiero explicar cómo llegué a esta pregunta...

Había 2 buffers abiertos. El primero era un archivo XML en la ventana izquierda y el otro era un archivo XSD en la ventana derecha. Los edité a ambos. Durante la edición quería validar el XML con el esquema.

Sin embargo el comando

!xmllint --schema /tmp/schema.xsd %

Por supuesto, funcionó bien sólo si el búfer actual era el que tenía el XML. Entonces tenía curiosidad sobre si sería posible reemplazarlo /tmp/schema.xsdcon algún comando o llamada de función que determinara la ruta completa por el número de búfer. Algo como:

!xmllint --schema getBufferPath(3) %

Respuesta1

Puedes utilizar la expand()llamada. Por ejemplo

:echo expand("#2:p")

Imprimirá la ruta completa del archivo en el búfer n.° 2; puede enumerar todos los búferes con:ls

Puede utilizar otros modificadores y otras palabras clave (para ver la página de información completa, consulte :help expand())

Aquí hay un breve extracto:

           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:

información relacionada