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