上一章中我们谈论了如何在Vim中映射按键。我们使用的命令`map`在normal模式下工作。 如果阅读本章之前你自己已经折腾了,可能会注意到这个映射在visual模式一样工作。
你可以使用`nmap`、`vmap`和`imap`命令分别指定映射仅在normal、visual、insert模式有效。
执行如下命令:
~~~
:nmap \ dd
~~~
在normal模式下,按下`\`。Vim会删除当前行。
现在进入Visual模式,再次按下`\`。什么都不会发生,因为我们告诉了Vim这个映射仅在normal 模式下工作(同时`\`的默认行为是什么都不做)。
运行如下命令:
~~~
:vmap \ U
~~~
进入visual模式并选中一些文字,按下`\`。Vim将把选中文本转换成大写格式。
分别在normal模式和visual模式测试`\`按键,注意不同模式下的效应。
## 增强记忆
起初,将同样的按键根据当前模式的不同映射到不同的功能听起来很可怕。为什么每次按下 那个键之前都要停下想想我们现在是在什么模式?那样是不是更浪费时间?
实践中我们发现那真不是个问题。一旦你经常使用Vim,你就不会在意你按下的键了。 你会想“删除一行”,而不是“按`dd·”。你的手指和大脑都会记住你的映射,潜意识中你就会 按下那些映射按键。
## insert模式
现在我们已经知道如何在normal模式和visual模式下映射按键。现在我们谈谈insert模式下的 映射方法。运行如下命令:
~~~
:imap <c-d> dd
~~~
你可能猜想这个命令的作用是在insert模式下通过按键`Ctrl+d`删除整行。这个映射很实用, 因为你不必每次都要为了删除某些行而切回到normal模式。
好的我们试一下。它并不如我们想象那般工作,而仅仅是在文件中添加了两个`d`字符! 它压根就没用。
问题就在于Vim只按我们说的做。这个例子中,我们说:“当我按下`<c-d>`时,相当于我 按了两次`d`”。而当你在insert模式下,按下两次`d`的作用就是输入两个字符`d`。
要想让这个映射按我们的期望执行,我们需要更加明确的指令。修改映射并运行如下命令:
~~~
:imap <c-d> <esc>dd
~~~
`<esc>`告诉Vim按下ESC按键,即退出insert模式。
现在再试试这个映射。它能够正常工作,但是注意你是如何回到normal模式的。这是因为我们 告诉Vim`<c-d>`要退出insert模式并删除一行,但是我们没有告诉它再回到insert模式。
运行如下命令,修复映射问题:
~~~
:imap <c-d> <esc>ddi
~~~
结尾的`i`告诉Vim进入insert模式,至此我们的映射才最终完成。
## 练习
设置一个映射,当你在insert模式时,可以通过按下`<c-u>`将当前光标所在的单词转换成 大写格式。每次我写一个类似`MAX_CONNECTIONS_ALLOWED`这样很长的常量时都能感觉到这个 映射的实用性。因为这样我就可以以小写的格式敲写常量,然后用这个映射将其转成大写, 不必一直需要按着shift键。
将那个映射添加上到你的`~/.vimrc`文件中。
设置一个映射,当你在 _normal_ 模式时,可以通过按下`<c-u>`将当前光标所在的单词转换成 大写格式。这个映射和上面那个有点区别,因为你必须要进入normal模式,也不需要结束时 切到insert模式。
将那个映射添加上到你的`~/.vimrc`文件中。
- 前言
- 鸣谢
- 预备知识
- 打印信息
- 设置选项
- 基本映射
- 模式映射
- 精确映射
- Leaders
- 编辑你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 锻炼你的手指
- 本地缓冲区的选项设置和映射
- 自动命令
- 本地缓冲区缩写
- 自动命令组
- Operator-Pending映射
- 更多Operator-Pending映射
- 状态条
- 负责任的编码
- 变量
- 变量作用域
- 条件语句
- 比较
- 函数
- 函数参数
- 数字
- 字符串
- 字符串函数
- Execute命令
- Normal命令
- 执行normal!
- 基本的正则表达式
- 实例研究:Grep 运算符(Operator),第一部分
- 实例研究:Grep运算符(Operator),第二部分
- 实例研究:Grep运算符(Operator),第三部分
- 列表
- 循环
- 字典
- 切换
- 函数式编程
- 路径
- 创建一个完整的插件
- 旧社会下的插件配置方式
- 新希望:用Pathogen配置插件
- 检测文件类型
- 基本语法高亮
- 高级语法高亮
- 更高级的语法高亮
- 基本折叠
- 高级折叠
- 段移动原理
- Potion段移动
- 外部命令
- 自动加载
- 文档
- 发布
- 还剩下什么?