Chinaunix首页 | 论坛 | 博客
  • 博客访问: 620278
  • 博文数量: 69
  • 博客积分: 1891
  • 博客等级: 上尉
  • 技术积分: 1359
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-20 23:38
文章分类

全部博文(69)

文章存档

2012年(46)

2011年(23)

分类: Python/Ruby

2012-06-11 22:12:14

 1、Modal Mapping
     上一章节里我们讲述了怎么在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文件里。
阅读(1080) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~