ruby - 在 vim 中自动折叠 ruby

标签 ruby vim folding

有没有一种方法可以设置 vim 自动折叠 ruby​​ 源文件,但只在方法级别折叠而不考虑它们定义的级别?

所以它会折叠,当我有:

class MyClass
  def method
    ...
  end
end

而且当我有:

module FirstModule
  module SecondModule
    class MyClass
      def method
        ...
      end
    end
  end
end

我已经尝试过 foldmethod=syntax 和各种折叠级别,但它没有考虑定义方法的深度。

此外,我不希望方法中的任何内容都被折叠(如果 block 、每个 block 等)。

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

最佳答案

我相信您关于使用 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 可能会更好,因此与正则表达式匹配的行仅在紧邻折叠方法 block 时才会折叠。限制性更强的正则表达式也可以。

如果您感到不安,您可以对此进行扩展并为 rubyClassrubyModule 元素返回单独的折叠级别。

如果您决定走那条路,有一些 useful custom functions in my .vimrc用于内省(introspection)语法元素和高亮显示。当映射到键绑定(bind)以便快速使用时,它们是最方便的,如下所示:

nnoremap g<C-h> :echo GetSynInfo()<CR>

如果这对你有用,请告诉我!弄清楚很有趣。此外,就其值(value)而言,虽然 :help 'foldexpr' 详细介绍了细节,但 :help 'fold-expr' 更有帮助,甚至在顶部。

关于ruby - 在 vim 中自动折叠 ruby ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7594918/

相关文章:

ruby-on-rails - 使用 Ruby Gem 将联系人添加到 InfusionSoft DB 失败

Vim ftplugin 对 C++ 文件执行 c.vim 而不是 cpp.vim

search - 增加和减少数字

vim - 奇怪的 Vim 内边框

vim - `set foldmethod=syntax`让vim变慢,`set foldmethod=indent`不够好,怎么办?

java - 如何处理丑陋的多重声明(非方法代码的代码折叠)

notepad++ - 配置 Notepad++ 以使用基于缩进的代码折叠

ruby-on-rails - Rails 简单常量和选择选项

ruby-on-rails - 在 state_machine gem 上持久化之前的验证

ruby - 如何创建具有相同对象 ID 的 Ruby 类