关于缩进:使用换行符Vim自动缩进

Vim Auto Indent with newline

如何让vim将光标放在从新行开始的大括号内,即使用| 表示光标位置:

1
2
3
class {
  |
}

现在我的设置只会这样做

1
2
class {
|}

我在.vimrc文件中得到了这个
set autoindent shiftwidth = 2 tabstop = 2 noexpandtab

基本上我只想要一个普通的IDE如何缩进它。

更新:

我找到了如何用inoremap { {}O做到这一点


我发现delimitMate正是你所描述的和更多(即自动插入结尾})。请注意,您必须通过将let delimitMate_expand_cr=1添加到配置来告诉delimitMate扩展回车符。

根据我的观察,这正是TextMate和SublimeText中的行为。


我有Ubuntu 12.04,我在主目录中找不到vimrc文件。全局vimrc文件位于/etc/vim/vimrc中。

这个文件几乎没有。所以对我而言,它将这3行添加到/etc/vim/vimrc的末尾

1
2
3
set autoindent
set cindent
inoremap { {<CR>}<up><end><CR>

当您下次键入{时,它将通过组合{,Enter,},up,end,Enter进行更改。 cindentautoindent将添加所需数量的Tab。

附:我不善于调整vim所以一些解释可能不那么准确。这就是我认为它的工作原理。


把它放在.vimrc中:

1
imap <C-Return> <CR><CR><C-o>k<Tab>

假设autoindentsmartindent设置正确,在大括号之间键入Ctrl + Return会将光标放在您想要的位置。


autoindent指的是它将当前的压痕水平带到后续的线上。要根据语法缩进它,您还需要指定一个标志,如smartindentcindent


我在.vimrc中写了这个

1
2
3
4
5
6
7
8
9
10
11
12
inoremap <expr> <CR> InsertMapForEnter()
function! InsertMapForEnter()
    if pumvisible()
        return"\<C-y>"
    elseif strcharpart(getline('.'),getpos('.')[2]-1,1) == '}'
        return"\<CR>\<Esc>O"
    elseif strcharpart(getline('.'),getpos('.')[2]-1,2) == '</'
        return"\<CR>\<Esc>O"
    else
        return"\<CR>"
    endif
endfunction

上面的代码首先检查您是否使用Enter确认代码完成,否则当您键入Enter时它会缩进{|}。此外,它提供HTML标签自动缩进。

对于你的问题:

1
class {|}

Enter即可获得

1
2
3
class {
    |
}
1
<html>|<html>

Enter即可获得

1
2
3
<html>
    |
</html>

在文件的底部,我正在使用:

1
# vim: ts=2 sw=2 sts=2 sr noet st ai si

例如Dockerfile

1
2
3
4
5
FROM centos-7
RUN ...
CMD ...

# vim: ts=2 sw=2 sts=2 sr noet st ai si

如果只想保留缩进,请使用# vim: st ai si