2010-03-09 25 views
6

VIM'de C önişlemcisini katlamak mümkün müdür. Örneğin:Fold C Önişlemci VIM'de

#if defined(DEBUG) 
    //some block of code 
    myfunction(); 
#endif 

Ben hale gelecek şekilde katlayın istiyorum:

+-- 4 lines: #if defined(DEBUG)--- 

cevap

1

Bunun nedeni Vim'ın vurgulayarak motorun sınırlamalara olmayan Önemsiz: çok iyi çakışan bölge vurgulamak olamaz.

syn region cMyFold start="#if" end="#end" transparent fold contains=ALL 
" OR 
syn region cMyFold start="#if" end="#end" transparent fold contains=ALLBUT,cCppSkip 
" OR something else along those lines 
" Use syntax folding 
set foldmethod=syntax 

Bu muhtemelen olacak: contains= seçeneğiyle ilgili

  1. Kullanım dizim ve kadara (muhtemelen bazı eklentileri bağlıdır) sizin için çalışan sonu: gördüğüm kadarıyla İki seçeneğiniz vardır Çok fazla uğraşmak zorunda kalmazsınız ve asla tatmin edici bir şekilde çalışmazsınız. Bunu vimfiles/after/syntax/c.vim veya ~/.vim/after/syntax/c.vim'a koyun.

  2. Katlama işaretçileri kullanın. Bu işe yarayacak, ancak parantez ya da hoşunuza gidebilecek başka herhangi bir şey üzerinde katlanamazsınız. ~/.vim/after/ftplugin/c.vim koy (veya Windows üzerinde eşdeğer vimfiles yolu): Benim c.vim sözdizimi dosyasına aşağıdaki satırları ekleyerek benim sevme için çalışan almak mümkün oldum

    " This function customises what is displayed on the folded line: 
    set foldtext=MyFoldText() 
    function! MyFoldText() 
        let line = getline(v:foldstart) 
        let linecount = v:foldend + 1 - v:foldstart 
        let plural = "" 
        if linecount != 1 
         let plural = "s" 
        endif 
        let foldtext = printf(" +%s %d line%s: %s", v:folddashes, linecount, plural, line) 
        return foldtext 
    endfunction 
    " This is the line that works the magic 
    set foldmarker=#if,#endif 
    set foldmethod=marker 
    
0

:

syn match cPreConditMatch display "^\s*\zs\(%:\|#\)\s*\(else\|endif\)\>" 

+syn region cCppIfAnyWrapper start="^\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\s\+.*\s*\($\|//\|/\*\|&\)" end="^\s*\(%:\|#\)\s*endif\>" contains=TOP,cCppInIfAny,cCppInElseAny fold 
+syn region cCppInIfAny start="^\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\s\+.*\s*\($\|//\|/\*\|&\)" end="^\s*\(%:\|#\)\s*\(else\s*\|elif\s\+\|endif\)\>"me=s-1 containedin=cCppIfAnyWrapper contains=TOP 
+syn region cCppInElseAny start="^\s*\(%:\|#\)\s*\(else\|elif\)" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 containedin=cCppIfAnyWrapper contains=TOP 

if !exists("c_no_if0") 
İlgili konular