vim 内置函数

阅读更多

1 平台API的重要性

要使用任何一门语言写出点真正有用的程序来,都离不开平台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编写的函数。

 

2 Vim平台内建API分类介绍

vim提供的近300个内建函数,从功能上可以分为几个大类。

2.1 字符串操作类

(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类似,只是这个函数不打印,而是返回格式化后的字符串。

下面 给出个小例子,试验试验。

 

[plain]  view plain  copy
 
  1. echo nr2char(65)  
  2. echo char2nr('ABC')  
  3. echo str2nr('0x12', 16)  
  4. echo str2nr('0x12')  
  5. echo str2float('23.2221')  
  6. echo printf('%d, %s, %f', 10, '张三', 98.3)  


结果为:

 

 

[plain]  view plain  copy
 
  1. A  
  2. 65  
  3. 18  
  4. 0  
  5. 23.2221  
  6. 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} )

把小写字母转换为大写字母。

 

下面测试一下:

 

[plain]  view plain  copy
 
  1. let str = "Hello, VimScript!"  
  2. echo tolower(str)  
  3. echo toupper(str)  
  4. echo tr(str, 'eo', 'EO')  
  5.   
  6. echo escape(str, 'Vim')  
  7. echo shellescape(str)  
  8. echo fnameescape('/usr/share/file name.txt')  
  9.   
  10. let str = nr2char(10)  " 不可打印字符  
  11. echo  strtrans(str)  


运行结果:

 

 

[plain]  view plain  copy
 
  1. hello, vimscript!  
  2. HELLO, VIMSCRIPT!  
  3. HEllO, VimScript!  
  4. Hello, \V\i\mScr\ipt!  
  5. 'Hello, VimScript!'  
  6. /usr/share/file\ name.txt  
  7. ^@  


(13)match( {expr}, {pat}[, {start} [, {count}]] }

 

找到匹配位置索引值,并返回这个值。{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"。(正则表达式的反向引用)

 

这四个函数是对正则表达式的支持。下面给出例子:

 

 

[plain]  view plain  copy
 
  1. let str = "Hello, VimScript!"  
  2. let pat = 'V.m'  
  3. echo match(str, pat)  
  4. echo matchend(str, pat)  
  5. echo matchstr(str, pat)  
  6. echo matchlist(str, pat)  


运行结果:

 

 

[plain]  view plain  copy
 
  1. 7  
  2. 10  
  3. Vim  
  4. ['Vim', 'i', '', '', '', '', '', '', '', '']  



(17)stridx( {haystack}, {needle} [, {start}] )

 

查找 第一个匹配的子串,返回字串瘦子符索引。类似于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()。

 

这几个函数是基本的字符串操作函数,示例如下:

 

[plain]  view plain  copy
 
  1. let str = "Hello, VimScript!"  
  2. echo stridx(str, 'i')  
  3. echo strridx(str, 'i')  
  4. echo strlen(str)  
  5. echo substitute(str, 'Vim', 'VIM', "")  
  6. echo strpart(str, 3, 2)  


运行结果:

 

 

[plain]  view plain  copy
 
  1. 8  
  2. 13  
  3. 17  
  4. Hello, VIMScript!  
  5. lo  


(23)expand( {expr} [, {flag}] )

 

把字符串中的特殊元字符展开后返回。

(24)iconv( {expr}, {from}, {to} )

字符串字符集转换。如从UTF-8转为latin1.

(25)byteidx( {expr}, {nr})

返回第nr个字符的开始字节索引。对于单字节编码的ASCII来说,返回值为nr,对于多字节字符集才有价值。

(26)repeat( {expr}, {count})

把一个字符串复制多个后返回。

 

这几个大概与字符编码有关:

 

[plain]  view plain  copy
 
  1. let str = "%"  
  2. echo expand(str)  
  3.   
  4. let str = '张三'  
  5. echo strlen(str)  
  6. echo strlen(iconv(str, 'UTF-8', 'latin1'))  
  7.   
  8. echo byteidx(str, 1)  
  9. echo repeat(str, 3)  

运行结果:

 

 

[plain]  view plain  copy
 
  1. t4.vim  
  2. 6  
  3. 4  
  4. 3  
  5. 张三张三张三  

 

(27)eval( {string} )

把一个数据的描述字符串,转为数据自身。

(28)string( {expr})

返回一个数据的描述字符串。

这两个函数作用正好相反,类似于数据的序列化和反序列化。

示例如下:

 

[plain]  view plain  copy
 
  1. unlet! v  
  2. let str =  string([1,2,3])  
  3. let v = eval(str)  
  4. echo str  
  5. echo type(v)  
  6.   
  7. unlet v  
  8. let str = string(2.338)  
  9. let v = eval(str)  
  10. echo str  
  11. echo type(v)  
  12.   
  13. unlet v  
  14. let str = string('hello')  
  15. let v = eval(str)  
  16. echo str  
  17. echo type(v)  


结果如下:

 

 

[plain]  view plain  copy
 
  1. [1, 2, 3]  
  2. 3  
  3. 2.338  
  4. 5  
  5. 'hello'  
  6. 1  

你可能感兴趣的:(vim 内置函数)