使用脚本语言,可以更灵活地定制编辑器以完成复杂的任务。
定义变量
使用以下命令,可以为变量赋值:
:let {variable}={expression}
Vim中的变量名可以包含字符、数字和下划线,但必须以字符或是下划线开头。
例如使用以下命令,定义变量line_size:
:let line_size=30
使用:echo命令,可以查看变量的内容:
:echo "line_size is"line_size
命令执行以后,Vim将会在屏幕底部显示如下内容:
line_size is 30
变量类型
Vim使用特殊的前缀来指明不同的变量类型和范围:
变量名 | 用途 |
---|---|
大写字母,数字,下划线 | 可以存放在viminfo文件中的变量(如果viminfo选项中含有!标记) |
大写字母开头 | 变量可以由:makesession命令保存 |
小写字母,数字,下划线 | 不会存在任何保存文件中的变量 |
$environment | 环境变量 |
@register | 文本寄存器 |
&option | 选项名字 |
b:name | 当前缓冲区的变量 |
w:name | 当前窗口的变量 |
g:name | 全局变量(用于函数内部表明全局变量) |
a:name | 函数参数 |
v:name | Vim预定义内部全局变量 |
l:name | 当前函数的变量 |
s:name | 使用:source载入的脚本中有效的变量 |
t:name | 当前标签页的变量 |
使用以下命令,可以定义环境变量$PAGER,用于指明查看的命令:
:let $PAGER="/usr/local/bin/less"
使用以下命令,可以显示上一次查找的模式:
:echo "Last search was"@/
使用以下任一命令,都可以设置缩进选项:
:let &autoindent=1
:set autoindent
使用以下命令,可以指定当前缓冲区的语法高亮显示:
:let b:current_syntax=c
Vim使用以下内部变量(v:name)存储相关信息:
变量 | 用途 |
---|---|
v:count | 上一次常规模式命令所指定的数量 |
v:count1 | 与v:count相类似,所不同的是如果没有指定数量则默认值为1 |
v:errmsg | 上一次的错误信息 |
v:warningmsg | 上一次的警告信息 |
v:statusmsg | 上一次的状态信息 |
v:shell_error | 上一次Shell命令的结果。如果为0,则命令正常执行;若为非0,则命令失败 |
v:this_session | 上一次装入或是保存的文件的命名 |
v:version | Vim编辑器的版本号 |
以下为不同类型变量的实例:
删除变量
如果要删除一个变量,那么可以使用以下命令:
:unlet[!] {name}
如果试图删除一个不存在的变量,那么Vim就会报错;而如果使用!标记,则不会显示错误信息。
定义常量
数字常量有以下三种:
Vim可以处理多种格式数字的计算:
:echo 10 + 0x0A + 012
字符常量有以下两种:
在双引号包围的字符串内,可以使用反斜线进行转义;而被单引号包围的字符串,则会被原样输出:
命令 | 输出 |
---|---|
:echo "\100" | @ |
:echo '\100' | \100 |
算术运算
Vim可以使用以下算术运算符,进行表达式计算:
int+int | 加 |
int-int | 减 |
int*int | 乘 |
int/int | 除 |
int%int | 取余 |
-int | 取负 |
逻辑判断
逻辑运算符可以作用于字符串和整数,Vim将自动在这两种数据类型之间进行转换。如果比较成功则返回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选项;(==?)对应忽略大小写;(==#)则对应大小写敏感。
文件名
当我们输入文件名时,可以使用以下特殊符号:
% | 当前文件名 |
# | 交换文件名(Alternate filename) |
<cword> | 光标下的word |
<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? | 将第一次出现的from字符串改变为to字符串 |
:gs?from?to? | 将所有的字符串from改变为to字符串 |
使用以下命令,可以利用:p修饰符显示完整的当前文件名。你可以将命令中的:p换成其他需要测试的修饰符。
:echo expand("%:p")