自动红宝石折叠在vim

adi*_*ile 12 ruby vim folding

有没有办法我可以设置vim自动折叠ruby源文件,但只能在方法级别折叠,无论它们被定义的级别如何?

因此,当我有:

class MyClass
  def method
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

但是当我有:

module FirstModule
  module SecondModule
    class MyClass
      def method
        ...
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我已尝试使用foldmethod =语法和各种折叠级别,但它没有考虑定义方法的深度.

此外,我不希望方法内部折叠(如果块,每个块等).

我认为foldmethod = expr是我最好的选择,但我还没弄清楚折叠表达式是如何工作的,而vim中的帮助并不是很有启发性.

Max*_*tor 11

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)
Run Code Online (Sandbox Code Playgroud)

一些警告:

我不确定最后的论据是否synID应该是01.这是决定是否得到最上面的语法的信息参数透明不透明的,在所提供的位置元素.如果没有透明元素,则该参数无效.在我尝试的简单例子中,它没有引起任何问题,但它可能会.

值得注意的是,line_is_def正则表达式可能过于宽松.-1在这种情况下返回可能会更好,因此匹配正则表达式的线仅在折叠方法块旁边时折叠.更严格的正则表达式也可以工作.

如果你感觉松懈,你可以扩展它并返回单独的折叠级别rubyClassrubyModule元素.

如果您决定沿着这条路走下去,我的.vimrc中有一些有用的自定义函数,用于内省语法元素和hilighting.当映射到键绑定以便快速使用时,它们是最方便的,如下所示:

nnoremap g<C-h> :echo GetSynInfo()<CR>
Run Code Online (Sandbox Code Playgroud)

如果这对您有用,请告诉我!弄清楚这很有趣.此外,对于它的价值而言,虽然:help 'foldexpr'细节很轻,:help 'fold-expr'但更有帮助,甚至在顶部有一些例子.

  • 这是一个很好的答案.这看起来是正确的解决方案,或者至少是一个很好的起点,可以达到我想要的地方.我将测试今天晚些时候它是如何工作的并接受你的答案.此外,您的vimrc看起来是一个很好的学习资源,尤其是您定义的所有功能.谢谢. (2认同)