viml语言基础
viml是为Vim编辑器编写扩展而创建的一门脚本语言.
变量
有效变量名
由ASCII字符, 数字, 或下划线组成,但是变量名不能够一数字开始
变量类型
- b: 在单一Vim缓冲区里被辨识的变量
- w: 在单一Vim窗口里被辨识的变量
- t: 在单一Vim标签里被辨识的变量
- g: 全局变量
- l: 在函数内被辨识的变量(局部变量)
- s: 在Vim脚本里面被辨识的变量
- a: 函数的参数
- v: Vim变量 – 由Vim控制(全局变量)
注意: 如果不以前缀定义Vim变量的作用域,当变量定义在函数外时,默认为全局变量(g:), 定义在函数内时,默认是局部变量(l:).
变量赋值
1 | let g:var = "value" |
删除变量
1 | unlet g:var |
当一个脚本结束时,他使用的局部变量(s:var
)并不会自动删除,下一次脚本被执行时,仍然有效, 例:
1 | if !exists("s:call_count") |
字符串常量和变量
使用字符串常量为字符串变量赋值
1 | let name = "peter" |
控制语句
条件语句
1 | if &term == 'xterm' |
- 对数值和字符串可以进行逻辑操作,俩个字符串的算术差被用来进行比较;
- 字符串与数值进行比较时,字符串会被转换成一个数值,当字符串看起来不是一个数值时,会被转换为0;
1 | if 0 == 'one' |
- 对于字符串匹配有俩种模式:
- a =~ b 匹配
- a !~ b 不匹配
- 左边的
a
被当作一个字符串,b
被当作一个匹配模式, 就如string里面的find操作一样 - 字符串比较与匹配中的大小写问题
#
表示大小写敏感- ‘?’ 表示忽略大小写
- 更多的字符串操作请:h expr4
- 更多的字符串匹配请:h pattern-searches
1 | if str =~ " " |
注意: 在匹配模式下多使用单引号
, 因为正则表达式中有很多反斜杠
, 而反斜杠
在双引号
中必须写俩次才有效.
循环语句
continue
跳出本次循环break
跳出循环(所有循环)
1 | " while 语句 |
表达式
表达式语法
详细的表达式语法请:h expression-syntax
执行表达式
用
:execute
执行一个表达式, 但是只能执行冒号命令,例如根据时间改变配色的示例:1
2
3
4
5
6
7
8
9let color_scheme = 'desert'
if strftime('%H') < 12
let color_scheme = 'molokai'
elseif strftime('%H') < 18
let color_scheme = 'winter'
else
let color_scheme = 'solarzied'
endif
execute 'colorscheme ' . color_schemenormal
执行普通模式命令,但只能按表面意义解释,不能是表达式,比如将上面的代码中的execute改成normal,就没效果常用形式:
:normal gg=G
- 为了使
normal
命令也可以带表达式, 可以将execute
连起来使用,如::execute 'normal '. normal_command
必须确保
:normal
的参数是一个完整的命令,否则,Vim碰到参数的结尾就会终止运行, 如: 在当前行插入new text::execute "normal Inew text \<ESC>"
注意: 使用了特殊字符\<ESC
, 避免在在脚本中输入真正的字符. 不想执行表达式, 指向获取结果, 可以使用eval()函数, 作为表达式计算的结果.
1 | let optname = 'path' |
函数
定义函数
- 函数名必须以大写开头
- 形式如下:
1 | function funcname(var1, var2, var3) |
- 如果重定义一个已经存在的函数, 可以在function后面加
!
, 如:function! Min(num1, num2, num3)
- 定义函数的时候习惯性的加个
!
是个好习惯
调用函数
- 通过
call
调用函数:
1 | let line = getline('.') |
- 上面的代码相当于命令行:
:substitute/\a/*/g
带范围的函数
call
命令可以带一个行表示的范围, 这可以分为俩种情况:- 有
range
关键字, 调用这样的函数时,会自动传给a:firstline和a:lastline来个参数,例如:
1 | function CountWords() range |
可以通过:10, 30call CountWords()
调用上面的函数
- 不带有
range
关键字, Vim将把光标移动到范围内的每一行,然后调用该函数,如:
1 | function Number() |
可以通过:10, 15call Number()
调用上面的函数
可变参数的函数
- Vim允许你定义参数个数可变的函数, a:0代表参数个数, a:000代表可选参数的list, a:1, a:2 代表可选参数,如下:
1 | function Show(start, ...) |
函数清单
- 通过
:function
可以列出用户所有自定义函数及其参数 - 通过
:function 函数名
查看函数定义
删除函数
:delfunction 函数名-> :delfunction Show
函数引用
- 类似与
c语言
中的函数指针
, Vim可以使用function(函数名)
将函数转换为引用,如:
1 | let result = 0 |
- 保存函数引用的变量必须以大写开头, 不然和内建函数的名字会引起混淆, call的第一个参数是引用, 第二个是函数参数的列表
- 和字典组合使用函数引用时最常用