如果你未曾用过Vim的段移动命令 (`[[`, `]]`, `[]` and `][`),现在花上几秒读读它们的帮助文档。 也顺便读读`:help section`。
还是不懂?这不是什么问题,我第一次读这些的时候也是这样。 在写代码之前,我们先岔开来学习这些移动是怎么工作的,然后在下一章我们将使得我们的Potion插件支持它们。
## Nroff文件
四个"段移动"命令正如其字面上的含义,可以用来在文件的"段"之间移动。
这些命令默认为[nroff文件][]而设计。 Nroff类似于LaTex或Markdown -- 它是用来写标记文本的(最终会生成UNIX man页面)。
Nroff文件使用一组"macro"来定义"段头"。 比如,这里有个来自于`awk`man页面的例子:
~~~
.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依旧需要在行开头有一个点,而且段头符必须是成对的字符, 所以这样改对Potion文件不会有足够的灵活性。
## 括号
段移动命令_也_查看另一样东西:一个打开或关闭的大括号(`{`或`}`)作为行的第一个字符。
`[[`和`]]`查看开括号,而`[]`和`][`查看闭括号。
这额外的"行为"使得你可以在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`吧。
- 前言
- 鸣谢
- 预备知识
- 打印信息
- 设置选项
- 基本映射
- 模式映射
- 精确映射
- Leaders
- 编辑你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 锻炼你的手指
- 本地缓冲区的选项设置和映射
- 自动命令
- 本地缓冲区缩写
- 自动命令组
- Operator-Pending映射
- 更多Operator-Pending映射
- 状态条
- 负责任的编码
- 变量
- 变量作用域
- 条件语句
- 比较
- 函数
- 函数参数
- 数字
- 字符串
- 字符串函数
- Execute命令
- Normal命令
- 执行normal!
- 基本的正则表达式
- 实例研究:Grep 运算符(Operator),第一部分
- 实例研究:Grep运算符(Operator),第二部分
- 实例研究:Grep运算符(Operator),第三部分
- 列表
- 循环
- 字典
- 切换
- 函数式编程
- 路径
- 创建一个完整的插件
- 旧社会下的插件配置方式
- 新希望:用Pathogen配置插件
- 检测文件类型
- 基本语法高亮
- 高级语法高亮
- 更高级的语法高亮
- 基本折叠
- 高级折叠
- 段移动原理
- Potion段移动
- 外部命令
- 自动加载
- 文档
- 发布
- 还剩下什么?