有没有办法我可以设置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应该是0或1.这是决定是否得到最上面的语法的信息参数透明或不透明的,在所提供的位置元素.如果没有透明元素,则该参数无效.在我尝试的简单例子中,它没有引起任何问题,但它可能会.
值得注意的是,line_is_def正则表达式可能过于宽松.-1在这种情况下返回可能会更好,因此匹配正则表达式的线仅在折叠方法块旁边时折叠.更严格的正则表达式也可以工作.
如果你感觉松懈,你可以扩展它并返回单独的折叠级别rubyClass和rubyModule元素.
如果您决定沿着这条路走下去,我的.vimrc中有一些有用的自定义函数,用于内省语法元素和hilighting.当映射到键绑定以便快速使用时,它们是最方便的,如下所示:
nnoremap g<C-h> :echo GetSynInfo()<CR>
Run Code Online (Sandbox Code Playgroud)
如果这对您有用,请告诉我!弄清楚这很有趣.此外,对于它的价值而言,虽然:help 'foldexpr'细节很轻,:help 'fold-expr'但更有帮助,甚至在顶部有一些例子.
| 归档时间: |
|
| 查看次数: |
4371 次 |
| 最近记录: |