要使用任何一门语言写出点真正有用的程序来,都离不开平台API的调用。使用C/C++开发Windows程序需要大量调用Win32API,开发Linux程序需要大量调用Linux API,开发Java程序,需要调用使用Java封装好的平台API。API大体上分为两种,一种是以函数的形式体现,如Win32API, Linux API, Socket API等,另一种则是以类的形式体现,供面向对象的语言使用。也有混合的,如PHP的平台库中既有函数,又有类。
对于VimScript来说,其底层平台就是vim,API的形式是函数库。vim 7.3版本提供了近300个内建函数供用户使用,要想轻松的操控vim,必须熟练掌握常用的内置函数。不要重复实现与内置函数相同功能的函数,因为内置函数是C编写的编译好的二进制代码,执行速度远远高于VimScript编写的函数。
vim提供的近300个内建函数,从功能上可以分为几个大类。
(1)nr2char({expr})
number to char。返回一个作为ASCII码的值(整数)对应的字符串。
(2)char2nr({expr})
char to number。返回一个字符串的首字母的ASCII码值。
(3)str2nr( {expr} [, {base}] )
string to number。把一个字符串转换为整数,参数base是进制数,可以是8,10,16。如果不提供base参数,那么默认按照10进制转换。这与字符串到整数的自动转换不同。自动转换会根据字符串的前缀自动判别进制数。
(4)str2float( {expr} )
string to float。把一个字符串转换为浮点数。
(5)printf( {fmt}, {expr1} ...)
格式化,返回格式化后的字符串,而不是打印出来。与C版本的printf类似,只是这个函数不打印,而是返回格式化后的字符串。
下面 给出个小例子,试验试验。
echo nr2char(65)
echo char2nr('ABC')
echo str2nr('0x12', 16)
echo str2nr('0x12')
echo str2float('23.2221')
echo printf('%d, %s, %f', 10, '张三', 98.3)
A
65
18
0
23.2221
10, 张三, 98.300000
(6)escape( {string}, {chars} )
如果string中存在chars中任意一个字符,则使用\对这个字符进行转义,然后返回处理过的字符串。
(7)shellescape( {string}, [, {special}] )
对string中出现的特殊字符进行转义,以满足操作系统shell要求的格式。
(8)fnameescape( {string} )
对指定的文件名string进行转义,主要是对里面的%等在vim中是特殊字符的字符进行转义。
(9)tr( {src}, {fromstr}, {tostr} )
对src中出现的formstr中的字符,按照位置对应关系替换为tostr中的字符。
(10)strtrans( {expr} )
对字符串中的不可打印字符转换为可打印字符后返回。
(11)tolower( {expr} )
把大写字母转换为小写字母。
(12)toupper( {expr} )
把小写字母转换为大写字母。
下面测试一下:
let str = "Hello, VimScript!"
echo tolower(str)
echo toupper(str)
echo tr(str, 'eo', 'EO')
echo escape(str, 'Vim')
echo shellescape(str)
echo fnameescape('/usr/share/file name.txt')
let str = nr2char(10) " 不可打印字符
echo strtrans(str)
hello, vimscript!
HELLO, VIMSCRIPT!
HEllO, VimScript!
Hello, \V\i\mScr\ipt!
'Hello, VimScript!'
/usr/share/file\ name.txt
^@
找到匹配位置索引值,并返回这个值。{expr}可以是两种数据类型,一是String,此时返回开始匹配模式d第一个字符的索引;而是List类型,每个元素都是String,此时返回的是匹配模式的那个字符串元素在List中的索引。如果没有找到匹配项,则返回-1。
(14)matchend( {expr}, {pat}[, {start} [, {count}]] }
与match相同,只是返回的不是匹配的开始索引,而是返回匹配后面的索引。
(15)matchstr( {expr}, {pat}[, {start} [, {count}]] }
与match相同,只是返回的是匹配的字符串。如果没有匹配则返回空字符串。
(16)matchlist( {expr}, {pat}[, {start} [, {count}]] }
与matchstr相同,只是返回的是一个List,第一个元素是匹配的字符串,后面d元素是匹配的子串,如“\1”,“\2"。(正则表达式的反向引用)
这四个函数是对正则表达式的支持。下面给出例子:
let str = "Hello, VimScript!"
let pat = 'V\(.\)m'
echo match(str, pat)
echo matchend(str, pat)
echo matchstr(str, pat)
echo matchlist(str, pat)
7
10
Vim
['Vim', 'i', '', '', '', '', '', '', '', '']
查找 第一个匹配的子串,返回字串瘦子符索引。类似于C#中的String.IndexOf()。
(18)strridex( {haystack}, {needle} [, {start}] )
反向查找第一个匹配的字符串。
(19)strlen( {expr} )
返回给定字符串的长度,以字节为单位。
(20)substitute( {expr}, {pat}, {sub}, {flags})
字符串替换,与命令:substitute类似。
(21)submatch( {nr} )
子匹配。相当于正则表达式中的反向引用。只能用在:substitute命令的参数中。
(22)strpart( {src}, {start} [, {len}] )
返回字符串的子串。类似于其他语言中的substr()。
这几个函数是基本的字符串操作函数,示例如下:
let str = "Hello, VimScript!"
echo stridx(str, 'i')
echo strridx(str, 'i')
echo strlen(str)
echo substitute(str, 'Vim', 'VIM', "")
echo strpart(str, 3, 2)
8
13
17
Hello, VIMScript!
lo
把字符串中的特殊元字符展开后返回。
(24)iconv( {expr}, {from}, {to} )
字符串字符集转换。如从UTF-8转为latin1.
(25)byteidx( {expr}, {nr})
返回第nr个字符的开始字节索引。对于单字节编码的ASCII来说,返回值为nr,对于多字节字符集才有价值。
(26)repeat( {expr}, {count})
把一个字符串复制多个后返回。
这几个大概与字符编码有关:
let str = "%"
echo expand(str)
let str = '张三'
echo strlen(str)
echo strlen(iconv(str, 'UTF-8', 'latin1'))
echo byteidx(str, 1)
echo repeat(str, 3)
运行结果:
t4.vim
6
4
3
张三张三张三
(27)eval( {string} )
把一个数据的描述字符串,转为数据自身。
(28)string( {expr})
返回一个数据的描述字符串。
这两个函数作用正好相反,类似于数据的序列化和反序列化。
示例如下:
unlet! v
let str = string([1,2,3])
let v = eval(str)
echo str
echo type(v)
unlet v
let str = string(2.338)
let v = eval(str)
echo str
echo type(v)
unlet v
let str = string('hello')
let v = eval(str)
echo str
echo type(v)
[1, 2, 3]
3
2.338
5
'hello'
1