我知道寄存器 % 包含当前缓冲区的完整路径。但是如何通过缓冲区的编号获取另一个缓冲区的完整路径呢?
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: