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

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)

结果为:

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
^@

(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)

运行结果:

7
10
Vim
['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)

运行结果:

8
13
17
Hello, 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.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




你可能感兴趣的:(Linux相关,脚本语言)