From e407d5bb417f71735203c672e76e0fe1189018ab Mon Sep 17 00:00:00 2001 From: Jerome Reybert <jreybert@gmail.com> Date: Fri, 23 Oct 2015 00:45:15 +0200 Subject: [PATCH] plugin/magit.vim: ask user first if too much lines to display --- README.md | 10 ++++++++++ autoload/magit/state.vim | 14 ++++++++++++++ doc/vimagit.txt | 9 +++++++++ plugin/magit.vim | 14 ++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/README.md b/README.md index 0d36951..e759ba6 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,16 @@ When set to 2, filenames and hunks are unfolded. Default value is 1. > let g:magit_default_fold_level=[012] +#### g:magit_warning_max_lines + +This variable is the maximum number of diff lines that vimagit will display +without warning the user. If the number of diff lines to display is greater than +this variable, vimagit will ask a confirmation to the user before refreshing the +buffer. If user answer is 'yes', vimagit will display diff lines as expected. +If user answer is 'no', vimagit will close all file diffs before refreshing. +Default value is 10000. +> let g:magit_warning_max_lines=val + ## Installation The plugin hierarchy tree respects the vim plugin standard. It is compatible diff --git a/autoload/magit/state.vim b/autoload/magit/state.vim index 76d3c2b..74ed848 100644 --- a/autoload/magit/state.vim +++ b/autoload/magit/state.vim @@ -162,6 +162,9 @@ function! magit#state#add_file(mode, status, filename, depth) dict endif call add(hunk.lines, diff_line) endfor + if ( file.is_visible() ) + let self.nb_diff_lines += len(diff_list) + endif endif endfunction @@ -171,6 +174,7 @@ endfunction " else, its diff is discarded and regenrated " what is resilient is its 'visible' parameter function! magit#state#update() dict + let self.nb_diff_lines = 0 for diff_dict_mode in values(self.dict) for file in values(diff_dict_mode) let file.exists = 0 @@ -208,6 +212,14 @@ function! magit#state#update() dict endfor endfunction +function! magit#state#set_files_visible(is_visible) dict + for diff_dict_mode in values(self.dict) + for file in values(diff_dict_mode) + call file.set_visible(a:is_visible) + endfor + endfor +endfunction + " dict: structure containing all diffs " It is formatted as follow " { @@ -223,9 +235,11 @@ endfunction " }, " } let magit#state#state = { + \ 'nb_diff_lines': 0, \ 'get_file': function("magit#state#get_file"), \ 'get_files': function("magit#state#get_files"), \ 'add_file': function("magit#state#add_file"), + \ 'set_files_visible': function("magit#state#set_files_visible"), \ 'update': function("magit#state#update"), \ 'dict': { 'staged': {}, 'unstaged': {}}, \ } diff --git a/doc/vimagit.txt b/doc/vimagit.txt index 78cbdfe..98d1c3e 100644 --- a/doc/vimagit.txt +++ b/doc/vimagit.txt @@ -276,6 +276,15 @@ When set to 2, filenames and hunks are unfolded. Default value is 1. let g:magit_default_fold_level=[012] + *vimagit-g:magit_warning_max_lines* +This variable is the maximum number of diff lines that vimagit will display +without warning the user. If the number of diff lines to display is greater than +this variable, vimagit will ask a confirmation to the user before refreshing the +buffer. If user answer is 'yes', vimagit will display diff lines as expected. +If user answer is 'no', vimagit will close all file diffs before refreshing. +Defaulty value is 10000. +let g:magit_warning_max_lines=val + =============================================================================== 6. FAQ *vimagit-FAQ* diff --git a/plugin/magit.vim b/plugin/magit.vim index ed66ec3..b17c837 100644 --- a/plugin/magit.vim +++ b/plugin/magit.vim @@ -62,6 +62,8 @@ call s:set('g:magit_show_help', 1) call s:set('g:magit_default_show_all_files', 0) call s:set('g:magit_default_fold_level', 1) +call s:set('g:magit_warning_max_lines', 10000) + execute "nnoremap <silent> " . g:magit_show_magit_mapping . " :call magit#show_magit('v')<cr>" " }}} @@ -591,6 +593,17 @@ function! magit#update_buffer() call <SID>mg_get_commit_section() endif call s:state.update() + + if ( s:state.nb_diff_lines > g:magit_warning_max_lines && b:magit_warning_answered_yes == 0 ) + let ret = input("There are " . s:state.nb_diff_lines . " diff lines to display. Do you want to display all diffs? y(es) / N(o) : ", "") + if ( ret !~? '^y\%(e\%(s\)\?\)\?$' ) + let b:magit_default_show_all_files = 0 + call s:state.set_files_visible(0) + else + let b:magit_warning_answered_yes = 1 + endif + endif + call <SID>mg_get_staged_section('staged') call <SID>mg_get_staged_section('unstaged') call <SID>mg_get_stashes() @@ -636,6 +649,7 @@ function! magit#show_magit(display, ...) let b:magit_default_show_all_files = g:magit_default_show_all_files let b:magit_default_fold_level = g:magit_default_fold_level + let b:magit_warning_answered_yes = 0 if ( a:0 > 0 ) let b:magit_default_show_all_files = a:1 -- GitLab