Вопрос

Я пытаюсь создать простой сценарий 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' Больше подробностей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top