2
0
Fork 0
mirror of https://github.com/amix/vimrc synced 2024-12-27 20:33:06 +00:00
vimrc/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim

286 lines
10 KiB
VimL
Raw Normal View History

scriptencoding utf-8
if exists('g:loaded_gitgutter') || !has('signs') || &cp
finish
endif
let g:loaded_gitgutter = 1
" Initialisation {{{
if v:version < 703 || (v:version == 703 && !has("patch105"))
2018-03-31 14:56:26 +00:00
call gitgutter#utility#warn('requires Vim 7.3.105')
finish
endif
function! s:set(var, default) abort
if !exists(a:var)
if type(a:default)
execute 'let' a:var '=' string(a:default)
else
execute 'let' a:var '=' a:default
endif
endif
endfunction
2020-05-10 14:24:38 +00:00
function! s:obsolete(var)
if exists(a:var)
call gitgutter#utility#warn(a:var.' is obsolete and has no effect.')
endif
endfunction
2019-08-22 15:36:17 +00:00
call s:set('g:gitgutter_preview_win_location', 'bo')
2019-11-16 15:28:42 +00:00
if exists('*nvim_open_win')
call s:set('g:gitgutter_preview_win_floating', 1)
else
call s:set('g:gitgutter_preview_win_floating', 0)
endif
call s:set('g:gitgutter_enabled', 1)
2020-05-10 14:24:38 +00:00
if exists('*sign_unplace')
call s:set('g:gitgutter_max_signs', -1)
else
call s:set('g:gitgutter_max_signs', 500)
endif
call s:set('g:gitgutter_signs', 1)
call s:set('g:gitgutter_highlight_lines', 0)
2019-08-22 15:36:17 +00:00
call s:set('g:gitgutter_highlight_linenrs', 0)
call s:set('g:gitgutter_sign_priority', 10)
" Nvim 0.4.0 has an expanding sign column
" The sign_place() function supports sign priority.
if (has('nvim-0.4.0') || exists('*sign_place')) && !exists('g:gitgutter_sign_allow_clobber')
let g:gitgutter_sign_allow_clobber = 1
2017-09-02 10:43:18 +00:00
endif
2019-08-22 15:36:17 +00:00
call s:set('g:gitgutter_sign_allow_clobber', 0)
2020-05-10 14:24:38 +00:00
call s:set('g:gitgutter_set_sign_backgrounds', 0)
2018-11-01 10:03:42 +00:00
call s:set('g:gitgutter_sign_added', '+')
call s:set('g:gitgutter_sign_modified', '~')
call s:set('g:gitgutter_sign_removed', '_')
2018-03-31 14:56:26 +00:00
if gitgutter#utility#supports_overscore_sign()
call s:set('g:gitgutter_sign_removed_first_line', '‾')
2018-03-31 14:56:26 +00:00
else
call s:set('g:gitgutter_sign_removed_first_line', '_^')
endif
2018-11-01 10:03:42 +00:00
call s:set('g:gitgutter_sign_removed_above_and_below', '[')
call s:set('g:gitgutter_sign_modified_removed', '~_')
call s:set('g:gitgutter_git_args', '')
2019-11-16 15:28:42 +00:00
call s:set('g:gitgutter_diff_relative_to', 'index')
2018-11-01 10:03:42 +00:00
call s:set('g:gitgutter_diff_args', '')
call s:set('g:gitgutter_diff_base', '')
call s:set('g:gitgutter_map_keys', 1)
call s:set('g:gitgutter_terminal_reports_focus', 1)
call s:set('g:gitgutter_async', 1)
call s:set('g:gitgutter_log', 0)
2019-11-30 12:06:56 +00:00
call s:set('g:gitgutter_use_location_list', 0)
2018-03-31 14:56:26 +00:00
call s:set('g:gitgutter_git_executable', 'git')
if !executable(g:gitgutter_git_executable)
2020-05-10 14:24:38 +00:00
if g:gitgutter_enabled
call gitgutter#utility#warn('cannot find git. Please set g:gitgutter_git_executable.')
endif
finish
endif
2018-03-31 14:56:26 +00:00
let default_grep = 'grep'
call s:set('g:gitgutter_grep', default_grep)
if !empty(g:gitgutter_grep)
if executable(split(g:gitgutter_grep)[0])
if $GREP_OPTIONS =~# '--color=always'
let g:gitgutter_grep .= ' --color=never'
endif
else
if g:gitgutter_grep !=# default_grep
call gitgutter#utility#warn('cannot find '.g:gitgutter_grep.'. Please check g:gitgutter_grep.')
endif
let g:gitgutter_grep = ''
endif
endif
call gitgutter#highlight#define_highlights()
call gitgutter#highlight#define_signs()
2018-06-14 10:31:12 +00:00
" Prevent infinite loop where:
" - executing a job in the foreground launches a new window which takes the focus;
" - when the job finishes, focus returns to gvim;
" - the FocusGained event triggers a new job (see below).
if gitgutter#utility#windows() && !(g:gitgutter_async && gitgutter#async#available())
set noshelltemp
endif
" }}}
" Primary functions {{{
2018-03-31 14:56:26 +00:00
command! -bar GitGutterAll call gitgutter#all(1)
command! -bar GitGutter call gitgutter#process_buffer(bufnr(''), 1)
2018-03-31 14:56:26 +00:00
command! -bar GitGutterDisable call gitgutter#disable()
command! -bar GitGutterEnable call gitgutter#enable()
command! -bar GitGutterToggle call gitgutter#toggle()
2019-03-08 11:04:56 +00:00
command! -bar GitGutterBufferDisable call gitgutter#buffer_disable()
command! -bar GitGutterBufferEnable call gitgutter#buffer_enable()
command! -bar GitGutterBufferToggle call gitgutter#buffer_toggle()
2019-11-16 15:28:42 +00:00
command! -bar GitGutterQuickFix call gitgutter#quickfix()
" }}}
" Line highlights {{{
2018-03-31 14:56:26 +00:00
command! -bar GitGutterLineHighlightsDisable call gitgutter#highlight#line_disable()
command! -bar GitGutterLineHighlightsEnable call gitgutter#highlight#line_enable()
command! -bar GitGutterLineHighlightsToggle call gitgutter#highlight#line_toggle()
" }}}
2019-08-22 15:36:17 +00:00
" 'number' column highlights {{{
command! -bar GitGutterLineNrHighlightsDisable call gitgutter#highlight#linenr_disable()
command! -bar GitGutterLineNrHighlightsEnable call gitgutter#highlight#linenr_enable()
command! -bar GitGutterLineNrHighlightsToggle call gitgutter#highlight#linenr_toggle()
" }}}
" Signs {{{
2018-03-31 14:56:26 +00:00
command! -bar GitGutterSignsEnable call gitgutter#sign#enable()
command! -bar GitGutterSignsDisable call gitgutter#sign#disable()
command! -bar GitGutterSignsToggle call gitgutter#sign#toggle()
" }}}
" Hunks {{{
2018-03-31 14:56:26 +00:00
command! -bar -count=1 GitGutterNextHunk call gitgutter#hunk#next_hunk(<count>)
command! -bar -count=1 GitGutterPrevHunk call gitgutter#hunk#prev_hunk(<count>)
2019-08-22 15:36:17 +00:00
command! -bar -range=% GitGutterStageHunk call gitgutter#hunk#stage(<line1>,<line2>)
2018-03-31 14:56:26 +00:00
command! -bar GitGutterUndoHunk call gitgutter#hunk#undo()
command! -bar GitGutterPreviewHunk call gitgutter#hunk#preview()
" Hunk text object
2019-11-16 15:28:42 +00:00
onoremap <silent> <Plug>(GitGutterTextObjectInnerPending) :<C-U>call gitgutter#hunk#text_object(1)<CR>
onoremap <silent> <Plug>(GitGutterTextObjectOuterPending) :<C-U>call gitgutter#hunk#text_object(0)<CR>
xnoremap <silent> <Plug>(GitGutterTextObjectInnerVisual) :<C-U>call gitgutter#hunk#text_object(1)<CR>
xnoremap <silent> <Plug>(GitGutterTextObjectOuterVisual) :<C-U>call gitgutter#hunk#text_object(0)<CR>
" Returns the git-diff hunks for the file or an empty list if there
" aren't any hunks.
"
" The return value is a list of lists. There is one inner list per hunk.
"
" [
" [from_line, from_count, to_line, to_count],
" [from_line, from_count, to_line, to_count],
" ...
" ]
"
" where:
"
" `from` - refers to the staged file
" `to` - refers to the working tree's file
" `line` - refers to the line number where the change starts
" `count` - refers to the number of lines the change covers
function! GitGutterGetHunks()
2018-03-31 14:56:26 +00:00
let bufnr = bufnr('')
return gitgutter#utility#is_active(bufnr) ? gitgutter#hunk#hunks(bufnr) : []
endfunction
" Returns an array that contains a summary of the hunk status for the current
" window. The format is [ added, modified, removed ], where each value
" represents the number of lines added/modified/removed respectively.
function! GitGutterGetHunkSummary()
return gitgutter#hunk#summary(winbufnr(0))
endfunction
" }}}
2019-03-08 11:04:56 +00:00
" Folds {{{
command! -bar GitGutterFold call gitgutter#fold#toggle()
" }}}
2018-03-31 14:56:26 +00:00
command! -bar GitGutterDebug call gitgutter#debug#debug()
" Maps {{{
2019-11-16 15:28:42 +00:00
nnoremap <silent> <expr> <Plug>(GitGutterNextHunk) &diff ? ']c' : ":\<C-U>execute v:count1 . 'GitGutterNextHunk'\<CR>"
nnoremap <silent> <expr> <Plug>GitGutterNextHunk &diff ? ']c' : ":\<C-U>call gitgutter#utility#warn('please change your map \<lt>Plug>GitGutterNextHunk to \<lt>Plug>(GitGutterNextHunk)')\<CR>"
nnoremap <silent> <expr> <Plug>(GitGutterPrevHunk) &diff ? '[c' : ":\<C-U>execute v:count1 . 'GitGutterPrevHunk'\<CR>"
nnoremap <silent> <expr> <Plug>GitGutterPrevHunk &diff ? '[c' : ":\<C-U>call gitgutter#utility#warn('please change your map \<lt>Plug>GitGutterPrevHunk to \<lt>Plug>(GitGutterPrevHunk)')\<CR>"
2019-11-16 15:28:42 +00:00
xnoremap <silent> <Plug>(GitGutterStageHunk) :GitGutterStageHunk<CR>
xnoremap <silent> <Plug>GitGutterStageHunk :call gitgutter#utility#warn('please change your map <lt>Plug>GitGutterStageHunk to <lt>Plug>(GitGutterStageHunk)')<CR>
nnoremap <silent> <Plug>(GitGutterStageHunk) :GitGutterStageHunk<CR>
nnoremap <silent> <Plug>GitGutterStageHunk :call gitgutter#utility#warn('please change your map <lt>Plug>GitGutterStageHunk to <lt>Plug>(GitGutterStageHunk)')<CR>
nnoremap <silent> <Plug>(GitGutterUndoHunk) :GitGutterUndoHunk<CR>
nnoremap <silent> <Plug>GitGutterUndoHunk :call gitgutter#utility#warn('please change your map <lt>Plug>GitGutterUndoHunk to <lt>Plug>(GitGutterUndoHunk)')<CR>
nnoremap <silent> <Plug>(GitGutterPreviewHunk) :GitGutterPreviewHunk<CR>
nnoremap <silent> <Plug>GitGutterPreviewHunk :call gitgutter#utility#warn('please change your map <lt>Plug>GitGutterPreviewHunk to <lt>Plug>(GitGutterPreviewHunk)')<CR>
2018-06-14 10:31:12 +00:00
" }}}
2018-06-14 10:31:12 +00:00
function! s:on_bufenter()
2019-08-22 15:36:17 +00:00
call gitgutter#setup_maps()
2018-06-14 10:31:12 +00:00
if exists('t:gitgutter_didtabenter') && t:gitgutter_didtabenter
let t:gitgutter_didtabenter = 0
2018-07-19 12:52:53 +00:00
call gitgutter#all(!g:gitgutter_terminal_reports_focus)
2018-06-14 10:31:12 +00:00
else
call gitgutter#process_buffer(bufnr(''), !g:gitgutter_terminal_reports_focus)
endif
endfunction
" Autocommands {{{
augroup gitgutter
autocmd!
2018-03-31 14:56:26 +00:00
autocmd TabEnter * let t:gitgutter_didtabenter = 1
2018-06-14 10:31:12 +00:00
autocmd BufEnter * call s:on_bufenter()
2018-07-19 12:52:53 +00:00
autocmd CursorHold,CursorHoldI * call gitgutter#process_buffer(bufnr(''), 0)
2019-11-16 15:28:42 +00:00
if exists('*timer_start') && has('lambda')
autocmd FileChangedShellPost * call timer_start(1, {-> gitgutter#process_buffer(bufnr(''), 1)})
else
autocmd FileChangedShellPost * call gitgutter#process_buffer(bufnr(''), 1)
endif
2018-03-31 14:56:26 +00:00
" Ensure that all buffers are processed when opening vim with multiple files, e.g.:
"
" vim -o file1 file2
autocmd VimEnter * if winnr() != winnr('$') | call gitgutter#all(0) | endif
2017-09-02 10:43:18 +00:00
2019-03-27 15:08:56 +00:00
autocmd ShellCmdPost * call gitgutter#all(1)
2019-03-08 11:04:56 +00:00
autocmd BufLeave term://* call gitgutter#all(1)
2019-12-12 22:01:41 +00:00
autocmd User FugitiveChanged call gitgutter#all(1)
2019-08-22 15:36:17 +00:00
autocmd BufFilePre * GitGutterBufferDisable
autocmd BufFilePost * GitGutterBufferEnable
2019-03-27 15:08:56 +00:00
" Handle all buffers when focus is gained, but only after it was lost.
" FocusGained gets triggered on startup with Neovim at least already.
" Therefore this tracks also if it was lost before.
let s:focus_was_lost = 0
autocmd FocusGained * if s:focus_was_lost | let focus_was_lost = 0 | call gitgutter#all(1) | endif
autocmd FocusLost * let s:focus_was_lost = 1
2018-08-25 16:13:42 +00:00
if exists('##VimResume')
autocmd VimResume * call gitgutter#all(1)
endif
2020-05-10 14:24:38 +00:00
autocmd ColorScheme * call gitgutter#highlight#define_highlights()
" Disable during :vimgrep
autocmd QuickFixCmdPre *vimgrep* let g:gitgutter_enabled = 0
autocmd QuickFixCmdPost *vimgrep* let g:gitgutter_enabled = 1
augroup END
" }}}
" vim:set et sw=2 fdm=marker: