1
0
mirror of https://github.com/gryf/tagbar.git synced 2025-12-18 03:50:26 +01:00

Add ability to open or close folds a single level

This commit is contained in:
AdnoC
2017-07-26 10:18:18 -04:00
parent f5792732de
commit e3732091bf
3 changed files with 69 additions and 0 deletions

View File

@@ -1031,6 +1031,8 @@ function! s:MapKeys() abort
\ ['togglefold', 'ToggleFold()'],
\ ['openallfolds', 'SetFoldLevel(99, 1)'],
\ ['closeallfolds', 'SetFoldLevel(0, 1)'],
\ ['incrementfolds', 'ChangeFoldLevel(1, 1)'],
\ ['decrementfolds', 'ChangeFoldLevel(-1, 1)'],
\ ['nextfold', 'GotoNextFold()'],
\ ['prevfold', 'GotoPrevFold()'],
\
@@ -3097,6 +3099,8 @@ function! s:PrintHelp() abort
silent put ='\" ' . s:get_map_str('togglefold') . ': Toggle fold'
silent put ='\" ' . s:get_map_str('openallfolds') . ': Open all folds'
silent put ='\" ' . s:get_map_str('closeallfolds') . ': Close all folds'
silent put ='\" ' . s:get_map_str('incrementfolds') . ': Increment fold level by 1'
silent put ='\" ' . s:get_map_str('decrementfolds') . ': Decrement fold level by 1'
silent put ='\" ' . s:get_map_str('nextfold') . ': Go to next fold'
silent put ='\" ' . s:get_map_str('prevfold') . ': Go to previous fold'
silent put ='\"'
@@ -3494,6 +3498,46 @@ function! s:ToggleFold() abort
call s:RenderKeepView(newline)
endfunction
" s:ChangeFoldLevel() {{{2
function! s:ChangeFoldLevel(diff, force) abort
let fileinfo = s:TagbarState().getCurrent(0)
if empty(fileinfo)
return
endif
if fileinfo.foldlevel == 99
call s:MinimizeMaxFoldLevel(fileinfo, fileinfo.getTags())
endif
let level = fileinfo.foldlevel
let level = level + a:diff
if level < 0
call s:warning('Foldlevel can''t be negative')
return
endif
call s:SetFoldLevelRecursive(fileinfo, fileinfo.getTags(), level)
let typeinfo = fileinfo.typeinfo
" Apply foldlevel to 'kind's
if level == 0
for kind in typeinfo.kinds
call fileinfo.closeKindFold(kind)
endfor
else
for kind in typeinfo.kinds
if a:force || !kind.fold
call fileinfo.openKindFold(kind)
endif
endfor
endif
let fileinfo.foldlevel = level
call s:RenderContent()
endfunction
" s:SetFoldLevel() {{{2
function! s:SetFoldLevel(level, force) abort
if a:level < 0
@@ -3544,6 +3588,23 @@ function! s:SetFoldLevelRecursive(fileinfo, tags, level) abort
endfor
endfunction
" s:MinimizeMaxFoldLevel() {{{2
" Set the file's fold level to the lowest value that still shows all tags
function! s:MinimizeMaxFoldLevel(fileinfo, tags) abort
let maxlvl = 0
let tags = copy(a:tags)
for tag in tags
if maxlvl < tag.depth
let maxlvl = tag.depth
endif
call tag.setFolded(0)
call extend(tags, tag.getChildren())
endfor
let a:fileinfo.foldlevel = maxlvl
endfunction
" s:OpenParents() {{{2
function! s:OpenParents(...) abort
if a:0 == 1