很多人习惯在配置文件中映射 CTRL+HJKL 为光标移动,却碰到了一些问题:
inoremap <c-h> <left>
inoremap <c-j> <down>
inoremap <c-k> <up>
inoremap <c-l> <right>
映射后无效或者映射以后按 <BS>
键不能删除,这是什么原因呢?
很简单,因为你的终端软件(Xshell, SecureCRT)有些老,默认配置是按下<BS>
键以后 发送的是:^H (ASCII 码 0x08),而 ^H在你的 Vim 里被你 inoremap 成 了,所以你按了<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,比如 Xshell 4 Build 0142以前的版本,默认<BS>
是发送^H。SecureCRT直到6.x版本还在默认发送 VT100的 ^H。
你需要做的就是改一下终端默认配置而已,大部分不那么陈旧的终端软件,如今都是默认VT220的标准,比如 Xshell4 Build 0142及以后的 Xshell5,Putty,Mac下面的 Terminal.app, iTerm2,Ubuntu下面的 gnome-terminal,他们都是把 <BS>
发送成 ^?
你可以在你服务端下面查看下默认的键位设置:
$ stty -a
现在所有 Linux服务器的 erase (bs)基本都是 ^? 了(如果链接到非 Linux老操作系统 erase不是这个的话,需要改一下,可以在系统层改,也可以vim里面 set t_kb=…),Vim里面也是认可 ^?的,可老旧的终端软件却默认发送 ^H,不过好在他们都支持修改:
……
阅读全文