=======
上一章节里我们讲述了怎么在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模式下试试‘\’键,你会发现它在两种模式下的功能是完全不一样的。
=======
似乎同一个按键在不同的模式下做不同的事情是一个很糟糕的主意,因为每次按键之前都得考虑一下当前处于什么模式。这样的话,不就会抵消原来映射所节省的时间么?
但实际上不会存在这样的问题的。当你熟练使用vim的时候,你不会再只是考虑你所要按的某个键,而是具体的操作。当要删除某一行的时候,你想的是“删除改行”,而非是“按下dd”。你的手指和大脑会记住你的键盘映射,而具体的按键则是你潜意识下的操作。
=======
现在,我们已经讨论了visual和normal模式下的映射问题,现在我们继续讨论在insert模式下的映射。
运行下面的命令:
:imap <c-d> dd
也许你会认为当你在normal模式下按下'Ctrl+d'时,当前行会被删除掉。这个功能确实不错,因为你再也不用跑到normal模式下去删除文本行了!
试试吧。但是实际上它却不起作用,而且只是在你的文本里添加了两个‘d’!这个确实毫无用处。
事实上vim是在做你让它去做的事。我们在告诉它:“当我按Ctrl+d的时候,把它映射成按两个‘d’所做的事情”。
很好,事实上,当你在Insert模式下,并且按下‘d’两次时,就会在你的当前行输入两个‘d’!
为了让这个映射有效,我们需要说的更清楚点。用下面的命令来替换上面的那个映射:
:imap <c-d> <esc> dd
现在再试试这个映射,它确实删除了当前行!但是你会发现你现在却是在normal模式下了。这个问题很明显了,因为你告诉vim离开insert模式,然后删除一行文本,但是没有告诉它再进入insert模式。
用下面的命令来修复上面的那个问题:
:imap <c-d> <esc> ddi
后面添加的i可以vim进入插入模式,最终这个映射完成了。
=======