Vim:独立于语言的语言可使用foldmethod = expr进行语法折叠

时间:2019-01-03 11:20:20

标签: vim syntax folding

我的目标是用自己的自定义定义规则扩展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

2 个答案:

答案 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可以“好像”评估另一种折叠方法。

您可以临时切换到语法折叠,存储生成的折叠,然后在折叠信息中使用该信息,并根据算法确定扩展信息。 (或者,您可以在窗口拆分中保留相同的缓冲区,在其中启用语法折叠,然后从中查询它;这将保存折叠的完整重新创建,但您可能需要同步光标位置。)

这很麻烦,而且可能很慢;我不推荐。