如何设置vim在C++中不缩进命名空间的内容?
namespace < identifier >
{
< statement_list > // Unwanted indentation
}
出人意料的是,'cinoptions' 并没有提供一种编辑命名空间内容缩进的方法。
如何设置vim在C++中不缩进命名空间的内容?
namespace < identifier >
{
< statement_list > // Unwanted indentation
}
出人意料的是,'cinoptions' 并没有提供一种编辑命名空间内容缩进的方法。
不确定它是何时引入的,但我安装的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版本
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文件。
很多人都提到了Google C++风格非常不错。
我建议安装clang-format
,我发现它比推荐的插件更好,然后在其上安装vim插件。
sudo apt-get install clang-format
// or for older versions:
sudo apt-get install clang-format-3.6
brew install clang-format
使用您喜欢的插件管理器进行安装。
查看插件链接以获取更多选项。默认样式为google
,但也有llvm
和其他样式。
如果您正在使用自定义版本的命令,则可能需要一个选项,例如:
示例:
let g:clang_format#command ="clang-format-3.6"
我已经配置了vim,使其不缩进命名空间。这是我vimrc中相关的行:
autocmd Filetype cpp set shiftwidth=2
set cino=>2(0^-2g0h2
:help cinoptions
应该有助于解密它。一个注意点:我认为它配置为在使用以下格式时不缩进:namespace foo
{ // <- curly bracket on next line
...
对比
namespace foo { // <- same line
由于我专门将花括号放在下一行以用于命名空间,所以它可以实现我想要的效果,但如果您在其他函数声明、for循环等中使用该样式,则可能无法正常工作。
cino=N0
相等吗? - nn0p