سؤال

وأنا أحاول لجعل برنامج نصي فيم بسيط هو أن من شأنه أن يخلق مضغوط جدا على مستوى عال حظائر للملفات ج. من الناحية المثالية، إذا تم تشغيله على هذا الرمز:

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' لمزيد من التفاصيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top