1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 13:10:05 +08:00
SpaceVim/bundle/org-mode/autoload/org/fold.vim
2022-01-15 22:22:23 +08:00

120 lines
4.2 KiB
VimL
Vendored

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