Я знаю, что регистр % содержит полный путь текущего буфера. Но как получить полный путь другого буфера по его номеру?
Есть ли такая функция/команда в VIM?
Я хочу объяснить, как я пришел к этому вопросу...
Было открыто 2 буфера. Первый был XML-файлом в левом окне, а второй был 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: