Question

How to set vim to not indent namespace content in C++?

namespace < identifier >
{
    < statement_list > // Unwanted indentation
}

Surprisingly, 'cinoptions' doesn't provide a way to edit namespace content indentation.

Was it helpful?

Solution

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

OTHER TIPS

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.

I use cpp.vim which is inspired by the Google C++ Style Guide. Among other things, that script does what you're asking.

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.

Install clang-format

Ubuntu:

sudo apt-get install clang-format
// or for older versions:
sudo apt-get install clang-format-3.6

Mac:

brew install clang-format

Vim plugin:

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'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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top