1

我使用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():)?

4

2 回答 2

2

Learn Vimscript the Hard Way的第4849章讨论了如何做到这一点,使用. 基本上你需要制作一个自定义的 ftplugin 并在其中放入一个折叠脚本;该脚本包含用于确定不同行应具有的折叠级别的函数。foldmethod=exprindent

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

于 2013-07-11T17:59:51.270 回答
1

我使用本教程解决了这个问题。

这是完成的一堆功能:

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.

于 2013-07-11T18:03:50.227 回答