Vim:在空白行进入插入模式时智能缩进?

53

当我通过'o'打开新行时,我的光标跳转到下一行的正确缩进位置。另一方面,当我的光标在空行上进入插入模式时,它不会移动到正确的缩进位置。

如何使vim在空行上进入插入模式(通过i)时正确缩进我的光标?

3个回答

93

cc会替换当前行的内容并在正确的缩进位置进入插入模式 - 因此在空行上将完全做到你想要的效果。

我认为你描述的i的行为是正确的,因为有许多情况下,你希望在空行的特定位置插入,而不是跳转到vim猜测你要插入的任何位置。


2
我的解决方案只会在该行为空时使“i”以那种方式运作 - 所以只有一个使用情况。在所有其他情况下,“i”将正常运作。话虽如此,cc是内置的并且更合适,我认为。接受。 - Dane O'Connor
我喜欢 Vim 的原因是无论你使用它多久,每天仍然可以学到新的东西。我每天都广泛使用 dd、yy 和 c 以及其他修饰符,从未想过尝试 cc。+1 - Matt Briggs
2
对我来说,如果在前一行和你想要缩进的行之间有一个空行,这个方法就不起作用。(即你按了两次 o,因为你想在前一行和下一段代码之间留出空格。)我仍然希望能够快速进入插入模式,并且缩进到实际代码的前一行的缩进级别。 - ELLIOTTCABLE
只有在激活了 cindent 后,这才开始对我起作用,使用 smartindentcc 的工作方式并不像描述的那样。 - pcworld
我同意@ELLIOTTCABLE的观点。这就是我来到这里的原因。关于sml的评论“许多用例...”。也许吧,但对我来说只有大约2%的时间需要这样做,即在这种情况下我可以回到开头。98%的时间,我想使用我的当前缩进级别。 - Myles Prather

14

实际上这并不像我想象中的那么糟糕。启用此功能的一种方法是将以下内容添加到您的 ~/.vimrc 中。

"smart indent when entering insert mode with i on empty lines
function! IndentWithI()
    if len(getline('.')) == 0
        return "\"_ccO"
    else
        return "i"
    endif
endfunction
nnoremap <expr> i IndentWithI()

当你从插入模式按下'i'键时,它会简单地检查一个空行。如果你确实在一个空行上,则会删除该行并打开一个新行,有效地利用了"开放行"的工作行为。

注意:"_在cc之前可以确保你的寄存器不被清除。


我发现 ccO 也不起作用,但是 ddko 可以(删除当前行,跳转到上一行,添加新行)。 - Edward Hughes
1
我不得不将"\"_ccO"更改为"\"_cc",它会插入字母O,我不确定为什么会出现这种情况。除此之外,这个函数非常有帮助,谢谢。 - Connor
使用这个工具几天后,我改变了它的行为,现在使用 a 而不是 i,因为对我来说这更符合逻辑,我认为它们是在隐式缩进的不同侧。所以 i 仍然在最左边插入,而 a 在自动缩进后附加。 - Connor

10

在空行上,要正确缩进地进入插入模式,您可以简单地使用s

请注意,scl的同义词,因此如果您实际上不在空行上,它会删除一个字符而不是缩进。在这种情况下,最好使用cc,就像18个月前sml建议的那样。但是我经常使用这个快捷方式来提高我的VimGolf得分,所以想提一下。;)


2
谢谢你的建议!我每天都在学习关于vim的新知识。 - Dane O'Connor
1
@DaneO'Connor 我们都是! :) - Enrico

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