如何在Vim中按Esc后保留缩进

mih*_*hai 11 vim

我有set autoindent
一条线,按A键,然后<CR>让我到下一行并插入一个缩进.但是,如果按Esc键,光标会跳到行的开头,缩进就会消失.
我必须继续并按标签再次到达正确的位置.

我知道帮助说:

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.
Run Code Online (Sandbox Code Playgroud)

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

Eda*_*aor 6

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

没有方法来禁用此,但幸运的是,你不需要,而是因为:

使用S或输入插入模式cc.再次S进入插入模式将进入具有适当缩进级别的插入模式,这使得Vim删除了不重要的缩进.

注意:我发现这个技巧对我来说很有用.但由于某种原因,它不适用于Python文件.我猜这是与Python文件类型混淆自己的缩进函数,或者沿着这些行的东西.

编辑:

另一个技巧,你可以用一种方式定义cpoptions,如果你在一个带缩进的行上并移动光标,它将保留缩进.这不会解决你Esc立刻遇到的问题,但这是一个可能也困扰你的相关问题.


mih*_*hai 4

好吧,我明白了。

根据 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
Run Code Online (Sandbox Code Playgroud)

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