如果我在光标“|”时尝试“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遇到了同样的问题(请参阅第二个答案的评论)。
答案 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)
可以在应用cc
,S
或]p
之前明确自动缩进行。
以下映射。
:nnoremap <leader>cc i.<esc>==S
:nnoremap <leader>]p ]p`[v`]=
一般来说,=
和==
命令的效果并不完全相同
与autoindent
选项在cc
或]p
上的效果相同(尤其如此)
如果是自定义equalprg
),但结果行为似乎与您的相符
描述
答案 3 :(得分:0)
当我使用:filetype indent on
时,在该行上按 cc 会使其正确缩进。