如何折叠“#if ... #endif”,但跳过“{”之间?

时间:2013-01-30 14:20:32

标签: vim

我将此行添加到~/.vimrc以折叠C宏#if ... #endif

au FileType h,c,cpp syn region zhouzmFoldIf start="^\s*#if" end="^\s*#endif" fold transparent extend

大部分时间都运作良好。但如果中间有{,则无法正确折叠。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

In this vim_use thread,讨论了这个问题。 Ben Fritz发布了以下解决方案。

" fold #if...#else...#endif constructs
syn region IfFoldContainer
    \ start="^\s*#\s*if\(n\?def\)\?\>"
    \ end="#\s*endif\>"
    \ skip=+"\%(\\"\|[^"]\)\{-}\\\@<!"\|'[^']\{-}'\|'\\''\|//.*+
    \ transparent
    \ keepend extend
    \ containedin=NONE
    \ contains=SynFoldIf,SynFoldElif,SynFoldElse
syn region SynFoldIf
    \ start="^\s*#\s*if\(n\?def\)\?\>"
    \ end="^\s*#\s*el\(se\|if\)\>"ms=s-1,me=s-1
    \ skip=+"\%(\\"\|[^"]\)\{-}\\\@<!"\|'[^']\{-}'\|'\\''\|//.*+
    \ fold transparent
    \ keepend
    \ contained
    \ nextgroup=SynFoldElif,SynFoldElse
    \ contains=TOP
syn region SynFoldElif
    \ start="^\s*#\s*elif\>"
    \ end="^\s*#\s*el\(se\|if\)\>"ms=s-1,me=s-1
    \ skip=+"\%(\\"\|[^"]\)\{-}\\\@<!"\|'[^']\{-}'\|'\\''\|//.*+
    \ fold transparent
    \ keepend
    \ contained
    \ nextgroup=SynFoldElse
    \ contains=TOP
syn region SynFoldElse
    \ start="^\s*#\s*else\>"
    \ end="^\s*#\s*endif\>"
    \ skip=+"\%(\\"\|[^"]\)\{-}\\\@<!"\|'[^']\{-}'\|'\\''\|//.*+
    \ fold transparent
    \ keepend
    \ contained
    \ contains=TOP