3

我正在尝试制作一个简单的 Vim 脚本,该脚本将为 c 文件创建非常紧凑的顶级折叠。理想情况下,如果它在此代码上运行:

static void funca(...)
{
   ... 
}

/* Example comment */
static void funcb(...)
{
   ... 
}

然后它会创建折叠,关闭时看起来像这样:

+-- x Lines: static void funca(...)----------------------
+-- x Lines: static void funcb(...)----------------------

所以基本上它就像 foldmethod=syntax with foldlevel=1,除了每个折叠会开始一个更远的行,并且会进一步向下延伸以包括所有后续的空白行。

我知道如何制作这些折叠之一(假设 foldmethod=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>

但它是无效的,我不完全确定函数是如何工作的。此外,它不适用于文件中的最后一个函数,因为它不会再次找到 '^{'。如果有人可以帮助我完成这项工作,并以某种方式为文件中的最后一个函数添加一个案例,我将非常感激。

提前致谢 :)

4

1 回答 1

3

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'更多详细信息,请参阅。

于 2009-05-13T06:25:57.990 回答