vim和c ++ 11 lambda:自动缩进

时间:2011-11-09 09:11:11

标签: vim c++11

将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环境中,以便在外部按键进行格式化?

6 个答案:

答案 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

希望这有助于窥视。