折叠到折叠开始,而不是缩进开始

时间:2013-07-11 17:02:17

标签: vim

我使用foldmethod=indent,当我折叠代码时这样:

def cake():
    #cake!
    print( "cake" )
    print( "for" )
    print( "you" )

我看到了

def cake():
    #cake!
    print( "cake" ) +++ 3 lines folded

但我希望看到

def cake(): +++ 5 lines folded

有没有办法像这样折叠到第一行(def cake():)?

2 个答案:

答案 0 :(得分:2)

以简单的方式学习Vimscript <* em>的章节4849使用foldmethod=expr代替indent来讨论如何做到这一点。基本上你需要制作一个自定义的ftplugin并在其中放置一个折叠脚本;该脚本包含用于确定不同行应具有的折叠级别的函数。

幸运的是,这两章中给出的示例代码是针对Potion语言的,与Python一样,它是对空格敏感的,所以应该很容易使它适应Python。由于Vim已经附带了一个Python ftplugin,我认为您可以将网站上描述的折叠脚本放入.vim/after/ftplugin/python而不是.vim/ftplugin/potion

答案 1 :(得分:1)

我使用this tutorial解决了这个问题。

这是完成的一系列功能:

fu! Indent_level(lnum)
  return indent(a:lnum) / &shiftwidth
  endfunction

fu! Next_non_blank_line(lnum)
  let numlines = line('$')
  let current = a:lnum + 1

  while current <= numlines
    if getline(current) =~? '\v\S'
      return current
      endif
    let current += 1
    endwhile
  return -2
  endfunction

fu! Custom_fold_expr(lnum)
  if getline(a:lnum) =~? '\v^\s*$'
    return '-1'
    endif

  let this_indent = Indent_level(a:lnum)
  let next_indent = Indent_level(Next_non_blank_line(a:lnum))

  if next_indent == this_indent
    return this_indent
  elseif next_indent < this_indent
    return this_indent
  elseif next_indent > this_indent
    return '>' . next_indent
    endif
  endf

set foldexpr=Custom_fold_expr(v:lnum)
foldmethod=expr

请不要编辑此帖子中“结束”标记的缩进,将其放入vimrc后看起来很漂亮。