如何将vim设置为不在C ++中缩进命名空间内容?
namespace < identifier >
{
< statement_list > // Unwanted indentation
}
令人惊讶的是,'cinoptions'没有提供编辑命名空间内容缩进的方法。
答案 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)
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"
答案 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
因为我将大括号放在下一行专门用于命名空间,所以它可以实现我想要的功能,但如果你将该风格用于其他函数声明,则它可能不起作用等等。