2008-12-22 38 views
5

Có ai có hoặc biết về plugin vim/macro/chức năng mà indents độc đáo c + + mẫu?Vim thụt đầu dòng cho mẫu C++?

Khi tôi làm nổi bật mẫu định nghĩa trong vim .hpp/file .h và indent nó với '=' tôi nhận được một cái gì đó như thế này:

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

Tôi nghĩ rằng cindent gắn việc khai báo struct/lớp với đóng cửa khung '>'. Tôi muốn kết thúc với một cái gì đó như thế này, hoặc tương tự, định dạng chính xác không quan trọng, như xa như nó được định dạng:

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

Trả lời

1

Bạn có thể sử dụng tùy chọn identexpr để xác định thụt lề bằng cách đánh giá một expression (tức viết một hàm vim script). Hàm này sẽ chấp nhận một chuỗi - dòng - và trả về số không gian để thụt lề. Điều này cho phép bạn linh hoạt trả lại mức thụt lề cho điều kiện mẫu này hoặc quay lại autoindent, smartindent hoặc cindent trong các trường hợp bình thường như C.

Here is an example that was created to handle the signals and slots extension of Qt. Nó thể hiện sự trở lại đối với hàm cindent.

3

Giải pháp của tôi:

 
" 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 
Các vấn đề liên quan