Вопрос
Я пытаюсь создать простой сценарий Vim, который создавал бы очень компактные складки верхнего уровня для файлов c.В идеале, если бы он запускался на таком коде:
static void funca(...)
{
...
}
/* Example comment */
static void funcb(...)
{
...
}
Затем будут созданы складки, которые в закрытом состоянии будут выглядеть так:
+-- x Lines: static void funca(...)----------------------
+-- x Lines: static void funcb(...)----------------------
По сути, это будет похоже на сгибметод=синтаксис с уровнем сгиба=1, за исключением того, что каждый сгиб будет начинаться на одну строку выше и будет продолжаться дальше вниз, включая все последующие пустые строки.
Я знаю, как сделать одну из этих складок (при условии, что методfold=manual):
/^{<cr>kVnn?^$<cr>zf
Но я не уверен, как поместить это в функцию.Это мои усилия:
function Cfold()
set foldmethod=manual " Manual folds
ggzE " Delete all folds
while (/^{<cr>) " Somehow loop through each match
kVnn?^$<cr>zf " This would work fine except for the last function
endwhile
endfunction
map <Leader>f :call Cfold()<cr>
Но это неверно, я не совсем понимаю, как работают функции.Кроме того, это не будет работать для последней функции в файле, поскольку она больше не найдет '^{'.Если бы кто-нибудь мог помочь мне заставить это работать и каким-то образом добавить случай для последней функции в файле, я был бы чрезвычайно благодарен.
Заранее спасибо :)
Решение
Вы можете создавать складки программно, используя foldexpr
и foldtext
.Попробуйте это, хотя, возможно, вам придется настроить CFoldLevel
поэтому он не поглощает нефункциональные части кода:
function! CFoldLevel(lnum)
let line = getline(a:lnum)
if line =~ '^/\*'
return '>1' " A new fold of level 1 starts here.
else
return '1' " This line has a foldlevel of 1.
endif
endfunction
function! CFoldText()
" Look through all of the folded text for the function signature.
let signature = ''
let i = v:foldstart
while signature == '' && i < v:foldend
let line = getline(i)
if line =~ '\w\+(.*)$'
let signature = line
endif
let i = i + 1
endwhile
" Return what the fold should show when folded.
return '+-- ' . (v:foldend - v:foldstart) . ' Lines: ' . signature . ' '
endfunction
function! CFold()
set foldenable
set foldlevel=0
set foldmethod=expr
set foldexpr=CFoldLevel(v:lnum)
set foldtext=CFoldText()
set foldnestmax=1
endfunction
Видеть :help 'foldexpr'
Больше подробностей.