为什么退格键不能在插入模式下工作?


146

backspace有时似乎无法使用键在插入模式下删除字符。backspace 有时我可以,但在其他时候它什么也没做。光标不会移到左侧,并且绝对没有任何反应。

我在Windows中使用gVim注意到了这一点。在backspace似乎同时使用议会在大多数Linux系统上的终端然而按预期运行。

  1. 为什么会这样?
  2. 如何backspace像往常一样使键删除字符?
  3. 此行为是否旨在作为功能?换句话说:backspace在插入模式下删除字符还有更好的选择吗?

尽管下面的答案可以正确解决您的问题,但我发现禁用箭头键或退格键等按键有助于您习惯于更正确地进行操作。vim中的退格键是用X(并用删除x)完成的,但是通常您真正想做的事情是db例如删除直到单词开头,或daw删除整个单词等。如果有可用的退格键,则冒着使用此键的风险。次优密钥在不必要的情况下更多。
Shahbaz

5
@Shahbaz我不同意:在插入模式下,可以使用Backspace键进行较小的更正。我同意应该学习如何使用普通模式的命令,但是在插入模式下进行细微的修改并不适合使用退格键。
Karl YngveLervåg'15

3
@KarlYngveLervåg,在退格的情况下,我同意(实际上我没有让自己禁用)。但是,OP似乎具有退格键的默认行为,例如在行首时不起作用,但在行中起作用。不过,OP比退格键有更好的选择。例如,除了退格到上一行之外,还可以使用J它来处理空白。简而言之,退格可以在编写过程中快速修正拼写错误,但除此之外,还有其他更好的选择。
Shahbaz

1
许多人的问题并不是对功能本身的意见分歧,但不是他们使用的唯一编辑器。由于他们使用多个编辑器,因此切换与退格有关的范例是违反直觉的,因此他们更喜欢vim功能的子集。
j riv

如果您已安装vim-faq,则可以在那里找到离线答案::h vim-faq并搜索/backspace。难记的标签是:h faq-12.26
Hotschke

Answers:


178

tl; dr:将其添加到您的vimrc中,以使退格键像大多数其他程序一样工作:

set backspace=indent,eol,start

更长的答案

尽管默认行为可能令人惊讶,但是可以将退格“不起作用”视为功能;它可以将行限制在当前行和/或插入的开头,从而防止您意外删除缩进和删除过多文本。

:help 'backspace' 告诉我们:

Influences the working of `<BS>`, `<Del>`, `CTRL-W` and `CTRL-U` in Insert
mode.  This is a list of items, separated by commas.  Each item allows
a way to backspace over something:

value     effect
indent    allow backspacing over autoindent
eol       allow backspacing over line breaks (join lines)
start     allow backspacing over the start of insert; CTRL-W and CTRL-U
          stop once at the start of insert.

那么这些值到底意味着什么?

缩进
Vim为许多文件类型增加了自动缩进。默认情况下,你不会 允许退格在这一点; 被认为是“自动缩进”的规则有些微妙,例如,如果我们键入此规则(其中█是光标):

if :; then
    █

退格将不起作用。

但是,如果我们随后添加命令和fi,然后返回上一步, 可以删除缩进:

if :; then
    █:
fi

这是因为在第一个示例中,Vim确定当您按下Enter键时,它应该添加一个缩进级别;但是在第二个示例中,Vim不会自动缩进任何内容,只是Tab字符或一些空格。

另见 :help 'autoindent'

eol
这应该是最明显的,按Backspace键也可以删除EOL标记(\n\r\n);如果禁用此选项,则在尝试删除EOL标记时,Backspace将不执行任何操作。

start
这意味着您只能删除自插入模式启动后插入的文本,并且不能删除以前插入的任何文本。

那么默认设置是什么?

我在Windows中使用GVIM注意到了这一点。但是,在大多数Linux系统中,从终端使用VIM时,退格似乎可以按预期工作。

这样做的原因是因为许多Linux发行版附带了预制的vimrc文件,这些文件设置了一些常用选项。例如,在我的Arch Linux系统上,我具有/usr/share/vim/vimfiles/archlinux.vim

set nocompatible
set backspace=indent,eol,start
" ... and a few more...

如果在Windows上安装Vim,则默认为使用Vim随附的默认vimrc和gvimrc。

Vim的默认值是空值backspace。Arch Linux,Debian,CentOS或$other_distro默认版本可能有所不同。

正常模式

这个问题是关于插入模式下的Backspace,但让我也添加一些有关正常模式下Backspace的简短说明。

在正常模式下,Backspace充当h,它只是向左移动。

默认情况下,退格会去前行,如果在一行的开始(好像eolbackspace); 您可以'whichwrap'通过b标志(默认启用)中的选项来控制此行为。

您还可以通过将其映射到以下X命令来使退格符删除字符:

nnoremap <BS> X

1
我认为这"_X将是“更自然”的行为<BS>
Hauleth '18

2
值得注意的是,几乎没有发行版附带默认行为。我注意到的唯一一个是msys2,这可能不是一个决定,而是其开发不足的性质。
j riv

5

万一有人<BS>在Windows上使用ConEmu 遇到无法解释的行为,则可能必须将<BS>密钥重新映射为:

inoremap <Char-0x07F> <BS>
nnoremap <Char-0x07F> <BS>

更多信息


1
set backspace=2

与v5.4和更早版本一起使用。在Mac上为我工作。

看起来像在Mac上我有v3.2:

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

3.2以后的所有版本都使用GNU通用公共许可证v3(GPLv3),Apple不支持该版本。关于reddit的讨论在这里

您可以使用以下方法升级到最新的Bash:

brew install bash

这可以利用此处突出显示的可编程完成功能。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.