6 Stimmen

Vim Einrückung für C++ Vorlagen?

Hat jemand oder wissen über Vim-Plugin/Makro/Funktion, die schön C++-Vorlagen einrücken?

Wenn ich die Schablonendefinition in der vim .hpp/.h-Datei markiere und mit '=' einräume, erhalte ich 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, der Cindent richtet die Struktur-/Klassendeklaration an der schließenden Klammer '>' aus. Ich würde gerne so oder so ähnlich enden, die genaue Formatierung spielt keine Rolle, Hauptsache, es ist formatiert:

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

4voto

chen3feng Punkte 121

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

2voto

Judge Maygarden Punkte 25975

Sie können die identexpr Option, um den Einzug durch Auswertung einer Ausdruck (d.h. das Schreiben einer Vim-Skriptfunktion). Diese Funktion sollte eine Zeichenkette - die Zeile - akzeptieren und die Anzahl der einzurückenden Leerzeichen zurückgeben. Dies gibt Ihnen die Flexibilität, eine Einrückungsebene für diese Vorlagenbedingung zurückzugeben oder auf autoindent , smartindent o cindent in normalen, C-ähnlichen Situationen.

Hier ist ein Beispiel, das erstellt wurde, um die Signale und Slots Erweiterung von Qt zu behandeln. Sie demonstriert den Rückgriff auf die Funktion cindent.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X