How to set vim to not indent namespace content in C++?
namespace < identifier >
{
< statement_list > // Unwanted indentation
}
cpp.vim will solve your problem, but if you don't want the full-blown Google coding style then just take a peek at the plugin source and see how it handles namespaces. It's super simple:
function! IndentNamespace()
let l:cline_num = line('.')
let l:pline_num = prevnonblank(l:cline_num - 1)
let l:pline = getline(l:pline_num)
let l:retv = cindent('.')
while l:pline =~# '\(^\s*{\s*\|^\s*//\|^\s*/\*\|\*/\s*$\)'
let l:pline_num = prevnonblank(l:pline_num - 1)
let l:pline = getline(l:pline_num)
endwhile
if l:pline =~# '^\s*namespace.*'
let l:retv = 0
endif
return l:retv
endfunction
setlocal indentexpr=IndentNamespace()
In essence all you do is match the last non-blank line against /^\s*namespace/, and if it matches return 0 (as the indent position for indentexpr); otherwise return Vim's builtin cindent mechanism's value.
I essentially stole the code from the plugin, stripped anything that isn't namespace-related and renamed the indent function to IndentNamespace(). Save this as ~/.vim/indent/cpp.vim.
As many have mentioned Google C++ style is quite good.
I 'd recommend to install clang-format which I find it better than the recommended plugins, and then install a vim plugin on top.
sudo apt-get install clang-format
// or for older versions:
sudo apt-get install clang-format-3.6
brew install clang-format
rhysd/vim-clang-format
Install using your favorite plugin manager.
Checkout the plugin's link for more options. The default style is google, but there is also llvm and others.
One option you might need if you are using a custom version of the command is for
example:
let g:clang_format#command ="clang-format-3.6"
I use cpp.vim which is inspired by the Google C++ Style Guide. Among other things, that script does what you're asking.
I've configured vim to not indent for the namespace. These are the relevant lines in my vimrc:
autocmd Filetype cpp set shiftwidth=2
set cino=>2(0^-2g0h2
Frankly, I don't remember how to interpet the cino statement, but :help cinoptions should help in deciphering it. One caveat: I think it's configured to not indent when using a format like so:
namespace foo
{ // <- curly bracket on next line
...
versus
namespace foo { // <- same line
Since I put the curly bracket on the next line exclusively for namespaces, it does what I want, but it might not work if you use that style for other function declarations, for, etc.
Not sure when it was introduced but my installed version of vim, v7.3.353 has a cino option that handles cpp namespace explicitly. I am currently using the example value:
cino=N-s
and as per :help cinoptions-values
NN Indent inside C++ namespace N characters extra compared to a
normal block. (default 0).
cino= cino=N-s
namespace { namespace {
void function(); void function();
} }
namespace my namespace my
{ {
void function(); void function();
} }
The link the OP posted is for v7.3.162