转)vimscript in 5 minus

转)vimscript in 5 minus

学习 vimscript 理解原生 vim 的配置方法,Reference:

Variables

  • let 命令用来给变量赋值
  • unset 用来删除一个变量;unset!删除变量,忽略变量不存在的提示

函数体外初始化的定义是全局变量,函数体内的是局部变量,但是我们可以用let来指定变量的作用域

1
2
3
4
5
6
7
8
g:var - 全局
a:var - 函数参数
l:var - 函数局部变量
b:var - buffer 局部变量
w:var - window 局部变量
t:var - tab 局部变量
s:var - 当前脚本内可见的局部变量
v:var - Vim 预定义的内部变量

可以用$name的模式来读取或者改写环境变量,同时用&option的方式读取vim内部设置的值。

数据类型

number-}int, Float, String
Funcref 函数引用,函数引用类型的变量名必须以大写字母开头

1
2
:let Fun1 = function("strlen")
:echo Myfunc('foobar')

List有序列表

1
2
3
4
5
:let mylist = [1, 2, ['a', 'b']]
:echo mylist[0]
1
:echo mylist[2][0]
a

Dictionary 无序的kv容器

1
2
3
4
:let mydict = { "blue": "#0000ff"}
:echo mydict["blue"]

:let mydcit.blue = "BLUE"

没有bool类型,除了0都是true;vim8.1 有boolean类型了。

可以用type(varname)来取得变量的类型

字符串比较

  • {string} == {string} 字符串相等
  • !=
  • {string} =~ {pattern} 匹配pattern
  • {operator}# 匹配大小写
  • {operator}? 不匹配大小写
1
2
3
4
5
6
:function! TrueFalse(arg)
: return a:arg? "true" : "false"
:endfunction

:echo TrueFalse("X start" =~ 'X$')
false

流程控制

条件判断:

1
2
3
4
5
6
7
if {expression}
...
elseif {expression}
...
else
...
endif

循环:

1
2
3
4
for {var} in {list}
continue
break
endfor

for循环:

1
2
3
for [var1, var2] in [[1,2], [3,4]]
"on 1st loop var1 =1 ..."
endfor

while循环:

1
2
while {expression}
endwhile

异常捕获

1
2
3
4
5
6
7
try
...
catch {pattern (optinal)}

finally
...
endtry

函数

使用fucntion关键字定义一个函数,使用function!覆盖一个函数的定义,函数也有作用空间的约束,且函数名必须使用大写字母开头

1
2
3
function! {Name}(args1, arg2, etc)
{function body}
endfunction

delfunction {function} 删除函数

call {function}调用一个函数,函数调用前的call语句是必须的,除非在一个表达式里。

有一种特殊的调用函数的方式,可以指明该函数作用的文本区域是从当前缓冲区的第几行到第几行,按照 “1,3call Foobar() ”的格式调用一个函数的话,该函数会在当前文件的第一行到第三行每一行执行一遍,再这个例子中,该函数总共被执行了三次。

如果你在函数声明的参数列表后添加一个 range 关键字,那函数就只会被调用一次,这时两个名为 a:firstlinea:lastline 的特殊变量可以用在该函数内部使用。

面向对象

Vim 没有原生的类的支持,但是你可以用字典模拟基本的类。为了定义一个类的方法,可以在函数声明时使用 dict 关键字来将内部字典暴露为 self 关键字:

1
2
3
4
let MyClass = {"foo": "Foo"}
function MyClass.printFoo() dict
echo self.foo
endfunction

类的实现更类似于 singleton,为了在 VimScript 中创建类的实例,我们对字典使用 deepcopy()方法进行拷贝(实例化):

1
2
3
4
5
6
:let myinstance = deepcopy(MyClass)
:call myinstance.printFoo()
Foo
:let myinstance.foo = "Bar"
:call myinstance.printFoo()
Bar

Autocmd 自动命令

当事件发生时自动执行命令,一个比较常见的应用场景如:对不同的文件类型使用不同的缩进、折叠、制表方式。

转)vimscript in 5 minus

http://aikenh.cn/cn/vimscript_5minus/

Author

AikenH

Posted on

2022-08-31

Updated on

2023-10-31

Licensed under


Comments