题
我努力使创建非常紧凑的顶级简单的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>
但它是无效的,我不是很确定的功能是如何工作的。此外,它不会对文件中的最后一个函数的工作,因为它会找不到“^ {”一次。如果有人可以帮助我得到这个工作,并以某种方式在文件中添加的情况下,在过去的功能,我将非常感谢。
在预先感谢:)
解决方案
可以创建编程方式使用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'
。
不隶属于 StackOverflow