我的目标是用自己的自定义定义规则扩展foldmethod=syntax
。
我这样做的方法是使用foldmethod=expr
并在我的foldexpr
中定义此规则(例如,对'///'注释添加一个折叠)。之后,我发现资源通常会退缩到类似于缩进折叠的方式。那么,有没有一种好的方法可以退回到自定义规则之后的语法折叠,而又不针对我使用的任何语言重现完整的语法呢?
到目前为止,我的尝试是这样,这不是语法折叠的令人满意的近似值:
function! GetFold(lnum)
let this_line=getline(a:lnum)
let pprev_i=indent(a:lnum - 2)/&shiftwidth
let prev_i=indent(a:lnum - 1)/&shiftwidth
let this_i=indent(a:lnum)/&shiftwidth
" comments
if this_line =~? '^\s*\/\/\/.*'
return this_i + 1
endif
" like indent folding, but includes the closing bracket line to the fold
if empty(this_line)
if prev_i < pprev_i
return prev_i
endif
return -1
endif
if this_i < prev_i
return prev_i
endif
return this_i
endfunction
答案 0 :(得分:1)
解决方案是仅使用set fold=syntax
并将注释的语法区域添加到.vimrc
。在那里,您可以使用fold
关键字将区域标记为可折叠(有关更多信息,请参见:h syn-fold
)
syn region myFold start="///" end="///" transparent fold
(请注意,:h syn-transparent
在这里也很有用)
答案 1 :(得分:0)
不,没有办法使Vim退后。一次只能有一个'foldmethod'
处于活动状态,并且没有API可以“好像”评估另一种折叠方法。
您可以临时切换到语法折叠,存储生成的折叠,然后在折叠信息中使用该信息,并根据算法确定扩展信息。 (或者,您可以在窗口拆分中保留相同的缓冲区,在其中启用语法折叠,然后从中查询它;这将保存折叠的完整重新创建,但您可能需要同步光标位置。)
这很麻烦,而且可能很慢;我不推荐。