目前为止我们已经介绍了几个最为常用的Vimscript命令,但都跟日常中在normal模式下处理文本的方式无关。 有没有一种办法能把我们的脚本跟日常的文本编辑命令结合起来呢?
答案显然是肯定的。之前我们已经见过`normal`命令,是时候更详细地介绍它了。 执行下面的命令:
~~~
:normal G
~~~
Vim将把你的光标移到当前文件的最后一行,就像是在normal模式里按下`G`。现在执行下面命令:
~~~
:normal ggdd
~~~
Vim将移动到文件的第一行(`gg`)并删除它(`dd`)。
`normal`命令简单地接受一串键值并当作是在normal模式下输入的。就是那么简单!
## 避免映射
执行下面的命令来映射`G`键到别的东西:
~~~
:nnoremap G dd
~~~
现在在normal模式按下`G`将删除一整行。试试这个命令:
~~~
:normal G
~~~
Vim将删除当前行。`normal`命令将顾及当前的所有映射。
这意味着我们需要给`normal`提供类似于`nnoremap`之于`nmap`的版本, 否则我们没法使用它——考虑到我们猜测不了用户的映射方式。
幸好Vim真的有这样的命令叫`normal!`。执行这个命令:
~~~
:normal! G
~~~
这次Vim将移动光标到文件底部,即使`G`已经被映射了。
在写Vim脚本时,你应该_总是_使用`normal!`,_永不_使用`normal`。不要信任用户在`~/.vimrc`中的映射。
## 特殊字符
如果你使用`normal!`一段时间了,就很可能注意到一个问题。试试下面的命令:
~~~
:normal! /foo<cr>
~~~
第一眼看上去它应该会开始搜索`foo`,但你将看到它不会正常工作。 问题在于`normal!`不会解析像`<cr>`那样的特殊字符序列。
于是,Vim认为你想要搜索字符串序列"foo",没有意识到你甚至按下了回车来进行搜索! (译注:原文为you even pressed return to perform the search! 按后文的意思应该是没有按下return,待问作者) 我们将在下一章讨论如何应对这个问题。
## 练习
阅读`:help normal`。在最后部分,你将获得关于下一章主题的提示。
## 附加题
如果你还没准备好面对挑战,跳过这一节。如果你够胆,祝你好运!
重温`:help normal`关于undo的部分。尝试设计一个删除两行却能单独撤销每次删除的映射。 建议从`nnoremap <leader>d dddd`开始吧。
这次你并不真的需要`normal!`(`nnoremap`就够了), 但是它揭示了一点:有时阅读一个Vim命令的文档可以激发关于别的内容的奇思妙想。
如果你未尝使用过`helpgrep`命令,那就是时候用上它了。阅读`:help helpgrep`。 留心关于怎样在匹配内容中浏览的部分。
暂时先别纠结模式(patterns),我们很快就要谈到它们。 现在只需了解你可以用类似`foo.*bar`来查找文档中包括该正则模式的行。
不幸的是,`helpgrep`会不时给你带来挫折感,因为为了找到某些词,你需要懂得去搜索某些词。 我会帮你省下些无用功,这次你得查找到一种手工修改Vim的撤销序列的方法, 这样你映射的两个删除才能独立地撤销。
在以后你要灵活变通(pragmatic)。有时在你迷惘徘徊的时候,Google一下,你就知道。
- 前言
- 鸣谢
- 预备知识
- 打印信息
- 设置选项
- 基本映射
- 模式映射
- 精确映射
- Leaders
- 编辑你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 锻炼你的手指
- 本地缓冲区的选项设置和映射
- 自动命令
- 本地缓冲区缩写
- 自动命令组
- Operator-Pending映射
- 更多Operator-Pending映射
- 状态条
- 负责任的编码
- 变量
- 变量作用域
- 条件语句
- 比较
- 函数
- 函数参数
- 数字
- 字符串
- 字符串函数
- Execute命令
- Normal命令
- 执行normal!
- 基本的正则表达式
- 实例研究:Grep 运算符(Operator),第一部分
- 实例研究:Grep运算符(Operator),第二部分
- 实例研究:Grep运算符(Operator),第三部分
- 列表
- 循环
- 字典
- 切换
- 函数式编程
- 路径
- 创建一个完整的插件
- 旧社会下的插件配置方式
- 新希望:用Pathogen配置插件
- 检测文件类型
- 基本语法高亮
- 高级语法高亮
- 更高级的语法高亮
- 基本折叠
- 高级折叠
- 段移动原理
- Potion段移动
- 外部命令
- 自动加载
- 文档
- 发布
- 还剩下什么?