vim提供很多内置函数,expand就是其中之一
不多说,先上文档介绍
expand({expr} [,{nosuf} [, {list}]]) expand()
扩展{expr}里的通配符和下列关键字。
'wildgnorecase' 此处适用。
如果给出{list}且为TRUE,返回列表。否则返回的是字符串,且如果返回多个匹配,以<NL>字符分隔[备注:5.0版本适用空格。但是文件名如果也包含空格就会有问题]。
如果扩展失败,返回空字符串。如果{expr}以'%','#'或'<'开始,不返回不存在的文件名。详见下。
如果{expr}以'%'、‘#’、或‘<’开始,类似于cmdline-special变量的方式扩展,扩宝相关的修饰符。这里是一个简短的小结:
% 当前文件名
# 交换文件名
#n 交换文件名n
<cfile> 光标所在的文件名(其实就是光标所在的一个字符串的名)
<afile> 自动命令文件名(当expand在自动命令中执行的时候,扩展为自动命令所在的文件的文件名)
<abuf> 自动命令的缓冲区号(当expand在指定命令中执行的时候,扩展为自动命令的缓冲区号)
<amatch> 自动命令匹配的名字(绝对路径下的文件名)
<sfile> 脚本文件名或者函数名(在脚本中扩展为脚本文件名,在函数中,扩展为函数名)
<slnum> 脚本文件的行号(当expand(‘<slnum>’)在某一行,就扩展为那一行的行号)
<cword> 扩展为光标所在的单词
<cWORD> 扩展为光标所在的字符串(比cword扩展的更多)
<client> 最近收到的消息的值
修饰符:
:p 扩展为完整的路径
:h 去掉最后一个部分
:t 只保留最后一个部分
:r 根部(去掉扩展名)
:e 只有扩展名
如下例子:
72 let s:filename=expand('<cfile>')
73 let s:afile=expand('<afile>')
74 let s:abuf=expand('<abuf>')
75 let s:amatch=expand('<amatch>')
76 function! youcompleteme#test()
77 echo s:script_folder_path
78 echo s:filename
79 echo s:afile
80 echo s:abuf
81 echo s:amatch
82 echo expand('<sfile>:p')
83 echo expand('%')
84 endfunction
输出:
/root/.vim/bundle/YouCompleteMe/autoload
echo
youcompleteme.vim
1
/root/.vim/bundle/YouCompleteMe/autoload/youcompleteme.vim
/root/.vim/bundle/YouCompleteMe/autoload/function youcompleteme#test
youcompleteme.vim
我们看到对于<>这种扩展,通常只会返回被引用的文件名,而不会进一步扩展。
对于%和#,如果文件名不存在,则返回空字符串。
对于不以%、#和<开头,则以命令行文件名那样扩展。使用'suffixes'和'wildignore'。除非给出可选的{nosuf}参数而且为TRUE.
可以有不存在的文件的名字。
例如:echo expand("**/README") 扩展当前目录及子目录下所有的“README”(**用于匹配所有目录,通配符)
expand()还可以用来扩展变量和只有shell知道的环境变量。
例如:echo expand('$FOOBAR') 如果FOOBAR这个环境变量存在,则扩展为其值;如果不存在就直接扩展为FOOBAR。
这里的#目前还不知道具体能做什么,应该是用于扩展交换文件用,不常用。