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

19

我使用了set autoindent

我到达一行后,按下A和<CR>,然后跳转到下一行并插入一个缩进。但是如果我按Esc键,光标会跳到该行的开头,并且缩进会消失。
我必须再次按Tab键才能回到正确的位置。

我知道帮助文档上说:

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.

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


2
这真的很烦人,我赞同+1。拜托了,VIM。我们已经不是1985年了,我们有千兆字节的内存和万亿字节的存储空间,我们可以在文本文件中多留一些空格来减轻程序员的麻烦。 - QuadrupleA
对于任何感兴趣的人,帮助文档来自选项 autoindent - jdhao
7个回答

9

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

没有办法去除这种行为,但幸运的是,你不需要去除它,因为:

使用Scc进入插入模式。再次使用S将以正确的缩进级别进入插入模式,因此Vim删除缩进的事实就不重要了。

注意:我发现这个技巧在大多数情况下对我有效。但由于某些原因,在Python文件中并不起作用。我猜想这可能与Python文件类型搞乱了自己的缩进函数有关,或者类似的问题。

编辑:

另一个技巧是,您可以定义cpoptions,以便如果您在具有缩进的行上移动光标,它将保留缩进。这无法解决您立即按下Esc的问题,但可能还会让您苦恼的其他相关问题。


S或cc...在我按下Esc之后不起作用。我仍然卡在行的开头。这个问题有特定的设置吗? - mihai
不需要,应该可以直接使用。你需要打开自动缩进,我从问题中猜测你已经打开了。 - Edan Maor

4

好的,我明白了。

根据Edan Maor的回答,Scc应该以正确的缩进级别进入插入模式。
...除非它不起作用 :)

这种方法在两种情况下有效。

  • 当设置 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

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

1
我10小时前误操作将此回答点踩了(本意是点赞),现在除非该回答被编辑,否则我无法更改我的投票。:( - Immanuel Weihnachten

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

1
我不喜欢这样,但如果没有更好的方法...我想我只能被困在这里了。 - mihai
这种方法似乎一直有效,而已验收答案中描述的“cc”方法似乎无法用于Python文件。 - Gearoid Murphy

3

假设我使用'o'来开始一个新行。我在_vimrc中添加了以下配置(请注意,我已经使用':set autoindent')

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

2

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


1

0
我想要达到相同的效果,但是因为我想让插件显示缩进正常工作。这是我的解决方法:我发现在普通模式下<enter>几乎没用。它只能将光标向下移动一行,而这可以通过j实现。
所以我在我的.vimrc中添加了以下内容:
nmap <cr> o.<c-h><esc>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接