mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-04 06:00:04 +08:00
120 lines
4.2 KiB
VimL
120 lines
4.2 KiB
VimL
|
function! org#fold#level(line)
|
||
|
if g:org_folds == 0
|
||
|
return 0
|
||
|
endif
|
||
|
|
||
|
if exists('w:sparse_on')
|
||
|
\ && w:sparse_on
|
||
|
\ && (get(s:sparse_lines, a:line) == 1)
|
||
|
if index(b:v.sparse_list, a:line + 1) >= 0
|
||
|
return '<0'
|
||
|
endif
|
||
|
let sparse = index(b:v.sparse_list, a:line)
|
||
|
if sparse >= 0
|
||
|
return '>99'
|
||
|
endif
|
||
|
let sparse = index(b:v.fold_list, a:line)
|
||
|
if sparse >= 0
|
||
|
return '<0'
|
||
|
endif
|
||
|
endif
|
||
|
|
||
|
|
||
|
let [l:text, l:nexttext] = getline(a:line, a:line+1)
|
||
|
|
||
|
if l:text =~ '^\*\+\s'
|
||
|
let b:v.myAbsLevel = s:Ind(a:line)
|
||
|
elseif (b:v.lasttext_lev ># '') && (l:text !~ s:remstring) && (l:nexttext !~ '^\*\+\s') && (b:v.lastline == a:line - 1)
|
||
|
"elseif (b:v.lasttext_lev ># '') && (l:text !~ s:remstring) && (l:nexttext !~ '^\*\+\s\|^\s*:SYNOPSIS:') && (b:v.lastline == a:line - 1)
|
||
|
"if (b:v.lasttext_lev ># '') && (l:text !~ s:remstring) && (l:nexttext !~ '^\*\+\s') && (b:v.lastline == a:line - 1)
|
||
|
let b:v.lastline = a:line
|
||
|
return b:v.lasttext_lev
|
||
|
endif
|
||
|
let l:nextAbsLevel = s:Ind(a:line + 1)
|
||
|
|
||
|
if l:text =~ '^\*\+\s'
|
||
|
" we're on a heading line
|
||
|
let b:v.lasttext_lev = ''
|
||
|
"let b:v.myAbsLevel = s:Ind(a:line)
|
||
|
|
||
|
if l:nexttext =~ b:v.drawerMatch
|
||
|
let b:v.lev = '>' . string(b:v.myAbsLevel + 4)
|
||
|
elseif l:nexttext =~ s:remstring
|
||
|
let b:v.lev = '>' . string(b:v.myAbsLevel + 6)
|
||
|
elseif (l:nexttext !~ b:v.headMatch) && (a:line != line('$'))
|
||
|
let b:v.lev = '>' . string(b:v.myAbsLevel + 3)
|
||
|
elseif l:nextAbsLevel > b:v.myAbsLevel
|
||
|
let b:v.lev = '>' . string(b:v.myAbsLevel)
|
||
|
elseif l:nextAbsLevel < b:v.myAbsLevel
|
||
|
let b:v.lev = '<' . string(l:nextAbsLevel)
|
||
|
else
|
||
|
let b:v.lev = '<' . b:v.myAbsLevel
|
||
|
endif
|
||
|
let b:v.prevlev = b:v.myAbsLevel
|
||
|
|
||
|
else
|
||
|
"we have a text line
|
||
|
if b:v.lastline != a:line - 1 " backup to headline to get bearings
|
||
|
if l:text =~ b:v.drawerMatch
|
||
|
let b:v.prevlev = s:Ind(s:OrgPrevHead_l(a:line))
|
||
|
else
|
||
|
"don't just back up, recalc previous lines
|
||
|
" to set variables correctly
|
||
|
let prevhead = s:OrgPrevHead_l(a:line)
|
||
|
if prevhead == 0
|
||
|
" shortcircuit here, it's blank line prior to any head
|
||
|
return -1
|
||
|
endif
|
||
|
let b:v.prevlev = s:Ind(prevhead)
|
||
|
let i = prevhead
|
||
|
"for item in range(prevhead,a:line-1)
|
||
|
" call OrgFoldLevel(item)
|
||
|
"endfor
|
||
|
endif
|
||
|
"let b:v.prevlev = s:Ind(s:OrgPrevHead_l(a:line))
|
||
|
endif
|
||
|
|
||
|
if l:text =~ b:v.drawerMatch
|
||
|
let b:v.lev = '>' . string(b:v.prevlev + 4)
|
||
|
elseif (l:text =~ s:remstring)
|
||
|
if (getline(a:line - 1) =~ b:v.headMatch) && (l:nexttext =~ s:remstring)
|
||
|
let b:v.lev = string(b:v.prevlev + 5)
|
||
|
elseif (l:nexttext !~ s:remstring) ||
|
||
|
\ (l:nexttext =~ b:v.drawerMatch)
|
||
|
let b:v.lev = '<' . string(b:v.prevlev + 4)
|
||
|
else
|
||
|
let b:v.lev = b:v.prevlev + 4
|
||
|
endif
|
||
|
elseif l:text[0] != '#'
|
||
|
let b:v.lev = (b:v.prevlev + 2)
|
||
|
let b:v.lasttext_lev = b:v.lev
|
||
|
elseif b:v.src_fold
|
||
|
if l:text =~ '^#+begin_src'
|
||
|
let b:v.lev = '>' . (b:v.prevlev + 2)
|
||
|
elseif l:text =~ '^#+end_src'
|
||
|
let b:v.lev = '<' . (b:v.prevlev + 2)
|
||
|
endif
|
||
|
else
|
||
|
let b:v.lev = (b:v.prevlev + 2)
|
||
|
endif
|
||
|
|
||
|
if l:nexttext =~ '^\* '
|
||
|
" this is for perf reasons, closing fold
|
||
|
" back to zero avoids foldlevel calls sometimes
|
||
|
let b:v.lev = '<0'
|
||
|
elseif l:nexttext =~ '^\*\+\s'
|
||
|
let b:v.lev = '<' . string(l:nextAbsLevel)
|
||
|
endif
|
||
|
|
||
|
endif
|
||
|
let b:v.lastline = a:line
|
||
|
return b:v.lev
|
||
|
|
||
|
endfunction
|
||
|
|
||
|
function! s:Ind(line)
|
||
|
" used to get level of a heading (todo : rename this function)
|
||
|
return 2 + (len(matchstr(getline(a:line), '^\**\s')) - 2) / b:v.levelstars
|
||
|
|
||
|
endfunction
|