Skip to content

Commit

Permalink
issue mechatroner#51: range-enabled csv_shrink; converts csv_shrink, …
Browse files Browse the repository at this point in the history
…csv_align to use either address or visual range
  • Loading branch information
carywreams committed Jun 5, 2024
1 parent 6a58ed8 commit 074b1fa
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 17 deletions.
38 changes: 24 additions & 14 deletions autoload/rainbow_csv.vim
Original file line number Diff line number Diff line change
Expand Up @@ -818,34 +818,36 @@ func! rainbow_csv#align_field(field, is_first_line, max_field_components_lens, i
return repeat(' ', integer_delta_length) . clean_field . trailing_spaces
endfunc

func! rainbow_csv#csv_align(...)
func! rainbow_csv#csv_align() range
let l:firstline = a:firstline
let l:lastline = a:lastline
" The first (statistic) pass of the function takes about 40% of runtime, the second (actual align) pass around 60% of runtime.
" Numeric-aware logic by itself adds about 50% runtime compared to the basic string-based field width alignment
" If there are lot of numeric columns this can additionally increase runtime by another 50% or more.
let show_progress_bar = (a:2 - a:1) > 200000
let show_progress_bar = (l:lastline - l:firstline) > 200000
let [delim, policy, comment_prefix] = rainbow_csv#get_current_dialect()
if policy == 'monocolumn'
echoerr "RainbowAlign[Range] is available only for highlighted CSV files"
echoerr "RainbowAlign is available only for highlighted CSV files"
return
endif
if policy == 'quoted_rfc'
echoerr 'RainbowAlign[Range] not available for "rfc_csv" filetypes, consider using "csv" instead'
echoerr 'RainbowAlign not available for "rfc_csv" filetypes, consider using "csv" instead'
return
endif

if (a:1 == 1 && a:2 == line("$") && (&ft == 'markdown' || &ft == 'rmd'))
echoerr "RainbowAlign is available only for highlighted CSV files; try RainbowAlignRange"
if (l:firstline == 1 && l:lastline == line("$") && (&ft == 'markdown' || &ft == 'rmd'))
echoerr "RainbowAlign requires an address range in markdown and rmd files"
return
endif

let lastLineNo = a:2
let lastLineNo = l:lastline
let progress_bucket_size = (lastLineNo * 2) / s:progress_bar_size " multiply by 2 because we have two passes.
if !show_progress_bar || progress_bucket_size < 10
let progress_bucket_size = 0
endif
let s:align_progress_bar_position = 0

let [column_stats, first_failed_line] = s:calc_column_stats(delim, policy, comment_prefix, progress_bucket_size,a:1,a:2)
let [column_stats, first_failed_line] = s:calc_column_stats(delim, policy, comment_prefix, progress_bucket_size,l:firstline,l:lastline)
if first_failed_line != 0
echoerr 'Unable to allign: Inconsistent double quotes at line ' . first_failed_line
return
Expand All @@ -859,8 +861,8 @@ func! rainbow_csv#csv_align(...)

let has_edit = 0

let is_first_line = a:1
for linenum in range(a:1, lastLineNo)
let is_first_line = l:firstline
for linenum in range(l:firstline, lastLineNo)
if (progress_bucket_size && linenum % progress_bucket_size == 0)
let s:align_progress_bar_position = s:align_progress_bar_position + 1
call s:display_progress_bar(s:align_progress_bar_position)
Expand Down Expand Up @@ -894,7 +896,9 @@ func! rainbow_csv#csv_align(...)
endif
endfunc

func! rainbow_csv#csv_shrink()
func! rainbow_csv#csv_shrink() range
let l:firstline = a:firstline
let l:lastline = a:lastline
let [delim, policy, comment_prefix] = rainbow_csv#get_current_dialect()
if policy == 'monocolumn'
echoerr "RainbowShrink is available only for highlighted CSV files"
Expand All @@ -904,15 +908,21 @@ func! rainbow_csv#csv_shrink()
echoerr 'RainbowShrink not available for "rfc_csv" filetypes, consider using "csv" instead'
return
endif
let lastLineNo = line("$")

if (l:firstline == 1 && l:lastline == line("$") && (&ft == 'markdown' || &ft == 'rmd'))
echoerr "RainbowShrink requires an address range in markdown and rmd files"
return
endif

let lastLineNo = l:lastline
let has_edit = 0
let show_progress_bar = wordcount()['bytes'] > 200000
let show_progress_bar = (l:lastline - l:firstline) > 200000
let progress_bucket_size = lastLineNo / s:progress_bar_size
if !show_progress_bar || progress_bucket_size < 10
let progress_bucket_size = 0
endif
let s:align_progress_bar_position = 0
for linenum in range(1, lastLineNo)
for linenum in range(l:firstline, lastLineNo)
if (progress_bucket_size && linenum % progress_bucket_size == 0)
let s:align_progress_bar_position = s:align_progress_bar_position + 1
call s:display_progress_bar(s:align_progress_bar_position)
Expand Down
5 changes: 2 additions & 3 deletions plugin/rainbow_csv.vim
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,8 @@ command! NoRainbowComment call rainbow_csv#manual_disable_comment_prefix()

command! RainbowLint call rainbow_csv#csv_lint()
command! CSVLint call rainbow_csv#csv_lint()
command! RainbowAlign call rainbow_csv#csv_align(1,line("$"))
command! -range RainbowAlignRange call rainbow_csv#csv_align(<line1>,<line2>)
command! RainbowShrink call rainbow_csv#csv_shrink()
command! -range=% RainbowAlign <line1>,<line2>call rainbow_csv#csv_align()
command! -range=% RainbowShrink <line1>,<line2>call rainbow_csv#csv_shrink()

command! RainbowQuery call rainbow_csv#start_or_finish_query_editing()
command! -nargs=+ Select call rainbow_csv#run_select_cmd_query(<q-args>)
Expand Down

0 comments on commit 074b1fa

Please sign in to comment.