From e9d9030cbb60a8395ae215d4609dcb7ecd4ba63a Mon Sep 17 00:00:00 2001 From: Dhruva Sagar Date: Tue, 14 May 2013 19:35:00 +0530 Subject: [PATCH] Updated Table Formulas - Added single function for both command & mapping to take formula from input. - Reusing g:table_mode_align for formatting table content, which was missed when moving from :Tableize to tabular#TabularizeStrings - Correctly parsing ranges as strings. --- after/plugin/table-mode.vim | 79 ++++++++++++++++++++----------------- autoload/tablemode.vim | 10 ++++- 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/after/plugin/table-mode.vim b/after/plugin/table-mode.vim index 88770f2..ecf16d4 100644 --- a/after/plugin/table-mode.vim +++ b/after/plugin/table-mode.vim @@ -61,6 +61,8 @@ call s:SetGlobalOptDefault('table_mode_motion_prefix', 't') call s:SetGlobalOptDefault('table_mode_cell_text_object', 'tc') call s:SetGlobalOptDefault('table_mode_delete_row_map', 'tdd') call s:SetGlobalOptDefault('table_mode_delete_column_map', 'tdc') +call s:SetGlobalOptDefault('table_mode_add_formula_map', 'tfa') +call s:SetGlobalOptDefault('table_mode_recalculate_map', 'tfr') "}}}1 function! s:TableMotion() "{{{1 @@ -73,39 +75,31 @@ endfunction let s:tables = {} -function! s:AddFormula(formula, range) abort "{{{1 - let line = line('.') - let colm = tablemode#ColumnNr('.') - let bufnr = bufnr('%') - let formula = 'tablemode#'.a:formula.'('.a:range.','.line.','.colm.')' +function! s:AddTableFormula() abort "{{{1 + let fr = input('f=') - if has_key(s:tables, bufnr) - if has_key(s:tables[bufnr], line) - let s:tables[bufnr][line][colm] = formula - else - let s:tables[bufnr][line] = { colm: formula } - endif - else - let s:tables[bufnr] = {} - let s:tables[bufnr][line] = {} - let s:tables[bufnr][line][colm] = formula + if fr !=# '' + let [formula, range] = split(fr) + + let [line, colm] = [line('.'), tablemode#ColumnNr('.')] + let key = join([bufnr('%'), line, colm], ':') + let formula = 'tablemode#'.formula.'('.string(range).','.line.','.colm.')' + + let row = tablemode#RowNr(line) + call tablemode#SetCell(eval(formula), line, row, colm) + + let s:tables[key] = formula endif endfunction " }}}1 function! s:RecalculateFormulas() "{{{1 - let bufnr = bufnr('%') - if has_key(s:tables, bufnr) - let formulas = s:tables[bufnr] - for [line, cform] in items(formulas) - let line = str2nr(line) - for [colm, formula] in items(cform) - let colm = str2nr(colm) - let row = tablemode#RowNr(line) - call tablemode#SetCell(eval(formula), line, row, colm) - endfor - endfor - endif + let formulas = filter(s:tables, 'split(v:key, ":")[0] == string(bufnr("%"))') + for [key, formula] in items(formulas) + let [bufnr, line, colm] = map(split(key, ':'), 'str2nr(v:val)') + let row = tablemode#RowNr(line) + call tablemode#SetCell(eval(formula), line, row, colm) + endfor endfunction " }}}1 @@ -129,17 +123,28 @@ endif command! -nargs=? -range Tableize ,call tablemode#TableizeRange() -execute "xnoremap " . g:table_mode_tableize_map . " :Tableize" -execute "nnoremap " . g:table_mode_tableize_map . " :Tableize" -execute "xnoremap " . g:table_mode_tableize_op_map . " :call tablemode#TableizeByDelimiter()" -execute "nnoremap " . g:table_mode_realign_map . " :call tablemode#TableRealign('.')" -execute "nnoremap " . g:table_mode_motion_prefix . " :call TableMotion()" -execute "onoremap " . g:table_mode_cell_text_object . " :call tablemode#CellTextObject()" -execute "nnoremap " . g:table_mode_delete_row_map . " :call tablemode#DeleteRow()" -execute "nnoremap " . g:table_mode_delete_column_map . " :call tablemode#DeleteColumn()" +execute "xnoremap " . g:table_mode_tableize_map . + \ " :Tableize" +execute "nnoremap " . g:table_mode_tableize_map . + \ " :Tableize" +execute "xnoremap " . g:table_mode_tableize_op_map . + \ " :call tablemode#TableizeByDelimiter()" +execute "nnoremap " . g:table_mode_realign_map . + \ " :call tablemode#TableRealign('.')" +execute "nnoremap " . g:table_mode_motion_prefix . + \ " :call TableMotion()" +execute "onoremap " . g:table_mode_cell_text_object . + \ " :call tablemode#CellTextObject()" +execute "nnoremap " . g:table_mode_delete_row_map . + \ " :call tablemode#DeleteRow()" +execute "nnoremap " . g:table_mode_delete_column_map . + \ " :call tablemode#DeleteColumn()" -command! -nargs=* TableForumla call s:AddFormula() -command! TableRecalc call s:RecalculateFormulas() +command! TableFormula call s:AddTableFormula() +command! TableRecalc call s:RecalculateFormulas() + +execute "nnoremap " . g:table_mode_add_formula_map . " :TableFormula" +execute "nnoremap " . g:table_mode_recalculate_map . " :TableRecalc" "}}}1 " Avoiding side effects {{{1 diff --git a/autoload/tablemode.vim b/autoload/tablemode.vim index 7257f66..8529c1e 100644 --- a/autoload/tablemode.vim +++ b/autoload/tablemode.vim @@ -383,7 +383,13 @@ function! s:ParseRange(range, ...) "{{{2 let default_col = a:1 endif - let [rowcol1, rowcol2] = split(a:range, ':') + if type(a:range) != type('') + let range = string(a:range) + else + let range = a:range + endif + + let [rowcol1, rowcol2] = split(range, ':') let [rcs1, rcs2] = [map(split(rowcol1, ','), 'str2nr(v:val)'), map(split(rowcol2, ','), 'str2nr(v:val)')] if len(rcs1) == 2 @@ -535,7 +541,7 @@ function! tablemode#TableRealign(line) "{{{2 let tline = tline + s:RowGap() endwhile - call tabular#TabularizeStrings(lines, g:table_mode_separator) + call tabular#TabularizeStrings(lines, g:table_mode_separator, g:table_mode_align) for lnum in lnums let index = index(lnums, lnum)