2008-12-22 8 views
5

Hat jemand vim plugin/macro/function, die schön C++ - Vorlagen einbezieht oder kennt?Vim Einzug für C++ Vorlagen?

Wenn ich Template-Definition in vim .hpp/h-Datei markieren und einrücken es mit ‚=‘ ich so etwas wie dieses:

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

Ich denke, die cindent die Struktur/Klassendeklaration mit dem Schließen ausrichtet Klammer '>'. Ich mag mit so etwas enden, oder ähnlicher, genauer Formatierung spielt keine Rolle, soweit es formatiert ist:

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

Antwort

1

Sie die identexpr Option können indent angeben durch die Auswertung eines expression (dh eine vim Skriptfunktion schreiben). Diese Funktion sollte eine Zeichenfolge akzeptieren - die Zeile - und die Anzahl der Leerzeichen zurückgeben, die eingerückt werden sollen. Dies gibt Ihnen die Flexibilität, eine Einzugsebene für diese Vorlagenbedingung zurückzugeben oder in normalen, C-ähnlichen Situationen auf autoindent, smartindent oder cindent zurückzugreifen.

Here is an example that was created to handle the signals and slots extension of Qt. Es zeigt Fallback auf die Cindent-Funktion.

3

Meine Lösung:

 
" 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