代码之家  ›  专栏  ›  技术社区  ›  stefanB

C++模板的VIM缩进?

  •  5
  • stefanB  · 技术社区  · 16 年前

    有没有人知道或知道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;
    >                   };
    

    我认为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;
    };
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Judge Maygarden    16 年前

    你可以使用 identexpr 通过计算 expression (即编写VIM脚本函数)。这个函数应该接受一个字符串——行——并返回要缩进的空格数。这使您能够灵活地为此模板条件返回缩进级别,或者返回到 autoindent , smartindent cindent 在正常情况下,C类情况。

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

        2
  •  4
  •   chen3feng    14 年前

    我的解决方案:

    " Don't indent namespace and template
    function! CppNoNamespaceAndTemplateIndent()
        let l:cline_num = line('.')
        let l:cline = getline(l:cline_num)
        let l:pline_num = prevnonblank(l:cline_num - 1)
        let l:pline = getline(l:pline_num)
        while l:pline =~# '\(^\s*{\s*\|^\s*//\|^\s*/\*\|\*/\s*$\)'
            let l:pline_num = prevnonblank(l:pline_num - 1)
            let l:pline = getline(l:pline_num)
        endwhile
        let l:retv = cindent('.')
        let l:pindent = indent(l:pline_num)
        if l:pline =~# '^\s*template\s*\s*$'
            let l:retv = l:pindent
        elseif l:pline =~# '\s*typename\s*.*,\s*$'
            let l:retv = l:pindent
        elseif l:cline =~# '^\s*>\s*$'
            let l:retv = l:pindent - &shiftwidth
        elseif l:pline =~# '\s*typename\s*.*>\s*$'
            let l:retv = l:pindent - &shiftwidth
        elseif l:pline =~# '^\s*namespace.*'
            let l:retv = 0
        endif
        return l:retv
    endfunction
    
    if has("autocmd")
        autocmd BufEnter *.{cc,cxx,cpp,h,hh,hpp,hxx} setlocal indentexpr=CppNoNamespaceAndTemplateIndent()
    endif