0%

vimscript笔记——1——脚本语言

负责任的编码

代码折叠,e.g.

1
2
3
4
5
6
" Vimscript file settings {{{
augroup filetype_vim
autocmd!
autocmd FileType vim setlocal foldmethod=marker
augroup END
" }}}

变量

e.g.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
" 变量赋值
:let foo = "bar"
""""""""""""""""""""""""""""""""""""
" 选项赋值,不可更改
:set textwidth=80
""""""""""""""""""""""""""""""""""""
" 布尔选项
:set wrap
""""""""""""""""""""""""""""""""""""
" 作为变量的选项
:let &textwidth = 100
:let &textwidth = &textwidth + 10
""""""""""""""""""""""""""""""""""""
" 本地选项
:setlocal number
""""""""""""""""""""""""""""""""""""
" 本地选项作为变量
:let &l:number = 1
""""""""""""""""""""""""""""""""""""
" 作为变量的寄存器,"为未命名寄存器,/为搜索模式寄存器
:let @a = "hello!"

注:在set可以搞定的时候,永远都不要用let,这是因为let更难于阅读。

变量作用域

1
2
3
" b:表示本地作用域变量
:let b:hello = "world"
:echo b:hello

条件语句

对于多行语句可以采用管道|来执行

对于vimscript有如下结论:

  • 如有必要,Vim将强制转换变量(和字面量)的类型。在解析10 + “20foo”时,Vim将把”20foo”转换成一个整数(20)然后加到10上去。
  • 以一个数字开头的字符串会被强制转换成数字,否则会转换成0。
  • 在所有的强制转换完成,当if的判断条件等于非零整数时,Vim会执行if语句体。
1
2
3
4
5
6
7
:if 0
: echom "if"
:elseif "nope!"
: echom "elseif"
:else
: echom "finally!"
:endif

比较

1
2
3
4
5
6
:set ignorecase
:if "foo" == "FOO"
: echom "no, it couldn't be"
:elseif "foo" == "foo"
: echom "this must be the one"
:endif

==的行为取决于用户的设置,这意味着在为别人开发插件时,你不能信任==

==?是无论你怎么设都大小写不敏感

==#是无论你怎么设都大小写敏感

函数

:function meow(),出错,没有作用域限制的vimscript函数必须以一个大写字母开头

函数定义,e.g.

1
2
3
:function Meow()
: echom "Meow!"
:endfunction

函数运行,返回值丢弃,e.g. :call Meow()

在表达式里调用函数,e.g. :echom GetMeow()

函数没有return值时,会隐式返回0

函数参数

在写需要参数的Vimscript函数的时候,你总需要给参数加上前缀a:,来告诉Vim去参数作用域查找。

可变参数,e.g.

1
2
3
4
5
6
7
8
:function Varg2(foo, ...)
: echom a:foo
: echom a:0
: echom a:1
: echo a:000
:endfunction

:call Varg2("a", "b", "c")
  • a:0为额外参数的数量
  • a:1为第一个额外参数,a:2同理
  • a:000为一个包括所有传递过来的额外参数的列表

注意:

  • 不能对参数变量重新赋值
  • 全局变量的访问需要通过g:

数字

两种数值类型:

  • Number
  • Float

echo 5e10,错误,小数点和小数点后的数字是必须要有的

注意,浮点数仅当编译时加入+float特性时才可以使用

字符串

.用来连接字符串,e.g. :echom "Hello, " . "world"

:echom 10 + "10.10",显示20,强制转换"10.10"时,小数点后的内容被丢弃

echom 10 . "foo",显示10foo

echom 10.1 . "foo",错误在连接字符串时不能把Float当作String

注意,有时echom的输出跟echo会有所不同,e.g.

1
2
3
4
:echo "foo\nbar"
" 显示 foo 和 bar 两行
:echom "foo\nbar"
" 显示 ^@ , 这在vim里表示换行符

字符串字面量(无视转义字符串),采用单引号而不是双引号,而两个连续的单引号在字符串字面量里面会显示为一个单引号,不连续会出错

字符串函数

长度,strlen()len()

切割,split(),把字符串切割成列表,以空格为分割界限,也可以指定分隔符,e.g. :echo split("one,two,three",","),显示['one','two','three']

连接,join(),e.g. :echo join(["foo", "bar"], "..."),显示foo...bar

大小写转换,tolower(),变小写;toupper(),变大写

Execute命令

e.g. :execute "rightbelow vsplit " . bufname('#')

Normal命令

把我们的脚本跟日常的文本编辑命令结合起来

normal命令将顾及当前的所有映射

normal!命令将不会顾及当前所有映射

注意,在写vim脚本时,应该总是使用normal!,永不使用normal;不要信任用户在~/.vimrc中的映射

有时阅读一个vim命令的文档可以激发关于别的内容的奇思妙想

Thank you for your reward !