2008-12-22 18 views
5

Güzel bir şekilde C++ şablonları belirleyen vim eklentisi/makro/işlevi olan veya olan herhangi biri var mı? Ben vim .hpp/.h dosyasında şablon tanımını vurgulamak ve onu girinti zamanC++ şablonları için Vim girinti?

'=' Böyle bir şey olsun:

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

Ben cindent kapanış ile yapı/sınıf beyanı hizalar düşünüyorum '>' dirseği. Ben biçimlendirilir kadarıyla böyle bir şey, ya da fark etmez benzer, tam biçimlendirme ile bitirmek istiyorum:

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

cevap

1

Sen değerlendirerek girinti belirtmek için identexpr seçeneğini kullanabilirsiniz bir expression (yani vim komut dosyası yazma. Bu işlev bir dizeyi - satır - kabul etmeli ve girintiye yer açmak için boşluk sayısını döndürmelidir. Bu size, bu şablon koşulu için bir girinti düzeyi döndürme esnekliği sağlar veya normal, C benzeri durumlarda autoindent, smartindent veya cindent'a geri dönme.

Here is an example that was created to handle the signals and slots extension of Qt. Bu, cindent işlevine geri gitmeyi gösterir.

3

Çözümümün:

 
" 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