vim退格键留下^?

75

在Vim中,当我在插入模式下按下退格键时,它会留下^?字符,并且不会删除它应该删除的字符。

我的.vimrc中有以下内容:

syntax on
set number
set expandtab
set incsearch
set nocompatible
set backspace=indent,eol,start
fixdel

即使在命令模式下也会出现这种情况。当我错误地键入 W 而不是 w 进行保存时,我按下 退格 键,它会给我以下提示:

:W^?
有什么想法,怎么修复?更新:在将这个问题发布到stackoverflow之前,我已经进行了基本的谷歌搜索,并尝试了搜索结果第一页的所有建议,但是都没有成功。@strcat 我正在使用vim版本7.0.237,KDE控制台1.6.4,Linux 2.6.18 x86_64机器。@graywh 关于cat -v,对于删除,我得到^[[3〜,对于退格,我得到^?。stty-a的输出如下.
speed 38400 baud; rows 38; columns 194; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

请查看以下链接以帮助调试您的问题:> http://vim.wikia.com/wiki/Backspace_and_delete_problems 编辑:我找到了一个与您描述的问题类似的问题:> http://lj4newbies.blogspot.com/2007/05/backspace-and-delete-keys-problem-in.html - Bogdan Emil Mariesan
抱歉,我尝试了那个但是不起作用! - Sangeeth Saravanaraj
我已经更新了我的帖子,加入了一些新的提示,请再次查看。 - Bogdan Emil Mariesan
3
你使用哪个终端/操作系统? - strcat
我之前在MacOS上使用iterm时遇到了这个问题。现在我正在尝试通过ssh连接到一个远程的Solaris主机来解决这个问题,但是在尝试修复的过程中,问题现在出现在本地的iterm上了。 - undefined
显示剩余4条评论
16个回答

91

^?是删除字符,而退格符号是^H。只有一个被终端识别为“删除”,这由终端设置stty决定。(bash和其他shell程序理解这个问题,并采取特殊措施来识别两者)

如果您的终端仿真器(ssh、putty、xterm等)与您的终端设置不一致,则会出现此行为。通常它默认正确,但很多时候人们会将stty命令放在他们的.bashrc文件中,从而破坏事情。

您可能在.bashrc中有类似于stty erase ^H的内容。如果是这样,请将其删除或更改您的终端设置,使退格发送^H而不是DEL(^?

您也可以使用vim映射来解决此问题,但这忽略了基本问题。


1
дҪ иҜҙеҫ—еҜ№гҖӮжҳҜжҲ‘bashrcж–Ү件дёӯзҡ„sttyжҗһз ёдәҶдёҖеҲҮгҖӮж„ҹи°ўжӮЁзҡ„жҫ„жё…гҖӮ - Sangeeth Saravanaraj
这里有几个人在使用Unix上的Putty时遇到了问题(不是Linux)。在Putty中,这很容易解决。选择“Pref->Terminal->Keyboard->Backspace”,将其更改为“^H”。 - j03m
1
我的vim中没有任何stty。 - User
18
我想补充一点,如果你的 .bashrc 文件中没有 'stty' 且遇到这个问题... 那么请把 'stty' 添加到你的 .bashrc 文件中,这个问题就会消失。stty erase '^?' - rrlamichhane
1
似乎是相互矛盾的建议。有些人说要在 .bashrc 中添加 stty 命令,而另一些人则说要将其删除。 - Michael Mathews
显示剩余2条评论

18

尝试添加:

noremap! <C-?> <C-h>

将此代码添加到您的~/.vimrc文件中。

这将把C-?映射到退格键,对我有用。


1
通常情况下,每当此重新映射解决问题时,这意味着您的termios设置与终端不匹配,并且修复这些设置(使用stty命令)将不仅修复Vim,而且还会一起修复许多其他终端应用程序,因此,我通常建议将此添加到您的~/.profile(或等效位置:stty erase '^?')。 - penguin359

9
vim wiki Backspace_and_delete_problems中,我继续阅读:help :fixdel,它建议如下:
if &term == "termname"
  set t_kb=^V<BS>
  fixdel
endif

当 "^V" 代表 CTRL-V,"" 代表删除键时,
(不要输入四个字符!)。将 "termname"
替换为您的终端名。

对我来说,fixdel 让退格键像删除键一样工作。我的第一个错误也是在 gvim 中执行 CTRL-V 删除,在系统中你无法使按键正常工作,因此它会粘贴有问题的会话看到的删除键。

我现在在我的 .vimrc 中加入了以下内容:

if &term == "xterm-256color"
  set t_kb=^?
endif

6
在Mac上,如果您使用的是终端,请前往“偏好设置” ->“配置文件” ->“高级”,然后选择“删除发送控制-H”。

1
我试了很多其他的解决方案,但这个在我的Mac上行得通,谢谢! - Aaron Robeson
对我来说有效。所以我猜Mac终端默认发送^? - wisbucky
@wisbucky 不同的系统发送退格键的方式是不同的 https://superuser.com/a/129986/430236 - Choylton B. Higginbottom

5

我花费了无数个小时来尝试解决这个问题,而这个方法为我解决了问题,谢谢。 - artemis

4
尝试按下ctrl+del/ctrl+backspacealt+del/alt+backspace,我记不太清楚了,但我认为这会解决你的问题。
如果这样做不起作用,请尝试按下shift+backspace/del。我之前也遇到过这个问题,有一个组合键可以按下,以发送正确的字符代码来执行删除操作。

4

我遇到了同样的问题,使用 vim 的退格键会留下 ^?,而在命令行中则可以正常工作。

以下是解决方法,使用 vim 映射:

In .vimrc, type:      imap ^? ^H

这将把CTRL-H(在vim中默认的退格键)映射到退格键上。

希望能对您有所帮助。

3
我无法让 ^H 字符正常工作,所以我在 .vimrc 文件中使用了 imap ^? <BS>,现在它可以正常工作了。对于命令和搜索,cmap 也是必需的。 - horta
2
horta的修改对我奏效了,而^H则没有:imap ^? <BS> - Steve Bond

3

对我来说,这是一个 stty 问题,我遇到了类似于你的 stty -a 的输出。
我的问题被运行 stty sane 命令解决了。

这不仅修复了退格/删除键的问题,还修复了箭头键的问题。


3
我遇到了完全相同的问题,但是Ctrl+H对我无效。我的stty设置也没问题。只想提一下我的环境,如果有人遇到同样的问题:

  • 使用cygwin和xterm,在X下, 当然 :)
  • Ssh连接到RHEL6.4->bash->tmux->vim

.vimrc中添加fixdel后,它可以工作!所有上面的修复方法对我都不起作用。


我也是...使用Exceed ---> SSH ---> RHEL > ksh > tmux > vim。 - statquant

3

在你的 .bashrc 文件中输入 stty erase ^?

运行你的 .bashrc 文件

运行命令: stty -a

speed 38400 baud; rows 48; columns 157; line = 0;
intr = ^C; quit = ^\; ***erase = ^?***; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

擦除功能将被更新为新值^?,您的退格键现在应该可以正常使用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接