在Vim中按Esc键后如何保持缩进

在Vim中按Esc键后如何保持缩进,vim,Vim,我已设置自动缩进 我走到一行,按a键,然后进入下一行并插入缩进。但是,如果按Esc键,光标会跳到行首,缩进消失。 我必须四处走动,按tabs键才能再次到达正确的位置 我知道帮助说: If you do not type anything on the new line except <BS> or CTRL-D and then type <Esc>, CTRL-O or <CR>, the indent is deleted again. 如果在新行中键入

我已
设置自动缩进

我走到一行,按a键,然后
进入下一行并插入缩进。但是,如果按Esc键,光标会跳到行首,缩进消失。
我必须四处走动,按tabs键才能再次到达正确的位置

我知道帮助说:

If you do not type anything on the new line except <BS> or CTRL-D and then type
<Esc>, CTRL-O or <CR>, the indent is deleted again.
如果在新行中键入除或CTRL-D之外的任何内容,然后键入
,CTRL-O或,再次删除缩进。

有没有办法禁用此功能,或者至少有一个解决方法?

一个简单的方法是按“.”(或任何字符),escape,然后按x删除字符。缩进应该保留。

键入文本,然后在正常模式下按该行的
=

直到两天前我才遇到这个问题

没有方法可以禁用此功能,但幸运的是,您不需要这样做,因为:

使用
S
cc
进入插入模式。使用
S
再次进入插入模式将进入具有适当缩进级别的插入模式,使得Vim删除缩进的事实不重要

注意:我发现这个技巧在大多数地方都适用。但由于某些原因,它不能与Python文件一起工作。我猜这是因为Python文件类型弄乱了它自己的缩进函数,或者是类似的东西

编辑:


另一个技巧是,您可以定义cpoptions,如果您在一条有缩进的线上并移动光标,它将保留缩进。这并不能解决您立即按下Esc键的问题,但这是一个相关的问题,可能也会困扰您。

好吧,我解决了这个问题

根据Edan Maor的回答,s或cc应以适当的缩进级别进入插入模式。
…除非它没有:)

这在两种情况下起作用

  • 当设置了
    cindent
    时,它将根据C格式规则插入缩进
    在编辑非C类文件时,这可能会很烦人
  • 当设置了
    indentexpr
我发现最好的解决方案是让这是我的
。vimrc

set autoindent
set indentexpr=GetIndent()

function GetIndent()
   let lnum = prevnonblank(v:lnum - 1)
   let ind = indent(lnum)
   return ind
endfunction

现在,当我按下S或cc时,它将插入与前一个非空行相同的缩进。

可能值得注意的是,使用正确的插件
S
cc
似乎再次正常工作。很可能是python模式解决了这个问题


我本想达到同样的效果,但因为我想正常工作。这是我的解决方法:我发现在正常模式下
几乎是无用的。它只将光标向下移动一行,这可以通过
j
实现

所以我在我的
.vimrc
中添加了这个:

nmap <cr> o.<c-h><esc>
nmapo。

每当我需要一个空行作为缩进时,我都会使用

考虑使用“o”开始换行。我在_vimrc中添加了以下配置(注意:set autoindent)

“丑陋的黑客开始换行并保持缩进
诺雷奥克斯地图
诺雷奥克斯地图

我不喜欢它,但如果没有更好的方法……我想我会坚持这种方法。这种方法似乎一直有效,而公认答案中描述的“cc”方法似乎不适用于Python文件。s或cc……不起作用(如果我已经按下Esc键)。我仍然停留在行的开头。是否有特定的设置?不,应该是开箱即用。您确实需要自动缩进,我从问题开始就假设您需要自动缩进。我在10小时前错误地否决了此答案(我的意图是向上投票),现在在编辑答案之前,我无法切换我的投票:(Argh.+1对于这个,这真的很烦人。来吧,维姆。我们不再是1985年了,我们有千兆字节的RAM和太字节的存储空间,我们可以在文本文件的空行上留出一些字节的额外空间,以避免程序员的一些麻烦。
" ugly hack to start newline and keep indent
nnoremap o ox<BS>
nnoremap O Ox<BS>