将Caps Lock转换成Esc(windows and linux)
1. linux 下将Caps Lock 转换成Esc
作为一个vimer,Caps Lock对我(还有其他很多人)来说根本就是多余的,而且在键盘中的位置根本不合理,一不小心就按到了Caps Lock,然后就出错了。Esc又是vim下使用最为频繁的按键,将Caps Lock替换成Esc真是再好不过了,而且不用担心按ESC的时候按到了该死的F1。
可能有人会问,这样对于连续的大写不是就不方便了吗?我们可以先用小写,然后选中该段文中,按U,就变成大写了。对于在vim中的大写,这里还有一个小技巧推荐给大家:
inoremap <C-u><esc>gUiwea
将上面这条语句是放在.vimrc文件里的,它的作用就是在编辑状态下,按ctrl+u,将你刚刚输入的那个单词变成大写。谁用谁知道。对一个用vim 作为主要编辑器的人,有了上面两条技巧以后, Caps Lock 就是多余的了。
在linux将Caps Lock转换成Esc非常简单,只要在.profile文件加入下面这条语句即可。
xmodmap -e 'clear Lock'-e 'keycode 0x42 = Escape'
当你不需要的时候,只要将这条语句删除,重启即可。
2. windows下将Caps Lock 转换成Esc
在linux下把Caps Lock当Esc习惯以后,到windows下自然也希望将Caps Lock转换成Esc,如果用搜索引擎搜"windows Esc Caps lock",很轻松的就找到了下面的答案:
- 新建文本文档,重命名为capslock2esc.reg
-
输入如下内容
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlKeyboard Layout]"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,3a,00,01,00,01,00,3a,00,00,00,00,00
-
然后保存,并且双击写入注册表,重新登录计算机
这个答案有个问题就是交换了Caps Lock与Esc ,当我向我们组的同事请教问题的时候,他需要在我的电脑上操作,按Esc确是Caps Lock 显然让他很不习惯,所以,我又搜了一下,如何将Caps Lock转换成Esc ,而不是交换它们。我找到了这篇文章,讲得不错,可惜有错误。
为了完整,把这篇文章转过来了,并修正了错误。方法还是和上面的一样,不过多了解析。
下面分析"Scancode Map"后面一长串数字, 为方便分析,拆分为每8位一行,并加上行号,结果如下:
1.00,00,00,00,2.00,00,00,00,3.03,00,00,00,4.3a,00,01,00,5.01,00,3a,00,6.00,00,00,00
头两行和最后一行,是固定的,都是8个0。
第3行,表示共更改了多少个按键,本例为3个,怎么算的?从第4行开始,到最末尾行(虽然严格来说末行不算),每行算1个,4、5、6行,刚好3个
第4行,前后各4位,分别代表某个按键。本例为将0100的按键映射为3a00。3a00代表CapsLock键,0100代表Esc键
第5行,同理,3a00的按键映射为0100,即映CapsLock射为Esc
第6行,已经讲了,末行,固定8个0。如果需要增加更多的映射,可以在此行之上,不断加类似4、5行格式的。当然,最后的结果,还是要将各行合为一行的。
每行的4个数字,两个数字一组,代表一个按键,在映射时,他们的关系类似与c语言的char *strcpy(char *strDest, const char *strSource)
函数,把后面一组的意义赋给前一组。
综上所述,将Caps Lock映射成Esc,而不是交换Esc与Caps Lock的代码如下:
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlKeyboard Layout]"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00
叫上面代码保存到capslock2esc.reg 文件中,双击运行,重启电脑即可。
还原按键时,只需要在注册表的路径([HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlKeyboard Layout]
)下,删除Scancode Map键即可。
附录
部分按键映射对照表。
Escape0100Tab0F00CapsLock3A00LeftAlt3800LeftCtrl1D00LeftShift2A00LeftWindows5B E0
RightAlt38 E0
RightCtrl1D E0
RightShift3600RightWindows5C E0
Backspace0E00Delete53 E0
Enter1C00Space3900Insert52 E0
HOME 47 E0
End4F E0
NumLock4500PageDown51 E0
PageUp49 E0
ScrollLock4600
还有一个特殊的值 —— 00 00,表示啥也不干,如果要将某个按键禁用,只需映射为00 00。