我努力使创建非常紧凑的顶级简单的Vim脚本折叠的C文件。理想地,如果它是在此代码运行:

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

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

然后,它会产生褶皱,其看起来像这样在关闭时:

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

因此,基本上它会像使用foldmethod = syntax与折叠级别= 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>

但它是无效的,我不是很确定的功能是如何工作的。此外,它不会对文件中的最后一个函数的工作,因为它会找不到“^ {”一次。如果有人可以帮助我得到这个工作,并以某种方式在文件中添加的情况下,在过去的功能,我将非常感谢。

在预先感谢:)

有帮助吗?

解决方案

可以创建编程方式使用foldexprfoldtext褶皱。试试这个,虽然你可能需要调整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