有没有办法,我可以设置
vim自动折叠
ruby源文件,但只能在方法级别折叠,无论它们被定义的级别?
所以当我有:
class MyClass def method ... end end
而且当我有:
module FirstModule module SecondModule class MyClass def method ... end end end end
我已经尝试了foldmethod =语法和各种折叠级别,但没有考虑方法定义的深度.
另外我也不希望在方法内没有折叠(如果块,每个块等).
我认为foldmethod = expr将是我最好的选择,但是我并没有设法弄清楚fold表达式是如何工作的,而vim中的帮助并不是非常有启发性的.
解决方法
我相信使用expr方法的预期是正确的!
您可以使用该文件的语法结构来审核您自己的语法风格的折叠.以下在我的.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元素返回单独的折叠.
如果你决定下去那条路线,那么有一些useful custom functions in my .vimrc可以用来反思语法元素和高亮度.它们在映射到键盘绑定时很方便快速使用,如下所示:
nnoremap g<C-h> :echo GetSynInfo()<CR>
请让我知道,如果这适用于你!找出来很有趣另外,对于什么是值得的,而:帮助’foldexpr’在细节上有所帮助,帮助’fold-expr’更有帮助,甚至在顶部有一些例子.