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.
This commit is contained in:
Dhruva Sagar
2013-05-14 19:35:00 +05:30
parent 2bde444575
commit e9d9030cbb
2 changed files with 50 additions and 39 deletions

View File

@@ -61,6 +61,8 @@ call s:SetGlobalOptDefault('table_mode_motion_prefix', '<Leader>t')
call s:SetGlobalOptDefault('table_mode_cell_text_object', 'tc') call s:SetGlobalOptDefault('table_mode_cell_text_object', 'tc')
call s:SetGlobalOptDefault('table_mode_delete_row_map', '<Leader>tdd') call s:SetGlobalOptDefault('table_mode_delete_row_map', '<Leader>tdd')
call s:SetGlobalOptDefault('table_mode_delete_column_map', '<Leader>tdc') call s:SetGlobalOptDefault('table_mode_delete_column_map', '<Leader>tdc')
call s:SetGlobalOptDefault('table_mode_add_formula_map', '<Leader>tfa')
call s:SetGlobalOptDefault('table_mode_recalculate_map', '<Leader>tfr')
"}}}1 "}}}1
function! s:TableMotion() "{{{1 function! s:TableMotion() "{{{1
@@ -73,39 +75,31 @@ endfunction
let s:tables = {} let s:tables = {}
function! s:AddFormula(formula, range) abort "{{{1 function! s:AddTableFormula() abort "{{{1
let line = line('.') let fr = input('f=')
let colm = tablemode#ColumnNr('.')
let bufnr = bufnr('%')
let formula = 'tablemode#'.a:formula.'('.a:range.','.line.','.colm.')'
if has_key(s:tables, bufnr) if fr !=# ''
if has_key(s:tables[bufnr], line) let [formula, range] = split(fr)
let s:tables[bufnr][line][colm] = formula
else let [line, colm] = [line('.'), tablemode#ColumnNr('.')]
let s:tables[bufnr][line] = { colm: formula } let key = join([bufnr('%'), line, colm], ':')
endif let formula = 'tablemode#'.formula.'('.string(range).','.line.','.colm.')'
else
let s:tables[bufnr] = {} let row = tablemode#RowNr(line)
let s:tables[bufnr][line] = {} call tablemode#SetCell(eval(formula), line, row, colm)
let s:tables[bufnr][line][colm] = formula
let s:tables[key] = formula
endif endif
endfunction endfunction
" }}}1 " }}}1
function! s:RecalculateFormulas() "{{{1 function! s:RecalculateFormulas() "{{{1
let bufnr = bufnr('%') let formulas = filter(s:tables, 'split(v:key, ":")[0] == string(bufnr("%"))')
if has_key(s:tables, bufnr) for [key, formula] in items(formulas)
let formulas = s:tables[bufnr] let [bufnr, line, colm] = map(split(key, ':'), 'str2nr(v:val)')
for [line, cform] in items(formulas) let row = tablemode#RowNr(line)
let line = str2nr(line) call tablemode#SetCell(eval(formula), line, row, colm)
for [colm, formula] in items(cform) endfor
let colm = str2nr(colm)
let row = tablemode#RowNr(line)
call tablemode#SetCell(eval(formula), line, row, colm)
endfor
endfor
endif
endfunction endfunction
" }}}1 " }}}1
@@ -129,17 +123,28 @@ endif
command! -nargs=? -range Tableize <line1>,<line2>call tablemode#TableizeRange(<q-args>) command! -nargs=? -range Tableize <line1>,<line2>call tablemode#TableizeRange(<q-args>)
execute "xnoremap <silent> " . g:table_mode_tableize_map . " :Tableize<CR>" execute "xnoremap <silent> " . g:table_mode_tableize_map .
execute "nnoremap <silent> " . g:table_mode_tableize_map . " :Tableize<CR>" \ " :Tableize<CR>"
execute "xnoremap <silent> " . g:table_mode_tableize_op_map . " :<C-U>call tablemode#TableizeByDelimiter()<CR>" execute "nnoremap <silent> " . g:table_mode_tableize_map .
execute "nnoremap <silent> " . g:table_mode_realign_map . " :<C-U>call tablemode#TableRealign('.')<CR>" \ " :Tableize<CR>"
execute "nnoremap <silent> " . g:table_mode_motion_prefix . " :<C-U>call <SID>TableMotion()<CR>" execute "xnoremap <silent> " . g:table_mode_tableize_op_map .
execute "onoremap <silent> " . g:table_mode_cell_text_object . " :<C-U>call tablemode#CellTextObject()<CR>" \ " :<C-U>call tablemode#TableizeByDelimiter()<CR>"
execute "nnoremap <silent> " . g:table_mode_delete_row_map . " :<C-U>call tablemode#DeleteRow()<CR>" execute "nnoremap <silent> " . g:table_mode_realign_map .
execute "nnoremap <silent> " . g:table_mode_delete_column_map . " :<C-U>call tablemode#DeleteColumn()<CR>" \ " :call tablemode#TableRealign('.')<CR>"
execute "nnoremap <silent> " . g:table_mode_motion_prefix .
\ " :call <SID>TableMotion()<CR>"
execute "onoremap <silent> " . g:table_mode_cell_text_object .
\ " :<C-U>call tablemode#CellTextObject()<CR>"
execute "nnoremap <silent> " . g:table_mode_delete_row_map .
\ " :call tablemode#DeleteRow()<CR>"
execute "nnoremap <silent> " . g:table_mode_delete_column_map .
\ " :call tablemode#DeleteColumn()<CR>"
command! -nargs=* TableForumla call s:AddFormula(<f-args>) command! TableFormula call s:AddTableFormula()
command! TableRecalc call s:RecalculateFormulas() command! TableRecalc call s:RecalculateFormulas()
execute "nnoremap <silent> " . g:table_mode_add_formula_map . " :TableFormula<CR>"
execute "nnoremap <silent> " . g:table_mode_recalculate_map . " :TableRecalc<CR>"
"}}}1 "}}}1
" Avoiding side effects {{{1 " Avoiding side effects {{{1

View File

@@ -383,7 +383,13 @@ function! s:ParseRange(range, ...) "{{{2
let default_col = a:1 let default_col = a:1
endif 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)')] let [rcs1, rcs2] = [map(split(rowcol1, ','), 'str2nr(v:val)'), map(split(rowcol2, ','), 'str2nr(v:val)')]
if len(rcs1) == 2 if len(rcs1) == 2
@@ -535,7 +541,7 @@ function! tablemode#TableRealign(line) "{{{2
let tline = tline + s:RowGap() let tline = tline + s:RowGap()
endwhile 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 for lnum in lnums
let index = index(lnums, lnum) let index = index(lnums, lnum)