我相信你对使用expr
方法的直觉是正确的!
你可以利用文件的语法结构来模拟自己的syntax
样式折叠。以下是我的.vimrc
中产生预期行为的代码:
function! RubyMethodFold(line)
let line_is_method_or_end = synIDattr(synID(a:line,1,0), 'name') == 'rubyMethodBlock'
let line_is_def = getline(a:line) =~ '\s*def '
return line_is_method_or_end || line_is_def
endfunction
set foldexpr=RubyMethodFold(v:lnum)
注意:
我不确定 synID
的最后一个参数是否应该是 0
还是 1
。该参数决定您在所提供位置获取顶层 透明 或 非透明 元素的语法信息。当没有透明元素时,该参数没有影响。在我尝试的简单示例中,它没有引起任何问题,但可能会。
值得注意的是,line_is_def
正则表达式可能过于宽容。在这种情况下,返回 -1
可能更好,因此仅当匹配正则表达式的行紧挨着折叠的方法块时才进行折叠。更严格的正则表达式也可以起作用。
如果您感到有点兴奋,您可以扩展此功能,并为 rubyClass
和 rubyModule
元素返回单独的折叠级别。
如果您决定采用这种方式,那么在我的 .vimrc 文件中有一些有用的自定义函数,可以用于内省语法元素和突出显示。将它们映射到快捷键上以进行快速使用最为方便:
nnoremap g<C-h> :echo GetSynInfo()<CR>
如果这对您有用,请务必让我知道!解决问题是一件有趣的事情。另外,值得一提的是,尽管:help'foldexpr'
缺乏细节,但:help'fold-expr'
更加有帮助,甚至在顶部还有一些示例。