很多人习惯在配置文件中映射ctrl+hjkl为光标移动,却碰到了一些问题:
inoremap <c-h> <left>
inoremap <c-j> <down>
inoremap <c-k> <up>
inoremap <c-l> <right>
映射后无效或者映射以后按<BS>键不能删除,这是什么原因呢?
很简单,因为你的终端软件的默认配置是按下<BS>键以后
发送的是:^H(ASCII码0x08),而^H在你的vim里被你 inoremap成了ctrl+h,所以你按了<BS>会被认为按下了左键。
早在VT100终端时代,^H(ASCII码0x08)表示<BS>而^?(ASCII码0x7f)表示<DEL>。过去0x7f是留给DELETE键使用的。而到了VT220时代,DELETE已经变为^[[3~(ASCII码 0x1b,0x5b,0x33,0x7e共4个字节),而^?的0x7f换给了我们的<BS>,有些终端软件,默认<BS>还是使用VT100的^H,你需要做的就是改一下终端默认配置而已。
你可以在你服务端下面查看下默认的键位设置:
$ stty -a
现在所有Linux服务器的erase(bs)基本都是^?了(如果链接到非Linux老操作系统erase不是这个的话,需要改一下,可以在系统层改,也可以vim里面set t_kb=…),vim里面也是认可^?的,可有些终端软件却默认发送^H,不过好在他们都支持修改:
Xshell的修改方法
Properties->Terminal->Keyboard里,把<BS>设置成127,而 <DEL>设置成VT220 Del。
SecureCRT 6的设置方法
Session Options->Terminal->Emulation->Mapped Keys,勾选 Backspace sends delete。
Putty 设置方法
好像默认是^?的,不过需要到Configuration->Terminal->Keyboard下面确认下The Backspace key是Control-? (127)。
Terminal.app
Mac下面的Terminal.app默认是发送^?的,你也可以到Profiles Advanced下面确认下Delete sends Control-H没有勾选。
iTerm2
iTerm2下面默认也是发送^?的,可以到Profiles->Keys下面确认一下Delete key sends ^H没有被勾选。
Gnome-Terminal
至于Gnome-Terminal和MinTTY之流的默认是^?要修改可以看具体文本配置文件。
好了,默认vim同时识别^H(ASCII码0x08)和^?(ASCII码0x7f)都把这两个当成<BS>,现在我们统一把终端软件的<BS>改为0x7f以后,^H的0x08就空出来给我们noremap了:
noremap <C-h> <left>
noremap <C-j> <down>
noremap <C-k> <up>
noremap <C-l> <right>
inoremap <C-h> <left>
inoremap <C-j> <down>
inoremap <C-k> <up>
inoremap <C-l> <right>
cnoremap <c-h> <left>
cnoremap <c-j> <down>
cnoremap <c-k> <up>
cnoremap <c-l> <right>

本文介绍了在使用Vim编辑器时如何正确映射Ctrl+hjkl为光标移动键,解决了因终端软件默认配置导致的按键冲突问题,并提供了Xshell、SecureCRT6等不同终端软件的具体设置方法。
420





