很多人习惯在配置文件中映射ctrl+hjkl
为光标移动,却碰到了一些问题:
inoremap <c-h> <left>
inoremap <c-j> <down>
inoremap <c-k> <up>
inoremap <c-l> <right>
- 1
- 2
- 3
- 4
映射后无效或者映射以后按<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
- 1
现在所有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>