用于c ++模板的Vim缩进?

ste*_*anB 6 c++ vim templates pretty-print indentation

有没有人知道或者知道vim插件/宏/函数是否能很好地缩进c ++模板?

当我在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;
>                   };
Run Code Online (Sandbox Code Playgroud)

我认为cindent将struct/class声明与结束括号">"对齐.我想最终得到类似的东西,或类似的,确切的格式无关紧要,只要格式化:

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;
};
Run Code Online (Sandbox Code Playgroud)

che*_*eng 5

我的解决方案:

" 不要缩进命名空间和模板
功能!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)
    while 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 = 缩进(l:pline_num)
    if l:pline =~# '^\s*template\s*\s*$'
        让 l:retv = l:pindent
    elseif l:pline =~# '\s*类型名称\s*.*,\s*$'
        让 l:retv = l:pindent
    elseif l:cline =~# '^\s*>\s*$'
        让 l:retv = l:pindent - &shiftwidth
    elseif l:pline =~# '\s*类型名称\s*.*>\s*$'
        让 l:retv = l:pindent - &shiftwidth
    elseif l:pline =~# '^\s*命名空间.*'
        让 l:retv = 0
    万一
    返回l:retv
结束函数

如果有(“autocmd”)
    autocmd BufEnter *.{cc,cxx,cpp,h,hh,hpp,hxx} setlocal indentexpr=CppNoNamespaceAndTemplateIndent()
万一


Jud*_*den 2

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

这是一个为处理 Qt 的信号和槽扩展而创建的示例。它演示了 cindent 函数的回退。