33

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

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

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

4

5 回答 5

36

不确定何时引入,但我安装的 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

于 2011-11-14T16:56:51.337 回答
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。

于 2010-03-30T22:42:16.757 回答
2

正如许多人所提到的,Google C++ 风格相当不错。我建议安装clang-format我觉得比推荐的插件更好的插件,然后在上面安装一个 vim 插件。

安装 clang 格式

Ubuntu:

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

苹果电脑:

brew install clang-format

Vim 插件:

rhysd/vim-clang 格式

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

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

例子:

let g:clang_format#command ="clang-format-3.6"
于 2016-05-06T10:54:28.677 回答
1

我使用受 Google C++ Style Guide 启发的cpp.vim 。除其他外,该脚本可以满足您的要求。

于 2010-03-30T22:23:30.580 回答
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

因为我将大括号放在下一行专门用于命名空间,所以它可以满足我的要求,但如果你将这种风格用于其他函数声明,for 等,它可能不起作用。

于 2010-03-31T00:52:28.927 回答