在空白行上使用“cc”,“S”或“] p”时,自动缩进失败

时间:2011-08-21 06:01:38

标签: vim indentation

如果我在光标“|”时尝试“cc”或“S”在以下位置......

public function blah()
{
    var i = 0;
|
    i++
    return i;
}

...它停留在第1列,而不是在“var”中的v下移动。粘贴“] p”也从第1列开始粘贴。

如果有帮助,我的设置是:autoindent, smartindent, nocindent, indentexpr=在MacVim上。

根据以下SO问题,应该可以正确缩进:
Vim: Smart indent when entering insert mode on blank line?
Vim: Indent current (blank) line and insert
Autoindent in vim always empty the line if there are only whitespace in it, can I change that?

在上一篇文章中,trVoldemort遇到了同样的问题(请参阅第二个答案的评论)。

4 个答案:

答案 0 :(得分:2)

从手册:

                            *cc*
["x]cc          Delete [count] lines [into register x] and start
                insert |linewise|.  If 'autoindent' is on, preserve
                the indent of the first line.

                            *S*
["x]S           Delete [count] lines [into register x] and start
                insert.  Synonym for "cc" |linewise|.

由于您要删除的行没有缩进,因此会保留该缩进。 如果在该行中插入空格,以便 $ 将光标放在此处:

public function blah() {
    var i = 0;
    |
    i++
    return i;
}

然后按 0 返回第一列,最后按 S ,您将得到所需的结果。

我意识到这只能解释当前的行为,但不会直接解决您的问题,但我不确定是否有一个干净的方法来解决您的问题。我倾向于建议做这样的映射:

:nnoremap cc ddko
:nnoremap S ddko

这些 dd 删除当前行, k 向上移动到上一行, o 打开以下行的输入(使用smartindent到提供缩进)。

答案 1 :(得分:1)

开启cindent ...

:set cindent

这适用于缩进“cc”和“S”,只要该语言具有与C类似的缩进(或支持cindent)。

但是,智能缩进粘贴(]p)仍然无法在空行上工作。为此,重新映射]p如下:

:nnoremap ]p oX<Esc>]pk"_dd

这将在执行重新缩进粘贴之前在正确的缩进处创建一个新行。然后它返回并删除该行,确保不覆盖默认缓冲区。

您还可以重新映射智能缩进粘贴的替代版本:

:nnoremap ]P OX<Esc>]pk"_dd
:vnoremap ]p "_xkoX<Esc>]pk"_dd
:vnoremap ]P "_xkoX<Esc>]pk"_dd

答案 2 :(得分:1)

可以在应用ccS]p之前明确自动缩进行。 以下映射。

:nnoremap <leader>cc i.<esc>==S
:nnoremap <leader>]p ]p`[v`]=

一般来说,===命令的效果并不完全相同 与autoindent选项在cc]p上的效果相同(尤其如此) 如果是自定义equalprg),但结果行为似乎与您的相符 描述

答案 3 :(得分:0)

当我使用:filetype indent on时,在该行上按 cc 会使其正确缩进。