2008-12-22 92 views
5

有沒有人有或知道Vim插件/宏/函數,很好地縮進c + +模板?c + +模板的Vim縮進?

當我在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; 
}; 

回答

3

我的解決辦法:

 
" 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