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

时间:2012-04-28 13:46:07

标签: 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.

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

7 个答案:

答案 0 :(得分:6)

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

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

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

注意:我发现这个技巧对我来说很有用。但出于某种原因,它确实使用Python文件。我猜这与使用自己的缩进函数的Python文件类型有关,或类似的东西。

编辑:

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

答案 1 :(得分:3)

好吧,我想出来了。

根据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 时,它将插入与前一个非空白行相同的缩进。

答案 2 :(得分:2)

考虑我使用&#39; o&#39;开始换行。我在_vimrc中添加了以下配置(注意我有&#39;:设置autoindent&#39;)

" ugly hack to start newline and keep indent
nnoremap o ox<BS>
nnoremap O Ox<BS>

答案 3 :(得分:1)

一种简单的方法是按'。' (或任何字符),转义,然后按x删除字符。缩进应该保留。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

值得注意的是,使用适当的插件Scc似乎再次正常工作。很可能是python-mode正在解决这个问题。

https://github.com/klen/python-mode

答案 6 :(得分:0)

我想要达到同样的效果,但因为我希望the plugin showing indent正常工作。这是我的解决方法:我发现在正常模式下<enter>几乎没用。它只将光标向下移动一行,这可以通过j实现。

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

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

每当我需要一个空行来缩进时,我会改为使用<enter>