【问题标题】:Vim indentation for c++ templates?c++模板的Vim缩进?
【发布时间】:2008-12-22 23:40:38
【问题描述】:

有没有人知道或知道可以很好地缩进 c++ 模板的 vim 插件/宏/函数?

当我在 vim .hpp/.h 文件中突出显示模板定义并使用 '=' 缩进它时,我得到如下内容:

>     template <
>         class TFilter,
>               class TParser,
>               class TConsumer,
>               class TDataProcessor,
>               class TDataFeed,
>               class TSymbolMap
>                   >
>                   struct DataFeedTraits
>                   {
>                       typedef TFilter             Filter;
>                       typedef TParser<TSymbolMap> Parser;
>                       typedef TConsumer<Parser>   Consumer;
>                       typedef TDataProcessor<Filter,Consumer>  DataProcessor;
>                       typedef TDataFeed<Filter,DataProcessor,Parser,Ccnsumer> DataFeed;
>                   };

我认为 cindent 将结构/类声明与右括号“>”对齐。 我想最终得到这样的东西,或者类似的,确切的格式并不重要,只要它是格式化的:

template <
    class TFilter,
    class TParser,
    class TConsumer,
    class TDataProcessor,
    class TDataFeed,
    class TSymbolMap
    >
struct DataFeedTraits
{
    typedef TFilter             Filter;
    typedef TParser<TSymbolMap> Parser;
    typedef TConsumer<Parser>   Consumer;
    typedef TDataProcessor<Filter,Consumer> DataProcessor;
    typedef TDataFeed<Filter,DataProcessor,Parser,Ccnsumer> DataFeed;
};

【问题讨论】:

    标签: c++ vim templates pretty-print indentation


    【解决方案1】:

    我的解决方案:

    " 不要缩进命名空间和模板 功能! CppNoNamespaceAndTemplateIndent() 让 l:cline_num = line('.') 让 l:cline = getline(l:cline_num) 让 l:pline_num = prevnonblank(l:cline_num - 1) 让 l:pline = getline(l:pline_num) 而 l:pline =~# '\(^\s*{\s*\|^\s*//\|^\s*/\*\|\*/\s*$\)' 让 l:pline_num = prevnonblank(l:pline_num - 1) 让 l:pline = getline(l:pline_num) 结束时 让 l:retv = cindent('.') 让 l:pindent = indent(l:pline_num) 如果 l:pline =~# '^\s*template\s*\s*$' 让 l:retv = l:pindent elseif l:pline =~# '\s*typename\s*.*,\s*$' 让 l:retv = l:pindent elseif l:cline =~# '^\s*>\s*$' 让 l:retv = l:pindent - &shiftwidth elseif l:pline =~# '\s*typename\s*.*>\s*$' 让 l:retv = l:pindent - &shiftwidth elseif l:pline =~# '^\s*namespace.*' 让 l:retv = 0 万一 返回 l:retv 结束功能 如果有(“自动命令”) autocmd BufEnter *.{cc,cxx,cpp,h,hh,hpp,hxx} setlocal indentexpr=CppNoNamespaceAndTemplateIndent() 万一

    【讨论】:

      【解决方案2】:

      您可以使用identexpr 选项通过评估expression 来指定缩进(即编写vim 脚本函数)。这个函数应该接受一个字符串——行——并返回要缩进的空格数。这使您可以灵活地为此模板条件返回缩进级别,或者在正常的类似 C 的情况下回退到 autoindentsmartindentcindent

      Here is an example that was created to handle the signals and slots extension of Qt. 演示回退到 cindent 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        • 2012-04-15
        • 2017-08-12
        • 2013-03-20
        • 2013-12-30
        相关资源
        最近更新 更多