2008-12-22 8 views
5

क्या किसी को भी vim प्लगइन/मैक्रो/फ़ंक्शन के बारे में पता है या पता है जो अच्छी तरह से C++ टेम्पलेट्स को इंडेंट करता है?सी ++ टेम्पलेट्स के लिए विम इंडेंटेशन?

जब मैं vim .hpp/ज फ़ाइल में टेम्पलेट परिभाषा पर प्रकाश डाला और साथ यह इंडेंट '=' मैं कुछ इस तरह मिलती है:

>  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 समापन के साथ struct/वर्ग घोषणा संरेखित करता है ब्रैकेट '>'। मैं, कुछ इस तरह, या इसी तरह, वही प्रारूपण कोई फर्क नहीं पड़ता के साथ खत्म करना चाहते हैं जहाँ तक यह स्वरूपित है:

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

उत्तर

1

आप मूल्यांकन द्वारा मांगपत्र निर्दिष्ट करने के लिए identexpr विकल्प का उपयोग कर सकते हैं एक expression (यानी एक विम स्क्रिप्ट फ़ंक्शन लिखना)। इस फ़ंक्शन को एक स्ट्रिंग - लाइन स्वीकार करनी चाहिए - और रिक्त स्थान की संख्या इंडेंट में वापस करनी चाहिए। यह आपको इस टेम्पलेट की स्थिति के लिए इंडेंट स्तर वापस करने के लिए लचीलापन देता है, या autoindent, smartindent यासामान्य, सी-जैसी स्थितियों में गिरावट देता है।

Here is an example that was created to handle the signals and slots extension of Qt. यह सिंडेंट फ़ंक्शन पर गिरावट का प्रदर्शन करता है।

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