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
,它只是向左移动。
默认情况下,退格会去前行,如果在一行的开始(好像eol
是backspace
); 您可以'whichwrap'
通过b
标志(默认启用)中的选项来控制此行为。
您还可以通过将其映射到以下X
命令来使退格符删除字符:
nnoremap <BS> X
X
(并用删除x
)完成的,但是通常您真正想做的事情是db
例如删除直到单词开头,或daw
删除整个单词等。如果有可用的退格键,则冒着使用此键的风险。次优密钥在不必要的情况下更多。