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

fre*_*ass 29 c++ vim indentation auto-indent

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

namespace < identifier >
{
    < statement_list > // Unwanted indentation
}
Run Code Online (Sandbox Code Playgroud)

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

mml*_*mlb 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();
  }                          }
Run Code Online (Sandbox Code Playgroud)

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


wil*_*ell 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()
Run Code Online (Sandbox Code Playgroud)

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

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