バッファのファイルパスを取得するにはどうすればいいですか?

バッファのファイルパスを取得するにはどうすればいいですか?

レジスタ % に現在のバッファのフルパスが含まれていることはわかっています。しかし、別のバッファのフルパスをその番号で取得するにはどうすればよいでしょうか?

VIM にはそのような機能/コマンドはありますか?

なぜこの疑問に至ったのか説明したいと思います。

2 つのバッファが開いていました。1 つ目は左のウィンドウの XML ファイルで、もう 1 つは右のウィンドウの XSD ファイルでした。私はその両方を編集しました。編集中に、スキーマに対して XML を検証したいと考えました。

しかし、コマンド

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

もちろん、現在のバッファが XML を含むバッファである場合にのみうまく機能します。そこで、バッファ番号によって完全なパスを決定するコマンドまたは関数呼び出しに置き換えることができるかどうか興味がありました/tmp/schema.xsd。次のようなものです。

!xmllint --schema getBufferPath(3) %

答え1

通話を使うこともできますexpand()。例えば

:echo expand("#2:p")

バッファ#2のファイルのフルパスを出力します。すべてのバッファをリストするには、:ls

他の修飾語や他のキーワードを使用することもできます(完全な情報ページについては をご覧ください:help expand()

以下は抜粋です:

           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:

関連情報