I'd like vim to recognise this formatting and indent next line
properly. Normally, Vim doesn't recognise the curly brace at the end
of line as end of block and use the same indent as previous line
Vim does recognize the curly brace at the end of the line if it is configured to do so. The most relevant option on this regard is the 'autoindent'
(see :help autoindent
). I tried your example in a .cpp file and Vim adjusts the indent of the next line correctly.
The Vim FAQ 14.10 explain how to disable it, but you can use it to understand how to configure it:
14.10. How do I turn off the automatic indentation of text?
By default, the automatic indentation of text is not turned on. Check
the configuration files (.vimrc, .gvimrc) for settings related to
indentation. Make sure the ":filetype indent on" command is not
present. If it is present, remove it. Also, depending on your
preference, you may also want to check the value of the 'autoindent',
'smartindent', 'cindent' and 'indentexpr' options and turn them off as
needed.
For more information, read
:filetype-indent-off
'autoindent'
'smartindent'
'cindent'
'indentexpr'
Edit:
At first my understanding was that you were unable to get any automatic indentation; from your comment I get that you want to change the default behavior of 'cindent'
. You can do that by changing a number of options:
27.2. How do I configure the indentation used for C/C++ files?
You can configure the Vim C indentation by modifying the value of the
'cinoptions', 'cinkeys' and 'cinwords' options.
For more information, read
'cindent'
'cinoptions'
'cinkeys'
'cinwords'
C-indenting
cinoptions-values
'smartindent'
The documentation on each entry is quite extensive, as it allows for very flexible configuration. After a quick search and tests I think it is not possible to achieve what do you want by using 'autoindent'
, 'cindent'
, or 'smartindent'
, thus you will have to use 'indentexpr'
. From :help C-indenting
:
There are in fact four main methods available for indentation, each one
overrides the previous if it is enabled, or non-empty for 'indentexpr':
'autoindent' uses the indent from the previous line.
'smartindent' is like 'autoindent' but also recognizes some C syntax to
increase/reduce the indent where appropriate.
'cindent' Works more cleverly than the other two and is configurable to
different indenting styles.
'indentexpr' The most flexible of all: Evaluates an expression to compute
the indent of a line. When non-empty this method overrides
the other ones. See indent-expression.
Besides giving many details, the :help 'indentexpr'
also suggests using the files on $VIMRUNTIME/indent directory as a starting point. The file $VIMRUNTIME/indent/ada.vim shows that you can set 'indentexpr'
to call a function, and inside that function you can parse the current and surrounding lines before returning the correct indentation number.
You could use some existing C/C++ indentation plugin in vim.org as a base, such as Indent file for Google C++ Coding Style.
{
and}
so just type them in the correct places. On the other hand, if you want something to reformat your code into that style, then you may want to look at the (poorly named) indent program.