Vim脚本编写入门

入门案例:

  • 冒号: 字符非必须,只有键入命令时需要,编写Vim脚本时可以省略
    1
    2
    3
    4
    5
    :let i = 1
    :while i < 5
    : echo "Hello,World!" i
    : let i += 1
    :endwhile

1.变量

  • 定义变量 :let
    :let {变量} = {表达式}
    表达式类型

  • ==vim脚本变量类型有9种==

数值 32位或64位带符号整数。
64-位整数只有在编译时带 +num64 特性时才有效。
示例: -123 0x10 0177 0b1011
浮点数 带小数的数值。
{仅当编译时加入 +float 特性才有效}
示例: 123.456 1.15e-6 -1.1e3
字符串
列表 项目的有序的序列。
示例: [1, 2, [‘a’, ‘b’]]
字典 关联数组:每个项目包含一个键和一个值
示例: {‘blue’: “#0000ff”, ‘red’: “#ff0000”}
函数引用 指向一个函数的引用
示例: function(“strlen”)
特殊 v:false 、 v:true 、 v:none 和 v:null 。
工作 用于作业
通道 用于通道
数值和字符串类型之间会根据使用的情况自动转换
列表、字典、函数引用、作业和通道类型不会自动进行转换。

变量有不同的命名空间,根据附加的前缀决定:

(无) 函数内: 局部于函数;否则: 全局
buffer-variable b: 局部于当前缓冲区。
window-variable w: 局部于当前窗口。
tabpage-variable t: 局部于当前标签页。
global-variable g: 全局。
local-variable l: 局部于函数。
script-variable s: 局部于 :source 的 Vim 脚本。
function-argument a: 函数参数 (只限于函数内使用)。
vim-variable v: Vim 预定义的全局变量

删除变量 :unlet
:unlet {变量}

例如:unlet s:count,这将删除count局部变量并释放其占用的内存。如果不确定这个变量是否存在,又不希望看到系统在它不存在时报错,可以在命令后面加!,即:unlet! s:count

2. 表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
expr2 ? expr1 : expr1   if-then-else
expr3 || expr3 .. 逻辑或
expr4 && expr4 .. 逻辑与
expr5 == expr5 等于
expr5 != expr5 不等于
expr5 > expr5 大于
expr5 >= expr5 大于等于
expr5 < expr5 小于
expr5 <= expr5 小于等于
expr5 =~ expr5 匹配正规表达式
expr5 !~ expr5 不匹配正规表达式
expr5 ==? expr5 等于,忽略大小写
expr5 ==# expr5 等于,匹配大小写
等等 如上,? 忽略大小写,# 则匹配之
expr5 is expr5 相同的 List 实例
expr5 isnot expr5 不同的 List 实例
**算术**
expr6 + expr6 .. 数值加法或列表连接
expr6 - expr6 .. 数值减法
expr6 . expr6 .. 字符串连接
expr7 * expr7 .. 数值乘法
expr7 / expr7 .. 数值除法
expr7 % expr7 .. 数值求余
! expr7 逻辑非
- expr7 一元减法: 取反
+ expr7 一元加法: 原值
expr8[expr1] 字符串里的字节或者 List 的项目
expr8[expr1 : expr1] 字符串子串或 List 的子列表
expr8.name Dictionary 的项目
expr8(expr1, ...) 使用 Funcref 变量的函数调用

"string" 字符串常数,反斜杠有特殊含义
'string' 字符串常数,' 加倍
[expr1, ...] List
{expr1: expr1, ...} Dictionary
&option 选项值
(expr1) 嵌套表达式
variable 内部变量
va{ria}ble 带花括号的内部变量
$VAR 环境变量
@r 寄存器 'r' 的值
function(expr1, ...) 函数调用
func{ti}on(expr1, ...) 带花括号的函数调用
{args -> expr1} 匿名函数表达式
".." 标明这一层上的操作可以连接。比如:
&nu || &list && &shell == "csh"
同一层的表达式从左到右进行分析。

3.语句

:if

单分支:
:if 表达式
代码块
:endif
双分支:
:if 表达式
代码块
:else
代码块2
:endif
多分支:
:if 表达式1
代码块
:elseif 表达式2
代码块2
:else
代码块3
:endif

:while

:while 表达式
    代码块
:endwhile

:for

:for {var} in {list}
    循环代码块
:endfor
:for [{var1},{var2},...] in {listlist}
    循环代码块
:endfor

:continue 跳回while循环的开始;继续循环。在 “:while” 或 “:for” 循环的内部,跳回循环开始的地方。
:break 跳至:endwhile;循环结束 。在 “:while” 或 “:for” 循环的内部,跳到相匹配的 “:endwhile” 或 “:endfor” 之后的命令。

执行单个表达式

执行一个vim命令行命令
:execute “vim命令” . 参数
参数可以是变量,如果不是变量,必须单引号引起来
例如::execute “! “. ‘ls -la’
执行一个普通模式命令(快捷操作)
参数不能是表达式,可以和:execute 配合使用来带参数
:normal vim命令
例如::normal gt

使用函数

一个函数可以被:call命令调用,参数列表要用括号括起来,并用逗号分割
:call search(“Date:”,”W”)

自定义函数

:function {name}({var1}, {var2}, ...)
    {函数体}
:endfunction
# 函数名必须以大写字母开始
# 要重定义一个已经存在的函数,在 "function" 命令后加上 !
# echo 可以输出函数结果 echo 函数

引文