ESC键
在vim中ESC是一个重度使用的键,但不幸的是这个键离手的默认位置比较远(最初设计VIM的键盘与现在的键盘不同,那个时候的ESC键基本上处在现在TAB键的位置上),按一次就得看一下键盘,严重影响VIM这种神器的使用者的风范,解决这个问题最好的方法不是刻苦训练手的机械记忆,首先训练比较花时间,其次孔子他老人家教导我们君子不器,我们怎么能把自己(的一部分)训练成机器呢?最后也是最重要的理由是:即使能训练出来,手在键盘上来回飞舞还是比较花时间, 基于以上理由,我决定采用如下键映射方法解决这个问题。 在$vim/_vimrc里加上:
imap ;; <ESC>
cmap ;; <ESC>
这样,在插入和命令行模式下,只要连按两个分号就相当于按了一次ESC键。那么,如果在插入模式下确实需要输入;;怎么办呢?只要在输入第一个;之后停顿一下,再输入就行了,详见“:h timeout”。对上述代码的详细解释见附1和附2。
上面是用;;代替ESC键,其实在还有别的很多替代方案,比如用jj代替ESC也比较常见,详见“ Avoid the escape key ”, 但我觉得都没有;;方案方便、安全、有效。
Ctrl键
比较普遍的方案是用Capslock键代替Ctrl键,这个vim自己就搞不定了,比较好的方法是用另一个神器:Autohotkey完成这个功能,下面的ahk代码实现Capslock键代替Ctrl键,而原来Capslock键的功能用Shift+Capslock实现;
#IfWinActive VIM ; if in vim
+Capslock::Capslock ; make shift+Caps-Lock the Caps Lock toggle
Capslock::Control ; make Caps Lock the control button
#IfWinActive ; end if in vim
详见“ MovingTheCtrlKey ”。
附1:键映射与模式
所谓键映射,就是将一个按键(或者组合按键)转换为另一个按键(或者组合按键)。为什么要转换呢?主要是为了提高效率,比如原始键位置太远,或者要输入的东西太多,或者需要两手同时操作。由于vim有多种模式,就出现了一个键映射在什么模式下有效的问题。以上面的ESC键为例,VIM一共有5种模式(详见:h map-modes):normal, insert, operator-pending, visual, command-line,需要按ESC的只有insert和command-line两种,其他3种模式中jj往往表示光标移动,若映射会造成操作不便。map系列指令的第一个字母表示模式,上述五个模式分别用n, i, o, v, c表示(详见“:h map-overview”),所以imap表示仅在insert模式下这个映射有效。
附2:map与noremap的区别
若有“map A B”和“map B C”,则“map A B”最终的效果是执行C,这就是映射定义的嵌入与递归问题(详见“:h noremap”),不论是否存在“map B C”,“noremap A B”都执行B。结合附1的说明,nnoremap就是normal模式下的noremap指令;