Vim编辑器有着丰富的脚本语言.当我们要为特殊的任务而定制我们的编辑器时,这些命令语言就会给我们极大的灵活性.
Vim编辑器允许我们定义,设置和使用自己的变量.为变量设定一个值,我们可以使用:let命令.这个命令的一般形式如下:
:let {variable}={expression}
Vim编辑器采用大多数程序设计语言的变量命名方式,也就是在Vim中的变量是以字符或是下划线开头,由一系列的字符,数字或是下划线组成的.
例如要定义变量line_size,我们可以用下面的命令:
:let line_size=30
要查看变量的内容,我们可以使用:echo命令.如:
:echo "line_size is"line_size
当我们执行了这样的命令以后,Vim就会在最后一行显示如下的内容:
line_size is 30
变量也可以包含数字和字符串,如:
:let my_name="mylxiaoyi"
Vim编辑器使用特殊的前缀来指明不同有变量类型.这些前缀如下:
大写字母,数字,下划线 可以存放在viminfo文件中的变量.如果viminfo选项中含有!标记,变量可以由:makesession命令保存.
小写字母,数字,下划线 不会存在任何保存文件中的变量.
$environment 环境变量
@register 文本寄存器
&option 选项名字
b:name 当前缓冲区的变量.每一个缓冲区有这个变量值不同
w:name 当前窗口的变量
g:name 全局变量(用于函数内部表明全局变量)
a:name 函数参数
v:name Vim内部变量
如下面的一些例子:
环境变量$PAGE包含用页查看命令:
:let $PAGE="/usr/local/bin/less"
显示上一次查找的类型:
:echo "Last search was"@/
下面的两个命令有着同样的作用:
:let &autoindent=1
:set autoindent
为当前缓冲区定义语法:
:let b:current_syntax=c
内部变量(v:name)用于存放信息.如下面的内部变量列表:
v:count 为上一次正常模式命令所指定的数量(count)
v:count1 与v:count相类似,所不同的只是如果没有指定数量则默认值为1
v:errmsg 上一次的错误信息
v:warningmsg 上一次的警告信息
v:statusmsg 上一次的状态信息
v:shell_error 上一次Shell命令的结果.如果为0,则命令正常执行,若为非0,则失败
v:this_session 上一次装入或是保存的文件的命名
v:version Vim编辑器的版本号
Vim编辑器还要使用如下的一些常量:
123 简单整数
0123 十进制整数
0xAC 十六进制整数
如下的字符串常量
"string" 简单字符串
'string' 精确字符
这两种字符串的不同在于前者可以用反斜线进行转义字符的扩展,而后者则不成,在后者的字符串反斜线只是原样输出.例如下面的命令:
:echo ">\100<"
:echo '>\100<'
其输出结果分别为:
>@<
>\100<
在Vim编辑器中我们还可以用表达式进行整数的操作.这些操作包括如下的算术运算:
int+int 加
int-int 减
int*int 乘
int/int 除
int%int 取余
-int 取负
另外逻辑运算符可以作用于字符串和整数.如果比较成功则返回1,否则则返回0.如下面的比较:
var == var 检查是否相等
var != var 不等
var < var 小于
var > var 大于
var <= var 小于等于
var >= var 大于等于
另外比较运算符可以进行字符串和表达式的比较.例如下面进行指定的字符串("word")和表过式"\w*"比较,如果表达式匹配则返回1.
"word"=~"\w*"
例如下面的两个常规表达式的比较:
string =~ regexp 相匹配的常规表达式
string !~ regexp 两个表达式不匹配
另外字符串还有下面的特殊比较:
string ==? string 字符串相等,忽略大小写
string ==# string 字符串相等,大小写必须匹配
string !=? string 字符串不相等,忽略大小写
string !=# string 字符串不相等,大小写必须匹配
string <? string 小于,忽略大小写
string <# string 小于,大小写必须匹配
string <=? string 小于等于,忽略大小写
string <=# string 小于等于,大小写必须匹配
string >? string 大于,忽略大小写
string ># string 大于,大小写必须匹配
string >=? string 大于等于,忽略大小写
string >=# string 大于等于,大小写必须匹配
从这里我们可以看到每一个运算符有三种形式.基本形式(==)对应ignorecase选项.?(==?)忽略大小写的不同而#(==#)从不忽略这样的区别.
如果我们要删除一个变量,我们可以用下面的命令:
:unlet[!] {name}
在通常的情况下如果我们删除一个不存大的变量,Vim编辑器就会显示错误.而如果我们使用!,则不会显示错误信息.
当我们要输入文件名时,我们可以使用下面的一些特殊的单词或是符号:
% 当前文件名
# 交换文件名
<cword> 光标下的单词
<cWORD> 光标下的WORD
<cfile> 光标下的文件名
<afile> 当执行相关的自动命令(autocommand)正读入或是写入的文件名.
<abuf> 在一个自动命令中的当前缓冲区标号
<amatch>与<abuf>相类似.但是当在FileType或是Syntax事件中使用时并不是文件名,而文件类型或是语法名.
<sfile> 当前正用于:sourced的文件名.
我们可以用下面所列出的内容来修改这些单词或是符号.例如:p可以将文件名变为全名.例如光标下的文件名为test.c,<cfile>就将是test.c,而同是<cfile:p>就将成为/home/oualline/examples/test.c
我们可以用下面的内容进行修改:
:p
将文件名变成全路径文件名.但是我们要注意的是当我们用多个修饰符时,我们要个放在第一个.
:~
将全路径名/home/oualline/examples/test.c变为用~标记的文件名为,如~oualline/examples/test.c
:. 如果可能将成为当前目录相关的目录
:h 文件名的头部.例如../path/test.c就会为../path
:t 文件名的尾部.例如../path/test.c就会为test.c
:r 无扩展名的文件名.例如../path/test就会成为test
:e 扩展名
:s?from?to? 将第一次出现的form字符串改变为to字符串
:gs?from?to? 将所有的字符串form改变为to字符串
我们可以来看一下这些修饰符是如何作用在文件名上的.首先我们要先创建一个文件,其内