既然已经学了`execute`和`normal!`,我们就可以深入探讨一个Vimscript惯用法。 执行下面的命令:
~~~
:execute "normal! gg/foo\<cr>dd"
~~~
这将移动到文件的开头,查找`foo`的首次出现的地方,并删掉那一行。
之前我们尝试过用`normal!`来执行一个搜索命令却无法输入必须的回车来开始进行搜索。 结合`execute`和`normal!`将解决这个问题。
`execute`允许你创建命令,因而你能够使用Vim普通的转义字符串来生成你需要的"打不出"的字符。 尝试下面的命令:
~~~
:execute "normal! mqA;\<esc>`q"
~~~
这个命令做了什么?让我们掰开来讲:
* `:execute "normal! ..."`:执行命令序列,一如它们是在normal模式下输入的,忽略所有映射, 并替换转义字符串。
* `mq`:保存当前位置到标记"q"。
* `A`:移动到当前行的末尾并在最后一个字符后进入insert模式。
* `;`:我们现在位于insert模式,所以仅仅是写入了一个";"。
* `\<esc>`:这是一个表示Esc键的转义字符串序列,把我们带离insert模式。
* ```q``:回到标记"q"所在的位置。
看上去有点绕,不过它真的很有用:它在当前行的末尾补上一个分号并保持光标不动。 在写Javascript,C或其他以分号作为语句分隔符的语言时,一旦忘记加上分号,这样的映射将助你一臂之力。
## 练习
重读`:help expr-quote`(你之前应该看过)来提醒你怎么用`execute`通过转义字符串传递特殊字符给`normal!`。
在翻开下一章之前,放下本书休息一下。吃一个三明治或喝一杯咖啡(译注:或者茶!), 喂一下你的宠物——如果你有的话。
- 前言
- 鸣谢
- 预备知识
- 打印信息
- 设置选项
- 基本映射
- 模式映射
- 精确映射
- Leaders
- 编辑你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 锻炼你的手指
- 本地缓冲区的选项设置和映射
- 自动命令
- 本地缓冲区缩写
- 自动命令组
- Operator-Pending映射
- 更多Operator-Pending映射
- 状态条
- 负责任的编码
- 变量
- 变量作用域
- 条件语句
- 比较
- 函数
- 函数参数
- 数字
- 字符串
- 字符串函数
- Execute命令
- Normal命令
- 执行normal!
- 基本的正则表达式
- 实例研究:Grep 运算符(Operator),第一部分
- 实例研究:Grep运算符(Operator),第二部分
- 实例研究:Grep运算符(Operator),第三部分
- 列表
- 循环
- 字典
- 切换
- 函数式编程
- 路径
- 创建一个完整的插件
- 旧社会下的插件配置方式
- 新希望:用Pathogen配置插件
- 检测文件类型
- 基本语法高亮
- 高级语法高亮
- 更高级的语法高亮
- 基本折叠
- 高级折叠
- 段移动原理
- Potion段移动
- 外部命令
- 自动加载
- 文档
- 发布
- 还剩下什么?