Vimscript编程指南

区块移动理论

如果你从来都没有使用过Vim的区块移动命令([[]][]][),先花一点时间阅读一下说明文档。现在就开始阅读:help section的内容。

是不是有点迷惑了?这是正常的,我第一次读这些内容也是这样的感受。我们将要通过写代码的方式来迂回地学习这些移动是怎么运作的,然后,在下一节里让我们的Potion插件来支持它们。

Nroff 文件

“区块移动”的四个命令概念上都是用来在文件的“区块”上来进行移动的。Nroff是一个和LaTex或者MarkDown相似的语言——它是用来编写那些以后需要来格式化的文本的(其实这就是UNIX man page 所使用的格式)。

Nroff 文件使用一些特定的“宏”来定义“区块头”。例如,下面是一段取自awk man page的内容:


.SH NAME                                                     ***
awk \- pattern-directed scanning and processing language
.SH SYNOPSIS                                                 ***
.B awk
[
.BI \-F
.I fs
]
[
.BI \-v
.I var=value
]
[
.I 'prog'
|
.BI \-f
.I progfile
]
[
.I file ...
]
.SH DESCRIPTION                                              ***
.I Awk
scans each input
.I file
for lines that match ...

这些以.SH开头的都是区块头,我在上面通过***把它们给标记出来了。那四个区块移动的命令都是用来在这些区块头直接移动光标的。

Vim会把所有以.以及所有的nroff区块头的“宏”开始的文本行作为区块头进行处理,哪怕你编辑的不是一个nroff文件。

你可以通过修改sections设置的方式来修改这些宏,但是Vim还是需要你在文本行的开头通过点号来开始,并且这些宏都要是成对的字符,这样的话,这些设置就不会给Portion文件带来过多的灵活性。

花括号

区块移动命令也会查找另外一个东西:一个开或者关的花括号({或者})作为一行的开头。

[[]]查找左花括号,[]][查找右花括号。

这个额外的小功能可以让你在类似C语言一样的文本区块里进行移动。而且不管你在编辑什么文件,这些规则都是通用的。

把下面的文本放进缓存里:


Test           A B
Test

.SH Hello      A B

Test

{              A
Test
}                B

Test

.H World       A B

Test
Test           A B

现在运行:set filetype=basic来告诉Vim这是一个BASIC文本,然后再来试试区块移动的命令。

[[以及]]命令会在标记了A的文本行间移动,而[]][命令则会在标记了B的文本行间移动。

这个向我们展示了Vim会一直使用这两条相同的规则来进行区块移动,即使是在那些这两条规则都不适用的文本里(例如BASIC)!

练习

  • 再次阅读:help section,现在你应该了解了区块移动了。
  • 可以阅读:help sections来娱乐一下。