VimScript脚本语言学习------常用的内置函数---(操纵String)

来源:互联网 发布:php支付宝接口开发教程 编辑:程序博客网 时间:2024/05/30 05:25

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

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

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)

结果为:

A6518023.222110, 张三, 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^@

(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"。(正则表达式的反向引用)


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


let str = "Hello, VimScript!"let pat = 'V\(.\)m'echo match(str, pat)echo matchend(str, pat)echo matchstr(str, pat)echo matchlist(str, pat)

运行结果:

710Vim['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()。


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

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)

运行结果:

81317Hello, VIMScript!lo

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

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

(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.vim643张三张三张三

(27)eval( {string} )

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

(28)string( {expr})

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

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

示例如下:

unlet! vlet str =  string([1,2,3])let v = eval(str)echo strecho type(v)unlet vlet str = string(2.338)let v = eval(str)echo strecho type(v)unlet vlet str = string('hello')let v = eval(str)echo strecho type(v)

结果如下:

[1, 2, 3]32.3385'hello'1




0 0
原创粉丝点击