编写C代码时,我使用GNU和K&R样式的混合。这意味着函数的返回值,每个参数和开放体大括号都在它自己的行上。我还想使用Vim的折叠功能,但使用foldmethod=syntax
,折叠看起来像这样:
是否可以在折叠摘要中看到函数名称而没有任何特殊折叠标记或foldexpr
s?
答案 0 :(得分:2)
如果您使用indent
折叠,可能是一个很好的折衷方案 - 是将foldminlines
参数设置为更高的数字。
:set foldmethod=indent
:set foldminlines=5
如果您的大多数功能很长,它只会影响您的参数列表。显而易见的缺点是,它会自动展开小于5行的小功能。
答案 1 :(得分:1)
尝试这个作为起点(我在我的vimrc中有它,但我在网上找到它):
" Folding {
function! CssFoldText()
let line = getline(v:foldstart)
let nnum = nextnonblank(v:foldstart + 1)
while nnum < v:foldend+1
let line = line . " " . substitute(getline(nnum), "^ *", "", "g")
let nnum = nnum + 1
endwhile
return line
endfunction
setlocal foldtext=CssFoldText()
setlocal foldmethod=marker
setlocal foldmarker={,}
setlocal fillchars=fold:/
setlocal foldlevel=-1
" highlight Folded term=underline cterm=bold gui=bold guifg=Blue guibg=Black
" highlight FoldColumn term=underline cterm=bold gui=bold guifg=Blue guibg=Black
"}
答案 2 :(得分:0)
也可以通过语法折叠来做到这一点。您需要将以下内容添加到~/.vim/after/syntax/c.vim
:
let s:contains = ''
if exists("c_curly_error")
let s:contains = ' contains=ALLBUT,cBadBlock,cCurlyError,@cParenGroup,cErrInParen,cErrInBracket,@cStringGroup,@Spell'
endif
let s:pattern = '%('
if &ft ==# "cpp"
" struct/class inheriting
let s:pattern .= ''
\ . '%(<struct|<class)@<='
\ . '\s\ze\s*\S+[^:]:[^:]\s*\S+.*'
let s:pattern .= '|'
" Constructors
let s:pattern .= ''
\ . '%('
\ . '%([^,:]|\n|^|<%(public|private|protected)>\s*:)'
\ . '\n\s*'
\ . ')@<='
\ . '%(<%(while|for|if|switch|catch)>)@!'
\ . '\S\ze\S*%(::\S+)*\s*\(.*\)\s*%(:.*)?'
let s:pattern .= '|'
endif
let s:pattern .= '%(<%(while|for|if|switch|catch)\(.*)@<=\)\ze\s*' . '|'
let s:pattern .= ''
\ . '%('
\ . '^\s*%(//.*|.*\*/|\{|<%(public|private|protected)>\s*:|.*\>)?'
\ . '\s*\n\s*\S+'
\ . ')@<='
\ . '\s\ze\s*\S+\s*'
\ . '%(.*[^:]:[^:].*)@!'
\ . '%(\s+\S+)*'
let s:pattern .= ')%(;\s*)@<!%(//.*|/\*.*\*/)?\n\s*'
syn clear cBlock
exec 'syn region cBlock_ end="}" fold' . s:contains
\ . ' start = "\%#=1\C\v' . s:pattern . '\{"'
\ . ' start = "\%#=1\C\v%(' . s:pattern . ')@<!\{"'
unlet s:contains s:pattern
但是请注意,如果文件很大,则重新计算折痕可能会很繁琐。