python折叠代码_vim折叠方便python源代码

" Vim folding file

" Language:    Python

" Author:    Jorrit Wiersma (foldexpr), Max Ischenko (foldtext), Robert

" Ames (line counts)

" Last Change:    2005 Jul 14

" Version:    2.3

" Bug fix:    Drexler Christopher, Tom Schumm, Geoff Gerrietts

setlocal foldmethod=expr

setlocal foldexpr=GetPythonFold(v:lnum)

setlocal foldtext=PythonFoldText()

function! PythonFoldText()

let line = getline(v:foldstart)

let nnum = nextnonblank(v:foldstart + 1)

let nextline = getline(nnum)

if nextline =~ '^\s\+"""$'

let line = line . getline(nnum + 1)

elseif nextline =~ '^\s\+"""'

let line = line . ' ' . matchstr(nextline, '"""\zs.\{-}\ze\("""\)\?$')

elseif nextline =~ '^\s\+"[^"]\+"$'

let line = line . ' ' . matchstr(nextline, '"\zs.*\ze"')

elseif nextline =~ '^\s\+pass\s*$'

let line = line . ' pass'

endif

let size = 1 + v:foldend - v:foldstart

if size < 10

let size = " " . size

endif

if size < 100

let size = " " . size

endif

if size < 1000

let size = " " . size

endif

return size . " lines: " . line

endfunction

function! GetPythonFold(lnum)

" Determine folding level in Python source

"

let line = getline(a:lnum)

let ind  = indent(a:lnum)

" Ignore blank lines

if line =~ '^\s*$'

return "="

endif

" Ignore triple quoted strings

if line =~ "(\"\"\"|''')"

return "="

endif

" Ignore continuation lines

if line =~ '\\$'

return '='

endif

" Support markers

if line =~ '{{{'

return "a1"

elseif line =~ '}}}'

return "s1"

endif

" Classes and functions get their own folds

if line =~ '^\s*\(class\|def\)\s'

return ">" . (ind / &sw + 1)

endif

let pnum = prevnonblank(a:lnum - 1)

if pnum == 0

" Hit start of file

return 0

endif

" If the previous line has foldlevel zero, and we haven't increased

" it, we should have foldlevel zero also

if foldlevel(pnum) == 0

return 0

endif

" The end of a fold is determined through a difference in indentation

" between this line and the next.

" So first look for next line

let nnum = nextnonblank(a:lnum + 1)

if nnum == 0

return "="

endif

" First I check for some common cases where this algorithm would

" otherwise fail. (This is all a hack)

let nline = getline(nnum)

if nline =~ '^\s*\(except\|else\|elif\)'

return "="

endif

" Python programmers love their readable code, so they're usually

" going to have blank lines at the ends of functions or classes

" If the next line isn't blank, we probably don't need to end a fold

if nnum == a:lnum + 1

return "="

endif

" If next line has less indentation we end a fold.

" This ends folds that aren't there a lot of the time, and this sometimes

" confuses vim.  Luckily only rarely.

let nind = indent(nnum)

if nind < ind

return "    endif

" If none of the above apply, keep the indentation

return "="

endfunction

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值