将vim与c ++ 11使用lambda函数实际上很差。缩进不起作用,许多括号被标记为错误。
据我所知,c和c ++的缩进和语法高亮是在内部编程而不是通过c [...]。vim文件。有没有机会为c ++ 11设置vim,特别是对于具有lambda函数的源代码?也许有人可以在内部vim语法检查中提示如何以及在何处添加lambda解析?
编辑:(评论中要求的示例代码)
代码应该类似于以下示例,但格式化为单个列。
MyLoop( [](int a, int b){
{
::i++;
for (;;)
{
SomeFunc();
}
cout << "Result: " << a*b<<endl;
}
});
vim 7.4更新: 现在vim不再将lambda表达式作为错误处理,但它仍然没有在lambda表达式中进行任何缩进,因此它仍然不能用于c ++: - (
BTW:有没有一个好的自动格式化工具可以添加到vim环境中,以便在外部按键进行格式化?答案 0 :(得分:16)
Vim 7.4现在有一个jN
cinoption用于&#34;正确缩进Java匿名类。&#34; (:help java-cinoptions
)这改进了C ++ 11的lambda的缩进行为。
使用这些选项(放入〜/ .vim / after / ftplugin / cpp.vim):
setlocal cindent cino=j1,(0,ws,Ws
如果我将你的for循环开启括号移到同一行(否则它很疯狂),那么vim就会缩小你的代码:
MyLoop( [](int a, int b){
{
::i++;
for (;;) {
SomeFunc();
}
cout << "Result: " << a*b<<endl;
}
});
它也没有给你想要的悬挂缩进。如果您将初始开口支撑移动到它自己的线上,那么您将获得所需的悬挂缩进。
有关所有选项,请参阅:help cinoptions-values
。
如果您想要更智能的缩进计划,this user recommends set equalprg=clang-format
使用ClangFormat,那么=ip
将缩进当前段落。当您输入时,这不会使vim正确缩进(您需要为此设置indentexpr并且这非常复杂)。
还有a vim plugin似乎与设置equalprg相同,但代码更多。不确定它是否更好。它应该是clang-format.py的替代品(来自Cyprian Guerra的答案)。
答案 1 :(得分:1)
使用
:let c_no_curly_error = 1
例如,你可以把它放到你的vimrc中。
至于你的假设,这是错误的。有一个c.vim
语法文件(在vim运行时)。您可以在:help c.vim
中查看引用,并通过在vim运行时路径(:echo &rtp
)中查找它来实现。
答案 2 :(得分:1)
Michael Small有this项目。我还没有尝试过,但也许这就是你要找的东西。
答案 3 :(得分:0)
设置smartindent autoindent
然后在vim中输入上面的代码,你会得到正确的缩进。
但,如果您使用gg = G或包含“=”的命令重新缩进上面的代码,则缩进仍然是错误的。
答案 4 :(得分:0)
你似乎要寻找的是来自LLVM家伙的clang-format.py或来自Linda_pp aka rhysd的vim-clang-format(感谢后者的idbrii) - 两者都使用clang
因此都支持所有的C ++ 11新结构,您可以按如下方式运行它:
:pyf ~/src/llvm.git/tools/clang/tools/clang-format/clang-format.py
或 :ClangFormat
后者似乎更好,因为它(以及其他功能)允许在每个环境中遵循&#34;一个配置文件以获得相同的行为&#34;规则,尤其是当您使用VIM加载项管理器(例如VAM)时。
答案 5 :(得分:0)
我只是挣扎了几天,看起来像在cindent启用smartindent切换帮助我在C ++ 11中使用lambda缩进。
在你的〜/ .vimrc
中set cindent
set smartindent
希望这有助于窥视。