如何避免vim中的命名空间内容缩进?

时间:2010-03-30 21:54:49

标签: c++ vim indentation auto-indent

如何将vim设置为不在C ++中缩进命名空间内容?

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

令人惊讶的是,'cinoptions'没有提供编辑命名空间内容缩进的方法。

5 个答案:

答案 0 :(得分:32)

不确定它何时推出但是我安装的vim版本,v7.3.353有一个cino选项,可以显式处理cpp命名空间。我目前正在使用示例值:

cino=N-s

并按照: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();
  }                          }

OP发布的链接是针对v7.3.162

答案 1 :(得分:11)

cpp.vim将解决您的问题,但如果您不想要完整的Google编码风格,那么只需看一眼插件源并查看它如何处理命名空间。这非常简单:

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()

实质上,您所做的就是将最后一个非空行与/^\s*namespace/匹配,如果匹配则返回0(作为indentexpr的缩进位置);否则返回Vim内置的cindent机制的值。

我基本上从插件中窃取了代码,剥离了与命名空间无关的任何内容,并将缩进函数重命名为IndentNamespace()。将其保存为〜/ .vim / indent / cpp.vim。

答案 2 :(得分:1)

我使用了受Google C ++风格指南启发的cpp.vim。除此之外,该脚本可以满足您的要求。

答案 3 :(得分:1)

很多人都提到Google C ++风格相当不错。 我建议安装clang-format,我发现它比推荐的插件更好,然后在顶部安装vim插件。

安装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插件:

rhysd/vim-clang-format

使用您喜欢的插件管理器安装。 查看插件的链接以获取更多选项。默认样式为google,但也有llvm和其他。

如果您使用命令的自定义版本,则可能需要的一个选项是

示例:

let g:clang_format#command ="clang-format-3.6"

答案 4 :(得分:0)

我已将vim配置为不缩进命名空间。这些是我的vimrc中的相关行:

autocmd Filetype cpp set shiftwidth=2
set cino=>2(0^-2g0h2

坦率地说,我不记得如何插入cino语句,但:help cinoptions应该有助于解读它。一个警告:我认为在使用这样的格式时它被配置为不缩进:

namespace foo 
{ // <- curly bracket on next line
...

namespace foo { // <- same line

因为我将大括号放在下一行专门用于命名空间,所以它可以实现我想要的功能,但如果你将该风格用于其他函数声明,则它可能不起作用等等。