let s:t_string = type('') " Primary functions {{{ function! gitgutter#all(force) abort let visible = tabpagebuflist() for bufnr in range(1, bufnr('$') + 1) if buflisted(bufnr) let file = expand('#'.bufnr.':p') if !empty(file) if index(visible, bufnr) != -1 call gitgutter#process_buffer(bufnr, a:force) elseif a:force call s:reset_tick(bufnr) endif endif endif endfor endfunction function! gitgutter#process_buffer(bufnr, force) abort " NOTE a:bufnr is not necessarily the current buffer. if gitgutter#utility#is_active(a:bufnr) call s:setup_maps(a:bufnr) if has('patch-7.4.1559') let l:Callback = function('gitgutter#process_buffer', [a:bufnr, a:force]) else let l:Callback = {'function': 'gitgutter#process_buffer', 'arguments': [a:bufnr, a:force]} endif let how = s:setup_path(a:bufnr, l:Callback) if [how] == ['async'] " avoid string-to-number conversion if how is a number return endif if a:force || s:has_fresh_changes(a:bufnr) let diff = '' try let diff = gitgutter#diff#run_diff(a:bufnr, 'index', 0) catch /gitgutter not tracked/ call gitgutter#debug#log('Not tracked: '.gitgutter#utility#file(a:bufnr)) catch /gitgutter diff failed/ call gitgutter#debug#log('Diff failed: '.gitgutter#utility#file(a:bufnr)) call gitgutter#hunk#reset(a:bufnr) endtry if diff != 'async' call gitgutter#diff#handler(a:bufnr, diff) endif endif endif endfunction function! gitgutter#disable() abort " get list of all buffers (across all tabs) for bufnr in range(1, bufnr('$') + 1) if buflisted(bufnr) let file = expand('#'.bufnr.':p') if !empty(file) call s:clear(bufnr) endif endif endfor let g:gitgutter_enabled = 0 endfunction function! gitgutter#enable() abort let g:gitgutter_enabled = 1 call gitgutter#all(1) endfunction function! gitgutter#toggle() abort if g:gitgutter_enabled call gitgutter#disable() else call gitgutter#enable() endif endfunction function! gitgutter#buffer_disable() abort let bufnr = bufnr('') call gitgutter#utility#setbufvar(bufnr, 'enabled', 0) call s:clear(bufnr) endfunction function! gitgutter#buffer_enable() abort let bufnr = bufnr('') call gitgutter#utility#setbufvar(bufnr, 'enabled', 1) call gitgutter#process_buffer(bufnr, 1) endfunction function! gitgutter#buffer_toggle() abort if gitgutter#utility#getbufvar(bufnr(''), 'enabled', 1) call gitgutter#buffer_disable() else call gitgutter#buffer_enable() endif endfunction " }}} function! s:setup_maps(bufnr) if !g:gitgutter_map_keys return endif if gitgutter#utility#getbufvar(a:bufnr, 'mapped', 0) return endif if !hasmapto('GitGutterPrevHunk') && maparg('[c', 'n') ==# '' nmap [c GitGutterPrevHunk endif if !hasmapto('GitGutterNextHunk') && maparg(']c', 'n') ==# '' nmap ]c GitGutterNextHunk endif if !hasmapto('GitGutterStageHunk') && maparg('hs', 'n') ==# '' nmap hs GitGutterStageHunk endif if !hasmapto('GitGutterUndoHunk') && maparg('hu', 'n') ==# '' nmap hu GitGutterUndoHunk endif if !hasmapto('GitGutterPreviewHunk') && maparg('hp', 'n') ==# '' nmap hp GitGutterPreviewHunk endif if !hasmapto('GitGutterTextObjectInnerPending') && maparg('ic', 'o') ==# '' omap ic GitGutterTextObjectInnerPending endif if !hasmapto('GitGutterTextObjectOuterPending') && maparg('ac', 'o') ==# '' omap ac GitGutterTextObjectOuterPending endif if !hasmapto('GitGutterTextObjectInnerVisual') && maparg('ic', 'x') ==# '' xmap ic GitGutterTextObjectInnerVisual endif if !hasmapto('GitGutterTextObjectOuterVisual') && maparg('ac', 'x') ==# '' xmap ac GitGutterTextObjectOuterVisual endif call gitgutter#utility#setbufvar(a:bufnr, 'mapped', 1) endfunction function! s:setup_path(bufnr, continuation) let p = gitgutter#utility#repo_path(a:bufnr, 0) if type(p) == s:t_string && !empty(p) " if path is known return endif return gitgutter#utility#set_repo_path(a:bufnr, a:continuation) endfunction function! s:has_fresh_changes(bufnr) abort return getbufvar(a:bufnr, 'changedtick') != gitgutter#utility#getbufvar(a:bufnr, 'tick') endfunction function! s:reset_tick(bufnr) abort call gitgutter#utility#setbufvar(a:bufnr, 'tick', 0) endfunction function! s:clear(bufnr) call gitgutter#sign#clear_signs(a:bufnr) call gitgutter#sign#remove_dummy_sign(a:bufnr, 1) call gitgutter#hunk#reset(a:bufnr) call s:reset_tick(a:bufnr) call gitgutter#utility#setbufvar(a:bufnr, 'path', '') endfunction