aboutsummaryrefslogtreecommitdiff
path: root/vim/.vim/plugged/vim-gitgutter/autoload/gitgutter/fold.vim
diff options
context:
space:
mode:
authorKumar Damani <damani.kumar@gmail.com>2019-04-26 18:49:26 +0000
committerKumar Damani <damani.kumar@gmail.com>2019-04-26 18:49:26 +0000
commit5a6ed5fcb3b89d0c2b4e8ba2953c4ba806d4b171 (patch)
tree5be0c043b0c8d632e35a8b4ef7e23452b103b94d /vim/.vim/plugged/vim-gitgutter/autoload/gitgutter/fold.vim
parentaf821092fe78ef159d7cb6536bb006712dc01b9d (diff)
added vim dir
Diffstat (limited to 'vim/.vim/plugged/vim-gitgutter/autoload/gitgutter/fold.vim')
-rw-r--r--vim/.vim/plugged/vim-gitgutter/autoload/gitgutter/fold.vim84
1 files changed, 84 insertions, 0 deletions
diff --git a/vim/.vim/plugged/vim-gitgutter/autoload/gitgutter/fold.vim b/vim/.vim/plugged/vim-gitgutter/autoload/gitgutter/fold.vim
new file mode 100644
index 0000000..ffc7691
--- /dev/null
+++ b/vim/.vim/plugged/vim-gitgutter/autoload/gitgutter/fold.vim
@@ -0,0 +1,84 @@
+function! gitgutter#fold#enable()
+ call s:save_fold_state()
+
+ call s:set_fold_levels()
+ setlocal foldexpr=gitgutter#fold#level(v:lnum)
+ setlocal foldmethod=expr
+ setlocal foldlevel=0
+ setlocal foldenable
+
+ call gitgutter#utility#setbufvar(bufnr(''), 'folded', 1)
+endfunction
+
+
+function! gitgutter#fold#disable()
+ call s:restore_fold_state()
+ call gitgutter#utility#setbufvar(bufnr(''), 'folded', 0)
+endfunction
+
+
+function! gitgutter#fold#toggle()
+ if s:folded()
+ call gitgutter#fold#disable()
+ else
+ call gitgutter#fold#enable()
+ endif
+endfunction
+
+
+function! gitgutter#fold#level(lnum)
+ return gitgutter#utility#getbufvar(bufnr(''), 'fold_levels')[a:lnum]
+endfunction
+
+
+" A line in a hunk has a fold level of 0.
+" A line within 3 lines of a hunk has a fold level of 1.
+" All other lines have a fold level of 2.
+function! s:set_fold_levels()
+ let fold_levels = ['']
+
+ for lnum in range(1, line('$'))
+ let in_hunk = gitgutter#hunk#in_hunk(lnum)
+ call add(fold_levels, (in_hunk ? 0 : 2))
+ endfor
+
+ let lines_of_context = 3
+
+ for lnum in range(1, line('$'))
+ if fold_levels[lnum] == 2
+ let pre = lnum >= 3 ? lnum - lines_of_context : 0
+ let post = lnum + lines_of_context
+ if index(fold_levels[pre:post], 0) != -1
+ let fold_levels[lnum] = 1
+ endif
+ endif
+ endfor
+
+ call gitgutter#utility#setbufvar(bufnr(''), 'fold_levels', fold_levels)
+endfunction
+
+
+function! s:save_fold_state()
+ let bufnr = bufnr('')
+ call gitgutter#utility#setbufvar(bufnr, 'foldlevel', &foldlevel)
+ call gitgutter#utility#setbufvar(bufnr, 'foldmethod', &foldmethod)
+ if &foldmethod ==# 'manual'
+ mkview
+ endif
+endfunction
+
+function! s:restore_fold_state()
+ let bufnr = bufnr('')
+ let &foldlevel = gitgutter#utility#getbufvar(bufnr, 'foldlevel')
+ let &foldmethod = gitgutter#utility#getbufvar(bufnr, 'foldmethod')
+ if &foldmethod ==# 'manual'
+ loadview
+ else
+ normal! zx
+ endif
+endfunction
+
+function! s:folded()
+ return gitgutter#utility#getbufvar(bufnr(''), 'folded')
+endfunction
+