I'm using Vim to edit Erlang code. I'm used to (most Erlang programmers do this) to indent Erlang code by the bracket scope they're in. For example,开发者_如何学运维 C is often indented one tab width inside curly brackets:
int main(void) {
printf("hello, world\n");
return 0;
}
In Erlang, it's common to indent based on the column where the bracket started:
?assertError({bad_options, [{foo, bar},
bad_option]},
lhttpc:request("http://localhost/", get, [], <<>>, 1000,
[bad_option, {foo, bar}])).
(Example above is indented to get the point across, not according to subjective beauty).
Tab width would be used if the block is started on a new line:
?assertError(
{bad_options, [{foo, bar}, bad_option]},
lhttpc:request(
"http://localhost/", get, [], <<>>, 1000,
[bad_option, {foo, bar}]
)
).
Relevant parts of my .vimrc:
set expandtab " Spaces for tabs "
set tabstop=4 " Tab width 4 "
set shiftwidth=4
set smarttab
set autoindent
" Enable filetype plugin "
filetype plugin on
filetype indent on
Is there a way to perform this indentation in Vim, and if so, how?
There is a fork of vimerl which implements "context aware indentation" instead of "static indentation": https://github.com/aszlig/vimerl.git
Seems to work, so I'll roll with that for a while.
This looks you need delve into the murky world of cindent
and cinoptions
. I believe that putting the following in your vimrc will partially meet your needs:
set cindent
set cinoptions+=(0
But the question is how this will affect other behaviour. See help cinoptions-values
for much more information. It should possible to achieve precisely what you want, but it might take some experimenting.
Hope this helps.
精彩评论