1、不同模式下的映射 上一章节里我们讲述了怎么在vim里建立按键映射。我们用map命令让normal模式下的按键能够进行映射。如果你在阅读本章之前,自己在把玩一番的话,你会发现键盘映射在visual模式下也是有用的。
我们可以通过nmap,vmap,和imap命令来对键盘映射所生效的模式进行指定。这些命令分别告诉vim,映射只在normal,visual或者是insert其中某一个模式下有效。
运行下面的命令:
:nmap \ dd
现在把光标移动到一行文本上,进入到normal模式,然后按‘\’,vim会删除当前行。
现在进入visual模式,通样按‘\’,什么效果也没有,这是因为nmap告诉vim这个映射只在normal模式下有效(并且在visual模式下‘\’并没有任何效果)。
再运行下面的命令:
:vmap \ U
进入visual模式,并选中一些文本(英文文本),然后按‘\’,vim会把这些文本(应为文本)都转成大写。
再分别在visual模式和normal模式下试试‘\’键,你会发现它在两种模式下的功能是完全不一样的。
2、肌肉记忆
似乎同一个按键在不同的模式下做不同的事情是一个很糟糕的主意,因为每次按键之前都得考虑一下当前处于什么模式。这样的话,不就会抵消原来映射所节省的时间么?
但实际上不会存在这样的问题的。当你熟练使用vim的时候,你不会再只是考虑你所要按的某个键,而是具体的操作。当要删除某一行的时候,你想的是“删除改行”,而非是“按下dd”。你的手指和大脑会记住你的键盘映射,而具体的按键则是你潜意识下的操作。
3、insert模式
现在,我们已经讨论了visual和normal模式下的映射问题,现在我们继续讨论在insert模式下的映射。
运行下面的命令:
:imap dd
也许你会认为当你在normal模式下按下'Ctrl+d'时,当前行会被删除掉。这个功能确实不错,因为你再也不用跑到normal模式下去删除文本行了!
试试吧。但是实际上它却不起作用,而且只是在你的文本里添加了两个‘d’!这个确实毫无用处。
事实上vim是在做你让它去做的事。我们在告诉它:“当我按Ctrl+d的时候,把它映射成按两个‘d’所做的事情”。
很好,事实上,当你在Insert模式下,并且按下‘d’两次时,就会在你的当前行输入两个‘d’!
为了让这个映射有效,我们需要说的更清楚点。用下面的命令来替换上面的那个映射:
:imap dd
表示vim里的Escape键,按这个键就让我vim切换出insert模式。
现在再试试这个映射,它确实删除了当前行!但是你会发现你现在却是在normal模式下了。这个问题很明显了,因为你告诉vim离开insert模式,然后删除一行文本,但是没有告诉它再进入insert模式。
用下面的命令来修复上面的那个问题:
:imap ddi
后面添加的i可以vim进入插入模式,最终这个映射完成了。
4、练习:
1)建立这样一个映射:当你在插入模式下输入Ctrl+u时,会把当前的单词整个转成大写。在visual模式下,按下u可以让选择的文本变成大写。我觉得这个功能很有用,尤其是在输入一个很长的常量名的时候,我只需要输入这个名字的小写,然后用这个映射来把它变成大写。
2)把上面的映射加入到你的~/.vimrc文件里。
3)建立这样一个映射:当你在normal模式下时,按下Ctrl+u会把当前的单词整个转成大写。这个映射和上一个略有不同,因为你不需要进入normal模式,并且你最终是要停留在normal下,而非是insert模式。
4)把这个映射也加入到你的~/.vimrc文件里。