关于vim在插入模式中Backspace键无法删除的问题[转]

原文:Vim 里如何映射 CTRL-h 为 left ?

很多人习惯在配置文件中映射ctrl+hjkl为光标移动,却碰到了一些问题:

inoremap <c-h> <left>
inoremap <c-j> <down>
inoremap <c-k> <up>
inoremap <c-l> <right>

映射后无效或者映射以后按<BS>键不能删除,这是什么原因呢?

很简单,因为你的终端软件的默认配置是按下<BS>键以后
发送的是:^HASCII0x08),而^H在你的vim里被你 inoremap成了ctrl+h,所以你按了<BS>会被认为按下了左键。

早在VT100终端时代,^HASCII0x08)表示<BS>^?ASCII0x7f)表示<DEL>。过去0x7f是留给DELETE键使用的。而到了VT220时代,DELETE已经变为^[[3~ASCII0x1b,0x5b,0x33,0x7e共4个字节),而^?0x7f换给了我们的<BS>,有些终端软件,默认<BS>还是使用VT100的^H,你需要做的就是改一下终端默认配置而已。

你可以在你服务端下面查看下默认的键位设置:

$ stty -a

现在所有Linux服务器的erasebs)基本都是^?了(如果链接到非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 keyControl-? (127)

这里写图片描述

Terminal.app

Mac下面的Terminal.app默认是发送^?的,你也可以到Profiles Advanced下面确认下Delete sends Control-H没有勾选。

这里写图片描述

iTerm2

iTerm2下面默认也是发送^?的,可以到Profiles->Keys下面确认一下Delete key sends ^H没有被勾选。

这里写图片描述

Gnome-Terminal

至于Gnome-TerminalMinTTY之流的默认是^?要修改可以看具体文本配置文件。

好了,默认vim同时识别^HASCII0x08)和^?ASCII0x7f)都把这两个当成<BS>,现在我们统一把终端软件的<BS>改为0x7f以后,^H0x08就空出来给我们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>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页