سؤال
وأنا أحاول لجعل برنامج نصي فيم بسيط هو أن من شأنه أن يخلق مضغوط جدا على مستوى عال حظائر للملفات ج. من الناحية المثالية، إذا تم تشغيله على هذا الرمز:
static void funca(...)
{
...
}
/* Example comment */
static void funcb(...)
{
...
}
وبعد ذلك سوف يخلق طيات التي من شأنها أن تبدو مثل هذا عندما أغلقت:
+-- x Lines: static void funca(...)----------------------
+-- x Lines: static void funcb(...)----------------------
وذلك في الأساس سيكون عليه foldmethod = جملة مع foldlevel = 1، إلا أن كل أضعاف ستبدأ سطر واحد للأعلى، وستمتد إلى مزيد من الانخفاض ليشمل جميع الأسطر الفارغة التالية.
وأنا أعرف كيفية جعل واحدة من هذه الطيات (على افتراض foldmethod = يدوي):
/^{<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'
لمزيد من التفاصيل.