2008-12-22 15 views
5

Quelqu'un at-il ou sait à propos de vim plugin/macro/fonction qui indent gentiment les modèles C++?Indentation Vim pour les templates C++?

Lorsque je souligne la définition du modèle dans vim .hpp/.h et indenter avec « = » je reçois quelque chose comme ceci:

>  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; 
>     }; 

Je pense que le cindent aligne la déclaration struct/classe avec la fermeture support ">". Je voudrais finir avec quelque chose comme ça, ou similaire, la mise en forme exacte n'a pas d'importance, dans la mesure où il est formaté:

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; 
}; 

Répondre

1

Vous pouvez utiliser l'option identexpr spécifier tiret en évaluant un expression (c.-à- écrire une fonction de script vim). Cette fonction doit accepter une chaîne - la ligne - et renvoyer le nombre d'espaces à indenter. Cela vous donne la possibilité de renvoyer un niveau d'indentation pour cette condition de gabarit, ou de revenir à autoindent, smartindent ou cindent dans des situations normales de type C.

Here is an example that was created to handle the signals and slots extension of Qt. Il démontre retombée à la fonction cindent.

3

Ma solution:

 
" 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