diff options
Diffstat (limited to 'ftplugin/csv.vim')
-rw-r--r-- | ftplugin/csv.vim | 99 |
1 files changed, 70 insertions, 29 deletions
diff --git a/ftplugin/csv.vim b/ftplugin/csv.vim index 95b609c9..e7455cb1 100644 --- a/ftplugin/csv.vim +++ b/ftplugin/csv.vim @@ -41,7 +41,9 @@ fu! <sid>Warn(mess) "{{{3 echohl Normal endfu -fu! <sid>Init(startline, endline) "{{{3 +fu! <sid>Init(startline, endline, ...) "{{{3 + " if a:1 is set, keep the b:delimiter + let keep = exists("a:1") && a:1 " Hilight Group for Columns if exists("g:csv_hiGroup") let s:hiGroup = g:csv_hiGroup @@ -56,10 +58,12 @@ fu! <sid>Init(startline, endline) "{{{3 exe "hi link CSVHeaderLine" s:hiHeader " Determine default Delimiter - if !exists("g:csv_delim") - let b:delimiter=<SID>GetDelimiter(a:startline, a:endline) - else - let b:delimiter=g:csv_delim + if !keep + if !exists("g:csv_delim") + let b:delimiter=<SID>GetDelimiter(a:startline, a:endline) + else + let b:delimiter=g:csv_delim + endif endif " Define custom commentstring @@ -579,7 +583,15 @@ fu! <sid>ColWidth(colnr) "{{{3 if !exists("b:csv_fixed_width_cols") if !exists("b:csv_list") - let b:csv_list=getline(1,'$') + " only check first 10000 lines, to be faster + let last = line('$') + if !get(b:, 'csv_arrange_use_all_rows', 0) + if last > 10000 + let last = 10000 + call <sid>Warn('File too large, only checking the first 10000 rows for the width') + endif + endif + let b:csv_list=getline(1,last) let pat = '^\s*\V'. escape(b:csv_cmt[0], '\\') call filter(b:csv_list, 'v:val !~ pat') call filter(b:csv_list, '!empty(v:val)') @@ -646,15 +658,40 @@ fu! <sid>ArrangeCol(first, last, bang, limit) range "{{{3 else let ro = 0 endif - exe "sil". a:first . ',' . a:last .'s/' . (b:col) . - \ '/\=<SID>Columnize(submatch(0))/' . (&gd ? '' : 'g') - " Clean up variables, that were only needed for <sid>Columnize() function - unlet! s:columnize_count s:max_cols s:prev_line - if ro - setl ro - unlet ro + let s:count = 0 + let _stl = &stl + let s:max = (a:last - a:first + 1) * len(b:col_width) + let s:temp = 0 + try + exe "sil". a:first . ',' . a:last .'s/' . (b:col) . + \ '/\=<SID>Columnize(submatch(0))/' . (&gd ? '' : 'g') + finally + " Clean up variables, that were only needed for <sid>Columnize() function + unlet! s:columnize_count s:max_cols s:prev_line s:max s:count s:temp s:val + if ro + setl ro + unlet ro + endif + let &stl = _stl + call winrestview(cur) + endtry +endfu + +fu! <sid>ProgressBar(cnt, max) "{{{3 + if get(g:, 'csv_no_progress', 0) + return + endif + let width = 40 " max width of progressbar + if width > &columns + let width = &columns + endif + let s:val = a:cnt * width / a:max + if (s:val > s:temp || a:cnt==1) + let &stl='%#DiffAdd#['.repeat('=', s:val).'>'. repeat(' ', width-s:val).']'. + \ (width < &columns ? ' '.100*s:val/width. '%%' : '') + redrawstatus + let s:temp = s:val endif - call winrestview(cur) endfu fu! <sid>PrepUnArrangeCol(first, last) "{{{3 @@ -706,9 +743,7 @@ fu! <sid>CalculateColumnWidth() "{{{3 endtry " delete buffer content in variable b:csv_list, " this was only necessary for calculating the max width - unlet! b:csv_list - unlet! s:columnize_count - unlet! s:decimal_column + unlet! b:csv_list s:columnize_count s:decimal_column endfu fu! <sid>Columnize(field) "{{{3 @@ -725,6 +760,7 @@ fu! <sid>Columnize(field) "{{{3 if exists("s:prev_line") && s:prev_line != line('.') let s:columnize_count = 0 endif + let s:count+=1 let s:prev_line = line('.') " convert zero based indexed list to 1 based indexed list, @@ -733,8 +769,8 @@ fu! <sid>Columnize(field) "{{{3 " let width=get(b:col_width,<SID>WColumn()-1,20) " is too slow, so we are using: let colnr = s:columnize_count % s:max_cols - let width=get(b:col_width, colnr, 20) - let align='r' + let width = get(b:col_width, colnr, 20) + let align = 'r' if exists('b:csv_arrange_align') let align_list=split(get(b:, 'csv_arrange_align', " "), '\zs') try @@ -747,9 +783,10 @@ fu! <sid>Columnize(field) "{{{3 \ align isnot? 'c' && align isnot? '.') || get(b:, 'csv_arrange_leftalign', 0)) let align = 'r' endif + call <sid>ProgressBar(s:count,s:max) let s:columnize_count += 1 - let has_delimiter = (a:field =~# b:delimiter.'$') + let has_delimiter = (a:field[-1:] is? b:delimiter) if align is? 'l' " left-align content return printf("%-*S%s", width+1 , @@ -1910,7 +1947,8 @@ fu! <sid>CommandDefinitions() "{{{3 call <sid>LocalCmd("UnArrangeColumn", \':call <sid>PrepUnArrangeCol(<line1>, <line2>)', \ '-range') - call <sid>LocalCmd("InitCSV", ':call <sid>Init(<line1>,<line2>)', '-range=%') + call <sid>LocalCmd("InitCSV", ':call <sid>Init(<line1>,<line2>,<bang>0)', + \ '-bang -range=%') call <sid>LocalCmd('Header', \ ':call <sid>SplitHeaderLine(<q-args>,<bang>0,1)', \ '-nargs=? -bang') @@ -2232,6 +2270,10 @@ fu! <sid>NrColumns(bang) "{{{3 endfu fu! <sid>Tabularize(bang, first, last) "{{{3 + if match(split(&ft, '\.'),'csv') == -1 + call <sid>Warn("No CSV filetype, aborting!") + return + endif let _c = winsaveview() " Table delimiter definition "{{{4 if !exists("s:td") @@ -2307,10 +2349,7 @@ fu! <sid>Tabularize(bang, first, last) "{{{3 call <sid>Warn('An error occured, aborting!') return endif - if get(b:, 'csv_arrange_leftalign', 0) - call map(b:col_width, 'v:val+1') - endif - if b:delimiter == "\t" && !get(b:, 'csv_arrange_leftalign',0) + if getline(a:first)[-1:] isnot? b:delimiter let b:col_width[-1] += 1 endif let marginline = s:td.scol. join(map(copy(b:col_width), 'repeat(s:td.hbar, v:val)'), s:td.cros). s:td.ecol @@ -2335,12 +2374,14 @@ fu! <sid>Tabularize(bang, first, last) "{{{3 call append(a:first + s:csv_fold_headerline, marginline) let adjust_last += 1 endif + " Syntax will be turned off, so disable this part + " " Adjust headerline to header of new table - let b:csv_headerline = (exists('b:csv_headerline')?b:csv_headerline+2:3) - call <sid>CheckHeaderLine() + "let b:csv_headerline = (exists('b:csv_headerline')?b:csv_headerline+2:3) + "call <sid>CheckHeaderLine() " Adjust syntax highlighting - unlet! b:current_syntax - ru syntax/csv.vim + "unlet! b:current_syntax + "ru syntax/csv.vim if a:bang exe printf('sil %d,%ds/^%s\zs\n/&%s&/e', a:first + s:csv_fold_headerline, a:last + adjust_last, |