加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

自动ruby折叠在vim

发布时间:2020-12-16 19:26:11 所属栏目:百科 来源:网络整理
导读:有没有办法,我可以设置 vim自动折叠 ruby源文件,但只能在方法级别折叠,无论它们被定义的级别? 所以当我有: class MyClass def method ... endend 而且当我有: module FirstModule module SecondModule class MyClass def method ... end end endend 我已
有没有办法,我可以设置 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’更有帮助,甚至在顶部有一些例子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读