6

有没有人知道或知道可以很好地缩进 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;
};
4

2 回答 2

4

我的解决方案:

" 不要缩进命名空间和模板
功能!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()
万一
于 2010-06-11T08:04:20.830 回答
2

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

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

于 2008-12-23T03:08:55.010 回答