Compare commits

..

20 Commits

Author SHA1 Message Date
Dhruva Sagar
88cb2e44b6 Bump version 2020-08-02 23:28:10 +05:30
Dhruva Sagar
336262d04f Fix #184
Improve formula evaluation, support border rows
2020-08-02 23:26:27 +05:30
Dhruva Sagar
5c489b57e8 Improve documentation. Fix #183
Update the vim help documentation to match the correct mappings
& behavior
2020-07-27 19:51:11 +05:30
Dhruva Sagar
436e7d6c21 Merge pull request #182 from CaninoDev/patch-2
Update README.md
2020-07-25 01:52:55 +05:30
Dhruva Sagar
1ea7960834 Merge pull request #181 from CaninoDev/patch-1
Add instructions for installation via vim-plug
2020-07-25 01:51:52 +05:30
IanGC
ff38f4451b Update README.md
1) `it's` is a contraction of `it is`. `its` is the possessive
2) Made consistent the formatting of `[count]` as used in various locations
3) Made consistent the various `g:` formattings
4) `immidiately` is correctly spelled `immediately`
5) Shortened some sentences for clarity

As an aside, this is an immensely useful plugin. Thanks so much for contributing your code.
2020-07-24 15:48:47 -04:00
IanGC
d5b9ce4d9e Add instructions for installation via vim-plug 2020-07-24 15:26:10 -04:00
Dhruva Sagar
6404009080 Improve documentation of g:table_mode_disable_tableize_mappings 2020-05-06 20:29:11 +05:30
Dhruva Sagar
c9b13e5d30 Add config to disable tableize mappings. Fix 176 2020-05-06 20:20:53 +05:30
Dhruva Sagar
6a6f3565c3 Releasing version 4.7.0 2020-04-19 22:02:25 +05:30
Dhruva Sagar
0b1dcf2e4c Merge pull request #175 from insanum/formulas
added some new formula functions
2020-04-19 21:55:36 +05:30
Eric Davis
2e5713ae6a fixed the Average function and test case when spanning rows/columns
fixed a Vim error(E907) in Min/Max when comparing v:null to a float
fixed CountE/CountNE/PercentE/PercentNE to support spanning rows/columns
added test cases for all the new formula functions
2020-04-19 00:20:55 -07:00
Eric Davis
f755285cf3 simplified the CountE function
cleanup for HTML comment tag checks
2020-04-18 21:47:22 -07:00
Eric Davis
5cdf3c2ac1 Added the following formula functions:
- Min: get the lowest value
  - Max: get the highest value
  - CountE: count the number of empty cells
  - CountNE: count the number of non-empty cells
  - PercentE: percent of empty cells
  - PercentNE: percent of non-empty cells
  - AverageNE: average over non-empty cells

Also added a subtle tweak that ignores an HTML comment tag ('<!--')
found between the table and the starting formula line. Being able to
wrap all the formula lines with an HTML comment prevents the formulas
from being rendered in Markdown/ReST output.
2020-04-18 18:46:21 -07:00
Dhruva Sagar
29e7cb41bb Merge pull request #174 from ibbem/feature/add-columns
Add a way to insert columns
2020-04-17 20:16:39 +05:30
ibbem
46e4493b30 Start insert mode after adding a column 2020-04-13 22:34:44 +02:00
ibbem
85a5e3d4e1 Fix the column modifications on escaped separators
If a g:table_mode_separator is escaped by a backslash, the table is
aligned ignoring this instance of the g:table_mode_separator, but the
column deletion and insertion functions did not consider this behaviour.

The g:table_mode_escaped_separator regex is simplified and optimized a
little bit. Also more care is taken to prevent unexpected behaviour if
special characters are used as g:table_mode_separator.
2020-04-04 15:27:23 +02:00
ibbem
67129cd1e0 Fix column modifications if Unicode is involved 2020-04-04 15:27:23 +02:00
ibbem
0b58003b68 Add support for inserting columns #130
Two mappings are introduced to enable usage of this feature like vim's
pasting with p and P.
2020-04-04 15:27:19 +02:00
ibbem
6912880697 Include the header when deleting columns 2020-03-31 18:21:45 +02:00
12 changed files with 638 additions and 68 deletions

View File

@@ -1,4 +1,4 @@
# VIM Table Mode v4.6.7 [![Build Status](https://travis-ci.org/dhruvasagar/vim-table-mode.png?branch=master)](https://travis-ci.org/dhruvasagar/vim-table-mode) # VIM Table Mode v4.7.2 [![Build Status](https://travis-ci.org/dhruvasagar/vim-table-mode.png?branch=master)](https://travis-ci.org/dhruvasagar/vim-table-mode)
An awesome automatic table creator & formatter allowing one to create neat An awesome automatic table creator & formatter allowing one to create neat
tables as you type. tables as you type.
@@ -26,14 +26,15 @@ $ git submodule add git@github.com:dhruvasagar/vim-table-mode.git bundle/table-m
~/.vim/autoload/, ~/.vim/plugin and ~/.vim/doc under UNIX or ~/.vim/autoload/, ~/.vim/plugin and ~/.vim/doc under UNIX or
vimfiles/autoload/, vimfiles/plugin/ and vimfiles/doc under WINDOWS and vimfiles/autoload/, vimfiles/plugin/ and vimfiles/doc under WINDOWS and
restart VIM restart VIM
4. Alternatively, if using <a href="https://github.com/junegunn/vim-plug">vim-plug</a>, then add `Plug 'dhruvasagar/vim-table-mode'` to your ~/.vimrc.
### Creating table on-the-fly ### Creating table on-the-fly
To start using the plugin in the on-the-fly mode use `:TableModeToggle` mapped to <kbd>\<Leader\>tm</kbd> by default (which means <kbd>\\</kbd> <kbd>t</kbd> <kbd>m</kbd> if you didn't override the <Leader> by `:let mapleader = ','` to have <kbd>,</kbd> <kbd>t</kbd> <kbd>m</kbd>). To start using the plugin in the on-the-fly mode use `:TableModeToggle` mapped to <kbd>\<Leader\>tm</kbd> by default (which means <kbd>\\</kbd> <kbd>t</kbd> <kbd>m</kbd> if you didn't override the <Leader> by `:let mapleader = ','` to have <kbd>,</kbd> <kbd>t</kbd> <kbd>m</kbd>).
> Tip : Tip:
> You can use the following to quickly enable / disable table mode in insert You can use the following to quickly enable / disable table mode in insert mode by using `||` or `__`:
> mode by using `||` or `__` :
> ```vim > ```vim
> function! s:isAtStartOfLine(mapping) > function! s:isAtStartOfLine(mapping)
> let text_before_cursor = getline('.')[0 : col('.')-1] > let text_before_cursor = getline('.')[0 : col('.')-1]
@@ -115,34 +116,33 @@ To get ReST-compatible tables use
Markdown and ReST filetypes have automatically configured corners. Markdown and ReST filetypes have automatically configured corners.
You can also define in a table header border how it's content should be You can also define in a table header border how its content should be
aligned, whether center, right or left by using a `:` character defined by aligned, whether center, right or left by using a `:` character defined by
`g:table_mode_align_char` option. `g:table_mode_align_char` option.
If you manipulate the table when table mode is disabled or copy paste a table If you manipulate the table when table mode is disabled or copy paste a table
from clipboard from outside and it ends up being misaligned, you can realign from clipboard from outside and it ends up being misaligned, you can realign
it using `:TableModeRealign` or using the default mapping it using `:TableModeRealign` or using the default mapping
<kbd>\<Leader\>tr</kbd> defined by `g:table_mode_relign_map` option. <kbd>\<Leader\>tr</kbd> (defined by the option `g:table_mode_relign_map`).
### Formatting existing content into a table ### Formatting existing content into a table
Table Mode wouldn't justify it's name if it didn't allow formatting Table Mode wouldn't justify its name if it didn't allow formatting
existing content into a table. And it does as promised. Like table creation existing content into a table. And it does as promised. Like table creation typing on the fly,
on the fly as you type, formatting existing content into a table is equally formatting existing content into a table is equally
simple. You can visually select multiple lines and call `:Tableize` on it, simple. You can visually select multiple lines and call `:Tableize` on it.
or alternatively use the mapping <kbd>\<Leader\>tt</kbd> defined by the Alternatively, the mapping <kbd>\<Leader\>tt</kbd> can be used (defined by the
`g:table_mode_tableize_map` option which would convert CSV (Comma Separated option `g:table_mode_tableize_map`). This converts CSV (Comma-separated
Value) data into a table and use `,` defined by `g:table_mode_delimiter` Values) data into a table.
option as the delimiter.
If however you wish to use a different delimiter, you can use the command If however you wish to use a different delimiter, you can use the command
`:Tableize/{pattern}` in a similar fashion as you use tabular (eg. `:Tableize/{pattern}` in a similar fashion as you tabulate (e.g.
`:Tableize/;` uses ';' as the delimiter) or use the mapping <kbd>\<Leader\>T</kbd> `:Tableize/;` uses ';' as the delimiter) or use the mapping <kbd>\<Leader\>T</kbd>
defined by `g:table_mode_tableize_op_map` option which takes input in the (defined by the option `g:table_mode_tableize_op_map`) which takes input in the
cmd-line and uses the `{pattern}` input as the delimiter. cmd-line and uses the `{pattern}` input as the delimiter.
`:Tableize` also accepts a range and so you can also call it by giving `:Tableize` also accepts a range. Call it by giving
lines manually like `:line1,line2Tableize`, but this is not very intuitive. lines manually like `:line1,line2Tableize`. However this may not be intuitive.
You can use the mapping <kbd>\<Leader\>T</kbd> with a `[count]` to apply it to the You can use the mapping <kbd>\<Leader\>T</kbd> with a `[count]` to apply it to the
next `[count]` lines in standard vim style. next `[count]` lines in standard vim style.
@@ -160,22 +160,32 @@ it using `:TableModeRealign` or using the default mapping
Tableize provides a text object for manipulating table cells. Following Tableize provides a text object for manipulating table cells. Following
the vim philosophy the you have <kbd>i|</kbd> & <kbd>a|</kbd> for the the vim philosophy the you have <kbd>i|</kbd> & <kbd>a|</kbd> for the
inner and around (including the immidiate right table separator) the inner and around (including the immediate right table separator) the
table cell. table cell.
- **Delete Row** : - **Delete Row** :
You can use the <kbd>\<Leader\>tdd</kbd> mapping defined by the option You can use the <kbd>\<Leader\>tdd</kbd> mapping (defined by the option
`g:table_mode_delete_row_map` to delete the current table row (provided `g:table_mode_delete_row_map`) to delete the current table row (provided
you are within a table row), this can be preceeded with a [count] to you are within a table row). This can be preceeded with a `[count]` to
delete multiple rows just like you would with 'dd'. delete multiple rows as per Vim command grammar.
- **Delete Column** : - **Delete Column** :
You can use the <kbd>\<Leader\>tdc</kbd> mapping defined by the option You can use the <kbd>\<Leader\>tdc</kbd> mapping (defined by the option
`g:table_mode_delete_column_map` to delete the entire current column `g:table_mode_delete_column_map`) to delete the entire current column
(provided you are within a table row), this can also be preceeded with a (provided you are within a table row), this can also be preceeded with a
[count] to delete multiple columns. `[count]` to delete multiple columns.
- **Insert Column** :
You can use the <kbd>\<Leader\>tic</kbd> mapping (defined by the option
`g:table_mode_insert_column_after_map`) to insert a column after the
cursor (provided you are within a table row). Of course you can use the
<kbd>\<Leader\>tiC</kbd> mapping defined by
`g:table_mode_insert_column_before_map` to insert a column before the
cursor. Both can also be preceeded with a [count] to insert multiple
columns.
## Advanced Usage: Spreadsheet Capabilities ## Advanced Usage: Spreadsheet Capabilities
@@ -185,7 +195,7 @@ it using `:TableModeRealign` or using the default mapping
of defining formulas : of defining formulas :
- You can add formulas using `:TableAddFormula` or the mapping <kbd>\<Leader\>tfa</kbd> - You can add formulas using `:TableAddFormula` or the mapping <kbd>\<Leader\>tfa</kbd>
defined by the option `g:table_mode_add_formula_map` from within a table (defined by the option `g:table_mode_add_formula_map`) from within a table
cell, which will ask for input on the cmd-line with a `f=` prompt. The cell, which will ask for input on the cmd-line with a `f=` prompt. The
input formula will be appended to the formula line if one exists or a new input formula will be appended to the formula line if one exists or a new
one will be created with the input formula taking the current cell as the one will be created with the input formula taking the current cell as the
@@ -198,7 +208,7 @@ it using `:TableModeRealign` or using the default mapping
formulas on the line separated with a ';' eg) `# tmf: $3=$2*$1;$4=$3/3.14` formulas on the line separated with a ';' eg) `# tmf: $3=$2*$1;$4=$3/3.14`
You can evaluate the formula line using `:TableEvalFormulaLine` or the You can evaluate the formula line using `:TableEvalFormulaLine` or the
mapping <kbd>\<Leader\>tfe</kbd> defined by the option `g:table_mode_eval_expr_map` mapping <kbd>\<Leader\>tfe</kbd> (defined by the option `g:table_mode_eval_expr_map`)
from anywhere inside the table or while on the formula line. from anywhere inside the table or while on the formula line.
NOTE: You can now use the mapping <kbd>\<Leader\>t?</kbd> NOTE: You can now use the mapping <kbd>\<Leader\>t?</kbd>
@@ -223,7 +233,7 @@ it using `:TableModeRealign` or using the default mapping
which are also defined by the same format as that of the target cell. You which are also defined by the same format as that of the target cell. You
can use all native vim functions within the formula. Apart from that table can use all native vim functions within the formula. Apart from that table
mode also provides 2 special functions `Sum` and `Average`. Both these mode also provides 2 special functions `Sum` and `Average`. Both these
functions take a range as input. A range can be of two forms : functions take a range as input. A range can be of two forms:
- `r1:r2`: This represents cells in the current column from row `r1` - `r1:r2`: This represents cells in the current column from row `r1`
through `r2`. If `r2` is negative it represents `r2` rows above the through `r2`. If `r2` is negative it represents `r2` rows above the

View File

@@ -40,6 +40,8 @@ function! s:ToggleMapping() "{{{2
call s:Map('<Plug>(table-mode-realign)', g:table_mode_realign_map, 'n') call s:Map('<Plug>(table-mode-realign)', g:table_mode_realign_map, 'n')
call s:Map('<Plug>(table-mode-delete-row)', g:table_mode_delete_row_map, 'n') call s:Map('<Plug>(table-mode-delete-row)', g:table_mode_delete_row_map, 'n')
call s:Map('<Plug>(table-mode-delete-column)', g:table_mode_delete_column_map, 'n') call s:Map('<Plug>(table-mode-delete-column)', g:table_mode_delete_column_map, 'n')
call s:Map('<Plug>(table-mode-insert-column-before)', g:table_mode_insert_column_before_map, 'n')
call s:Map('<Plug>(table-mode-insert-column-after)', g:table_mode_insert_column_after_map, 'n')
call s:Map('<Plug>(table-mode-add-formula)', g:table_mode_add_formula_map, 'n') call s:Map('<Plug>(table-mode-add-formula)', g:table_mode_add_formula_map, 'n')
call s:Map('<Plug>(table-mode-eval-formula)', g:table_mode_eval_formula_map, 'n') call s:Map('<Plug>(table-mode-eval-formula)', g:table_mode_eval_formula_map, 'n')
call s:Map('<Plug>(table-mode-echo-cell)', g:table_mode_echo_cell_map, 'n') call s:Map('<Plug>(table-mode-echo-cell)', g:table_mode_echo_cell_map, 'n')
@@ -57,6 +59,8 @@ function! s:ToggleMapping() "{{{2
call s:UnMap(g:table_mode_realign_map, 'n') call s:UnMap(g:table_mode_realign_map, 'n')
call s:UnMap(g:table_mode_delete_row_map, 'n') call s:UnMap(g:table_mode_delete_row_map, 'n')
call s:UnMap(g:table_mode_delete_column_map, 'n') call s:UnMap(g:table_mode_delete_column_map, 'n')
call s:UnMap(g:table_mode_insert_column_before_map, 'n')
call s:UnMap(g:table_mode_insert_column_after_map, 'n')
call s:UnMap(g:table_mode_add_formula_map, 'n') call s:UnMap(g:table_mode_add_formula_map, 'n')
call s:UnMap(g:table_mode_eval_formula_map, 'n') call s:UnMap(g:table_mode_eval_formula_map, 'n')
call s:UnMap(g:table_mode_echo_cell_map, 'n') call s:UnMap(g:table_mode_echo_cell_map, 'n')

View File

@@ -1,4 +1,106 @@
" Private Functions {{{1 " Private Functions {{{1
function! s:TotalCells(list) "{{{2
let result = 0
for item in a:list
if type(item) == type([])
let result += s:TotalCells(item)
else
let result += 1
endif
endfor
return result
endfunction
function! s:Min(list) "{{{2
let found = v:false
let result = 0
for item in a:list
if empty(item)
continue
endif
if type(item) == type(1) || type(item) == type(1.0)
if found == v:false || item < result
let found = v:true
let result = item
endif
elseif type(item) == type('')
let val = str2float(item)
if found == v:false || val < result
let found = v:true
let result = val
endif
elseif type(item) == type([])
let val = s:Min(item)
if found == v:false || val < result
let found = v:true
let result = val
endif
endif
endfor
return result
endfunction
function! s:Max(list) "{{{2
let found = v:false
let result = 0
for item in a:list
if empty(item)
continue
endif
if type(item) == type(1) || type(item) == type(1.0)
if found == v:false || item > result
let found = v:true
let result = item
endif
elseif type(item) == type('')
let val = str2float(item)
if found == v:false || val > result
let found = v:true
let result = val
endif
elseif type(item) == type([])
let val = s:Max(item)
if found == v:false || val > result
let found = v:true
let result = val
endif
endif
endfor
return result
endfunction
function! s:CountE(list) "{{{2
let result = 0
for item in a:list
if empty(item)
let result += 1
elseif type(item) == type([])
let result += s:CountE(item)
endif
endfor
return result
endfunction
function! s:CountNE(list) "{{{2
let result = 0
for item in a:list
if type(item) == type([])
let result += s:CountNE(item)
elseif !empty(item)
let result += 1
endif
endfor
return result
endfunction
function! s:PercentE(list) "{{{2
return (s:CountE(a:list)*100)/s:TotalCells(a:list)
endfunction
function! s:PercentNE(list) "{{{2
return (s:CountNE(a:list)*100)/s:TotalCells(a:list)
endfunction
function! s:Sum(list) "{{{2 function! s:Sum(list) "{{{2
let result = 0.0 let result = 0.0
for item in a:list for item in a:list
@@ -14,7 +116,11 @@ function! s:Sum(list) "{{{2
endfunction endfunction
function! s:Average(list) "{{{2 function! s:Average(list) "{{{2
return s:Sum(a:list)/len(a:list) return s:Sum(a:list)/s:TotalCells(a:list)
endfunction
function! s:AverageNE(list) "{{{2
return s:Sum(a:list)/s:CountNE(a:list)
endfunction endfunction
" Public Functions {{{1 " Public Functions {{{1
@@ -31,9 +137,28 @@ function! tablemode#spreadsheet#GetFirstRow(line) "{{{2
endif endif
endfunction endfunction
function! tablemode#spreadsheet#GetFirstRowOrHeader(line) "{{{2
if tablemode#table#IsRow(a:line)
let line = tablemode#utils#line(a:line)
while tablemode#table#IsTable(line - 1)
let line -= 1
endwhile
if tablemode#table#IsBorder(line) | let line += 1 | endif
return line
endif
endfunction
function! tablemode#spreadsheet#MoveToFirstRow() "{{{2 function! tablemode#spreadsheet#MoveToFirstRow() "{{{2
if tablemode#table#IsRow('.') if tablemode#table#IsRow('.')
call cursor(tablemode#spreadsheet#GetFirstRow('.'), col('.')) call tablemode#utils#MoveToLine(tablemode#spreadsheet#GetFirstRow('.'))
endif
endfunction
function! tablemode#spreadsheet#MoveToFirstRowOrHeader() "{{{2
if tablemode#table#IsRow('.')
call tablemode#utils#MoveToLine(tablemode#spreadsheet#GetFirstRowOrHeader('.'))
endif endif
endfunction endfunction
@@ -52,7 +177,7 @@ endfunction
function! tablemode#spreadsheet#MoveToLastRow() "{{{2 function! tablemode#spreadsheet#MoveToLastRow() "{{{2
if tablemode#table#IsRow('.') if tablemode#table#IsRow('.')
call cursor(tablemode#spreadsheet#GetLastRow('.'), col('.')) call tablemode#utils#MoveToLine(tablemode#spreadsheet#GetLastRow('.'))
endif endif
endfunction endfunction
@@ -113,13 +238,11 @@ function! tablemode#spreadsheet#ColumnNr(pos) "{{{2
return 0 return 0
endif endif
let row_start = stridx(getline(pos[0]), g:table_mode_separator) let row_start = stridx(getline(pos[0]), g:table_mode_separator)
return tablemode#utils#strlen(substitute(getline(pos[0])[(row_start):pos[1]-2], '[^' . g:table_mode_separator . ']', '', 'g')) return tablemode#utils#SeparatorCount(getline(pos[0])[row_start:pos[1]-2])
endfunction endfunction
function! tablemode#spreadsheet#ColumnCount(line) "{{{2 function! tablemode#spreadsheet#ColumnCount(line) "{{{2
let line = tablemode#utils#line(a:line) return tablemode#utils#SeparatorCount(getline(tablemode#utils#line(a:line))) - 1
return tablemode#utils#strlen(substitute(getline(line), '[^' . g:table_mode_separator . ']', '', 'g'))-1
endfunction endfunction
function! tablemode#spreadsheet#IsFirstCell() "{{{2 function! tablemode#spreadsheet#IsFirstCell() "{{{2
@@ -131,19 +254,25 @@ function! tablemode#spreadsheet#IsLastCell() "{{{2
endfunction endfunction
function! tablemode#spreadsheet#MoveToStartOfCell() "{{{2 function! tablemode#spreadsheet#MoveToStartOfCell() "{{{2
if getline('.')[col('.')-1] ==# g:table_mode_separator && !tablemode#spreadsheet#IsLastCell() if getline('.')[col('.')-1] !=# g:table_mode_separator || tablemode#spreadsheet#IsLastCell()
normal! 2l call search(g:table_mode_escaped_separator_regex, 'b', line('.'))
else
execute 'normal! F' . g:table_mode_separator . '2l'
endif endif
normal! 2l
endfunction
function! tablemode#spreadsheet#MoveToEndOfCell() "{{{2
call search(g:table_mode_escaped_separator_regex, 'z', line('.'))
normal! 2h
endfunction endfunction
function! tablemode#spreadsheet#DeleteColumn() "{{{2 function! tablemode#spreadsheet#DeleteColumn() "{{{2
if tablemode#table#IsRow('.') if tablemode#table#IsRow('.')
for i in range(v:count1) for i in range(v:count1)
call tablemode#spreadsheet#MoveToStartOfCell() call tablemode#spreadsheet#MoveToStartOfCell()
call tablemode#spreadsheet#MoveToFirstRow() call tablemode#spreadsheet#MoveToFirstRowOrHeader()
silent! execute "normal! h\<C-V>f" . g:table_mode_separator silent! execute "normal! h\<C-V>"
call tablemode#spreadsheet#MoveToEndOfCell()
normal! 2l
call tablemode#spreadsheet#MoveToLastRow() call tablemode#spreadsheet#MoveToLastRow()
normal! d normal! d
endfor endfor
@@ -168,6 +297,95 @@ function! tablemode#spreadsheet#DeleteRow() "{{{2
endif endif
endfunction endfunction
function! tablemode#spreadsheet#InsertColumn(after) "{{{2
if tablemode#table#IsRow('.')
let quantity = v:count1
call tablemode#spreadsheet#MoveToFirstRowOrHeader()
call tablemode#spreadsheet#MoveToStartOfCell()
if a:after
call tablemode#spreadsheet#MoveToEndOfCell()
normal! 3l
endif
execute "normal! h\<C-V>"
call tablemode#spreadsheet#MoveToLastRow()
normal! y
let corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner')
if a:after
let cell_line = g:table_mode_separator.' '
let header_line = corner.g:table_mode_fillchar.g:table_mode_fillchar
else
let cell_line = ' '.g:table_mode_separator
let header_line = g:table_mode_fillchar.g:table_mode_fillchar.corner
endif
let cell_line = escape(cell_line, '\&')
let header_line = escape(header_line, '\&')
" This transforms the character column before or after the column separator
" into a new column with separator.
" This requires, that
" g:table_mode_separator != g:table_mode_fillchar
" && g:table_mode_separator != g:table_mode_header_fillchar
" && g:table_mode_separator != g:table_mode_align_char
call setreg(
\ '"',
\ substitute(
\ substitute(@", ' ', cell_line, 'g'),
\ '\V\C'.escape(g:table_mode_fillchar, '\')
\ .'\|'.escape(g:table_mode_header_fillchar, '\')
\ .'\|'.escape(g:table_mode_align_char, '\'),
\ header_line,
\ 'g'),
\ 'b')
if a:after
execute "normal! ".quantity."pl"
else
execute "normal! ".quantity."P"
endif
call tablemode#table#Realign('.')
startinsert
endif
endfunction
function! tablemode#spreadsheet#Min(range, ...) abort "{{{2
let args = copy(a:000)
call insert(args, a:range)
return s:Min(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction
function! tablemode#spreadsheet#Max(range, ...) abort "{{{2
let args = copy(a:000)
call insert(args, a:range)
return s:Max(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction
function! tablemode#spreadsheet#CountE(range, ...) abort "{{{2
let args = copy(a:000)
call insert(args, a:range)
return s:CountE(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction
function! tablemode#spreadsheet#CountNE(range, ...) abort "{{{2
let args = copy(a:000)
call insert(args, a:range)
return s:CountNE(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction
function! tablemode#spreadsheet#PercentE(range, ...) abort "{{{2
let args = copy(a:000)
call insert(args, a:range)
return s:PercentE(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction
function! tablemode#spreadsheet#PercentNE(range, ...) abort "{{{2
let args = copy(a:000)
call insert(args, a:range)
return s:PercentNE(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction
function! tablemode#spreadsheet#Sum(range, ...) abort "{{{2 function! tablemode#spreadsheet#Sum(range, ...) abort "{{{2
let args = copy(a:000) let args = copy(a:000)
call insert(args, a:range) call insert(args, a:range)
@@ -180,6 +398,12 @@ function! tablemode#spreadsheet#Average(range, ...) abort "{{{2
return s:Average(call('tablemode#spreadsheet#cell#GetCellRange', args)) return s:Average(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction endfunction
function! tablemode#spreadsheet#AverageNE(range, ...) abort "{{{2
let args = copy(a:000)
call insert(args, a:range)
return s:AverageNE(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction
function! tablemode#spreadsheet#Sort(bang, ...) range "{{{2 function! tablemode#spreadsheet#Sort(bang, ...) range "{{{2
if exists('*getcurpos') if exists('*getcurpos')
let col = getcurpos()[4] " curswant let col = getcurpos()[4] " curswant

View File

@@ -1,4 +1,8 @@
" Private Functions {{{1 " Private Functions {{{1
function! s:IsHTMLComment(line) "{{{2
return getline(a:line) =~# '^\s*<!--'
endfunction
function! s:IsFormulaLine(line) "{{{2 function! s:IsFormulaLine(line) "{{{2
return getline(a:line) =~# 'tmf: ' return getline(a:line) =~# 'tmf: '
endfunction endfunction
@@ -15,6 +19,7 @@ function! tablemode#spreadsheet#formula#Add(...) "{{{2
let fr = '$' . row . ',' . colm . '=' . fr let fr = '$' . row . ',' . colm . '=' . fr
let fline = tablemode#spreadsheet#GetLastRow('.') + 1 let fline = tablemode#spreadsheet#GetLastRow('.') + 1
if tablemode#table#IsBorder(fline) | let fline += 1 | endif if tablemode#table#IsBorder(fline) | let fline += 1 | endif
if s:IsHTMLComment(fline) | let fline += 1 | endif
let cursor_pos = [line('.'), col('.')] let cursor_pos = [line('.'), col('.')]
if getline(fline) =~# 'tmf: ' if getline(fline) =~# 'tmf: '
" Comment line correctly " Comment line correctly
@@ -55,6 +60,30 @@ function! tablemode#spreadsheet#formula#EvaluateExpr(expr, line) abort "{{{2
let [row, colm] = [0, str2nr(cell)] let [row, colm] = [0, str2nr(cell)]
endif endif
if expr =~# 'Min(.*)'
let expr = substitute(expr, 'Min(\([^)]*\))', 'tablemode#spreadsheet#Min("\1",'.line.','.colm.')', 'g')
endif
if expr =~# 'Max(.*)'
let expr = substitute(expr, 'Max(\([^)]*\))', 'tablemode#spreadsheet#Max("\1",'.line.','.colm.')', 'g')
endif
if expr =~# 'CountE(.*)'
let expr = substitute(expr, 'CountE(\([^)]*\))', 'tablemode#spreadsheet#CountE("\1",'.line.','.colm.')', 'g')
endif
if expr =~# 'CountNE(.*)'
let expr = substitute(expr, 'CountNE(\([^)]*\))', 'tablemode#spreadsheet#CountNE("\1",'.line.','.colm.')', 'g')
endif
if expr =~# 'PercentE(.*)'
let expr = substitute(expr, 'PercentE(\([^)]*\))', 'tablemode#spreadsheet#PercentE("\1",'.line.','.colm.')', 'g')
endif
if expr =~# 'PercentNE(.*)'
let expr = substitute(expr, 'PercentNE(\([^)]*\))', 'tablemode#spreadsheet#PercentNE("\1",'.line.','.colm.')', 'g')
endif
if expr =~# 'Sum(.*)' if expr =~# 'Sum(.*)'
let expr = substitute(expr, 'Sum(\([^)]*\))', 'tablemode#spreadsheet#Sum("\1",'.line.','.colm.')', 'g') let expr = substitute(expr, 'Sum(\([^)]*\))', 'tablemode#spreadsheet#Sum("\1",'.line.','.colm.')', 'g')
endif endif
@@ -63,6 +92,10 @@ function! tablemode#spreadsheet#formula#EvaluateExpr(expr, line) abort "{{{2
let expr = substitute(expr, 'Average(\([^)]*\))', 'tablemode#spreadsheet#Average("\1",'.line.','.colm.')', 'g') let expr = substitute(expr, 'Average(\([^)]*\))', 'tablemode#spreadsheet#Average("\1",'.line.','.colm.')', 'g')
endif endif
if expr =~# 'AverageNE(.*)'
let expr = substitute(expr, 'AverageNE(\([^)]*\))', 'tablemode#spreadsheet#AverageNE("\1",'.line.','.colm.')', 'g')
endif
if expr =~# '\$\-\?\d\+,\-\?\d\+' if expr =~# '\$\-\?\d\+,\-\?\d\+'
let expr = substitute(expr, '\$\(\-\?\d\+\),\(\-\?\d\+\)', let expr = substitute(expr, '\$\(\-\?\d\+\),\(\-\?\d\+\)',
\ '\=str2float(tablemode#spreadsheet#cell#GetCells(line, submatch(1), submatch(2)))', 'g') \ '\=str2float(tablemode#spreadsheet#cell#GetCells(line, submatch(1), submatch(2)))', 'g')
@@ -76,15 +109,17 @@ function! tablemode#spreadsheet#formula#EvaluateExpr(expr, line) abort "{{{2
call tablemode#spreadsheet#cell#SetCell(eval(expr), line, row, colm) call tablemode#spreadsheet#cell#SetCell(eval(expr), line, row, colm)
else else
let [row, line] = [1, tablemode#spreadsheet#GetFirstRow(line)] let [row, line] = [1, tablemode#spreadsheet#GetFirstRow(line)]
while tablemode#table#IsRow(line) while !s:IsFormulaLine(line)
let texpr = expr if !tablemode#table#IsBorder(line)
if expr =~# '\$' let texpr = expr
let texpr = substitute(texpr, '\$\(\d\+\)', if expr =~# '\$'
\ '\=str2float(tablemode#spreadsheet#cell#GetCells(line, row, submatch(1)))', 'g') let texpr = substitute(texpr, '\$\(\d\+\)',
endif \ '\=str2float(tablemode#spreadsheet#cell#GetCells(line, row, submatch(1)))', 'g')
endif
call tablemode#spreadsheet#cell#SetCell(eval(texpr), line, row, colm) call tablemode#spreadsheet#cell#SetCell(eval(texpr), line, row, colm)
let row += 1 let row += 1
endif
let line += 1 let line += 1
endwhile endwhile
endif endif
@@ -107,6 +142,7 @@ function! tablemode#spreadsheet#formula#EvaluateFormulaLine() abort "{{{2
if tablemode#table#IsRow('.') " We're inside the table if tablemode#table#IsRow('.') " We're inside the table
let line = tablemode#spreadsheet#GetLastRow('.') let line = tablemode#spreadsheet#GetLastRow('.')
let fline = line + 1 let fline = line + 1
if s:IsHTMLComment(fline) | let fline += 1 | endif
if tablemode#table#IsBorder(fline) | let fline += 1 | endif if tablemode#table#IsBorder(fline) | let fline += 1 | endif
while s:IsFormulaLine(fline) while s:IsFormulaLine(fline)
let exprs += split(matchstr(getline(fline), matchexpr), ';') let exprs += split(matchstr(getline(fline), matchexpr), ';')
@@ -116,6 +152,7 @@ function! tablemode#spreadsheet#formula#EvaluateFormulaLine() abort "{{{2
let fline = line('.') let fline = line('.')
let line = line('.') - 1 let line = line('.') - 1
while s:IsFormulaLine(line) | let fline = line | let line -= 1 | endwhile while s:IsFormulaLine(line) | let fline = line | let line -= 1 | endwhile
if s:IsHTMLComment(line) | let line -= 1 | endif
if tablemode#table#IsBorder(line) | let line -= 1 | endif if tablemode#table#IsBorder(line) | let line -= 1 | endif
if tablemode#table#IsRow(line) if tablemode#table#IsRow(line)
" let exprs = split(matchstr(getline('.'), matchexpr), ';') " let exprs = split(matchstr(getline('.'), matchexpr), ';')

View File

@@ -51,3 +51,16 @@ endfunction
function! tablemode#utils#get_buffer_or_global_option(table_option) "{{{2 function! tablemode#utils#get_buffer_or_global_option(table_option) "{{{2
return get(b:, a:table_option, get(g:, a:table_option)) return get(b:, a:table_option, get(g:, a:table_option))
endf endf
function tablemode#utils#MoveToLine(line) "{{{2
let offset = tablemode#utils#line(a:line) - line('.')
if offset > 0
execute "normal! ".offset."j"
elseif offset < 0
execute "normal! ".(-offset)."k"
endif
endfunction
function! tablemode#utils#SeparatorCount(str)
return tablemode#utils#strlen(substitute(a:str, '\V\C\(\\' . escape(g:table_mode_separator, '\') . '\|\[^' . escape(g:table_mode_separator, ']^-\') . ']\)', '', 'g'))
endfunction

View File

@@ -1,7 +1,7 @@
*table-mode.txt* Table Mode for easy table formatting *table-mode.txt* Table Mode for easy table formatting
=============================================================================== ===============================================================================
Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER
VERSION 4.6.7 VERSION 4.7.2
Author: Dhruva Sagar <http://dhruvasagar.com/> Author: Dhruva Sagar <http://dhruvasagar.com/>
License: MIT <http://opensource.org/licenses/MIT/> License: MIT <http://opensource.org/licenses/MIT/>
@@ -53,11 +53,10 @@ Tableize content:
Move between cells : Move between cells :
Now you can move between cells using table mode motions Now you can move between cells using table mode motions
'<Leader>t[hjkl]' to move left | down | up | right cells respectively. '[|, ]|, {|, }|' to move left | down | up | right cells respectively.
You can use |table-mode-map-prefix| option to define the prefix The left | right motions wrap around the table and move to the next
mapping to be used before 'hjkl'. The left | right motions wrap around | previous row after the last | first cell in the current row if one
the table and move to the next | previous row after the last | first exists.
cell in the current row if one exists.
Manipulation of tables: Manipulation of tables:
Tableize provides 3 easy ways to quickly manipulate tables. Tableize provides 3 easy ways to quickly manipulate tables.
@@ -75,6 +74,10 @@ Manipulation of tables:
3. Delete Row : Delete an entire table row using 3. Delete Row : Delete an entire table row using
|table-mode-delete-row-map| |table-mode-delete-row-map|
4. Insert Column : Insert a table column either before the cursor
using |table-mode-insert-column-before-map| or after the cusor using
|table-mode-insert-column-after-map|.
Table Formulas: Table Formulas:
Table Mode now has support for formulas like a spreadsheet. There Table Mode now has support for formulas like a spreadsheet. There
are 2 ways of defining formulas : are 2 ways of defining formulas :
@@ -116,8 +119,11 @@ Formula Expressions :
The formula can be a simple mathematical expression involving cells The formula can be a simple mathematical expression involving cells
which are also defined by the same format as that of the target cell. which are also defined by the same format as that of the target cell.
Apart from basic mathematical expressions, table mode also provides Apart from basic mathematical expressions, table mode also provides
special functions 'Sum' and 'Average'. Both these functions take a special functions 'Min', 'Max', 'CountE' (number of empty cells),
range as input. A range can be of two forms : 'CountNE' (number of non-empty cells), 'PercentE' (percent of empty
cells), 'PercentNE' (percent of non-empty cells), 'Sum', 'Average',
and 'AverageNE' (average over non-empty cells). All these functions
take a range as input. A range can be of two forms :
'n:m': This represents cells in the current column from row 'n:m': This represents cells in the current column from row
'n' through 'm'. If 'm' is negative it represents 'm' row 'n' through 'm'. If 'm' is negative it represents 'm' row
@@ -165,6 +171,12 @@ Overview:
|table-mode-realign-map| ........ Set the realign mapping |table-mode-realign-map| ........ Set the realign mapping
|table-mode-delete-row-map| ..... Set the delete row mapping |table-mode-delete-row-map| ..... Set the delete row mapping
|table-mode-delete-column-map| .. Set the delete column mapping |table-mode-delete-column-map| .. Set the delete column mapping
|table-mode-insert-column-before-map|
Set the insert column before the
cursor mapping
|table-mode-insert-column-after-map|
Set the insert column after the
cursor mapping
|table-mode-add-formula-map| .... Set the add formula mapping |table-mode-add-formula-map| .... Set the add formula mapping
|table-mode-eval-formula-map| ... Set the eval formula mapping |table-mode-eval-formula-map| ... Set the eval formula mapping
|table-mode-echo-cell-map| ...... Set the echo cell mapping |table-mode-echo-cell-map| ...... Set the echo cell mapping
@@ -286,6 +298,16 @@ g:table_mode_delete_column_map *table-mode-delete-column-map*
Set this to configure the mapping for deleting a table column. > Set this to configure the mapping for deleting a table column. >
let g:table_mode_delete_column_map = '<Leader>tdc' let g:table_mode_delete_column_map = '<Leader>tdc'
> >
g:table_mode_insert_column_before_map *table-mode-insert-column-before-map*
Set this to configure the mapping for inserting a table column before
the cursor. >
let g:table_mode_insert_column_before_map = '<Leader>tiC'
>
g:table_mode_insert_column_after_map *table-mode-insert-column-after-map*
Set this to configure the mapping for inserting a table column after
the cursor. >
let g:table_mode_insert_column_after_map = '<Leader>tic'
>
g:table_mode_add_formula_map *table-mode-add-formula-map* g:table_mode_add_formula_map *table-mode-add-formula-map*
Set this to configure the mapping for adding a formula for a table Set this to configure the mapping for adding a formula for a table
cell. > cell. >
@@ -332,6 +354,11 @@ g:table_mode_update_time *table-mode-update-time*
let g:table_mode_update_time = 500 let g:table_mode_update_time = 500
< <
g:table_mode_disable_tableize_mappings *table-mode-disable-tableize-mappings*
Disables mappings for tableize. >
let g:table_mode_disable_tableize_mappings = 0
<
=============================================================================== ===============================================================================
MAPPINGS *table-mode-mappings* MAPPINGS *table-mode-mappings*
@@ -379,6 +406,16 @@ MAPPINGS *table-mode-mappings*
with a [count] to delete multiple columns to the right. You with a [count] to delete multiple columns to the right. You
can change this using |table-mode-delete-column-map| option. can change this using |table-mode-delete-column-map| option.
*table-mode-mappings-insert-column-before*
<Leader>tiC Insert a table column before the column you are within. You can
preceed it with a [count] to insert multiple columns. You can
change this using |table-mode-insert-column-before-map| option.
*table-mode-mappings-insert-column-after*
<Leader>tic Insert a table column after the column you are within. You can
preceed it with a [count] to insert multiple columns. You can
change this using |table-mode-insert-column-after-map| option.
*table-mode-mappings-add-formula* *table-mode-mappings-add-formula*
<Leader>tfa Add a fomula for the current table cell. This invokes <Leader>tfa Add a fomula for the current table cell. This invokes
|TableAddFormula| command. |TableAddFormula| command.

View File

@@ -18,7 +18,7 @@ endfunction
call s:SetGlobalOptDefault('table_mode_corner', '+') call s:SetGlobalOptDefault('table_mode_corner', '+')
call s:SetGlobalOptDefault('table_mode_verbose', 1) call s:SetGlobalOptDefault('table_mode_verbose', 1)
call s:SetGlobalOptDefault('table_mode_separator', '|') call s:SetGlobalOptDefault('table_mode_separator', '|')
call s:SetGlobalOptDefault('table_mode_escaped_separator_regex', '\(\\\)\@<!' . g:table_mode_separator) call s:SetGlobalOptDefault('table_mode_escaped_separator_regex', '\V\C\\\@1<!'.escape(g:table_mode_separator, '\'))
call s:SetGlobalOptDefault('table_mode_fillchar', '-') call s:SetGlobalOptDefault('table_mode_fillchar', '-')
call s:SetGlobalOptDefault('table_mode_header_fillchar', '-') call s:SetGlobalOptDefault('table_mode_header_fillchar', '-')
call s:SetGlobalOptDefault('table_mode_map_prefix', '<Leader>t') call s:SetGlobalOptDefault('table_mode_map_prefix', '<Leader>t')
@@ -28,6 +28,7 @@ call s:SetGlobalOptDefault('table_mode_delimiter', ',')
call s:SetGlobalOptDefault('table_mode_corner_corner', '|') call s:SetGlobalOptDefault('table_mode_corner_corner', '|')
call s:SetGlobalOptDefault('table_mode_align_char', ':') call s:SetGlobalOptDefault('table_mode_align_char', ':')
call s:SetGlobalOptDefault('table_mode_disable_mappings', 0) call s:SetGlobalOptDefault('table_mode_disable_mappings', 0)
call s:SetGlobalOptDefault('table_mode_disable_tableize_mappings', 0)
call s:SetGlobalOptDefault('table_mode_motion_up_map', '{<Bar>') call s:SetGlobalOptDefault('table_mode_motion_up_map', '{<Bar>')
call s:SetGlobalOptDefault('table_mode_motion_down_map', '}<Bar>') call s:SetGlobalOptDefault('table_mode_motion_down_map', '}<Bar>')
@@ -40,6 +41,8 @@ call s:SetGlobalOptDefault('table_mode_cell_text_object_i_map', 'i<Bar>')
call s:SetGlobalOptDefault('table_mode_realign_map', g:table_mode_map_prefix.'r') call s:SetGlobalOptDefault('table_mode_realign_map', g:table_mode_map_prefix.'r')
call s:SetGlobalOptDefault('table_mode_delete_row_map', g:table_mode_map_prefix.'dd') call s:SetGlobalOptDefault('table_mode_delete_row_map', g:table_mode_map_prefix.'dd')
call s:SetGlobalOptDefault('table_mode_delete_column_map', g:table_mode_map_prefix.'dc') call s:SetGlobalOptDefault('table_mode_delete_column_map', g:table_mode_map_prefix.'dc')
call s:SetGlobalOptDefault('table_mode_insert_column_before_map', g:table_mode_map_prefix.'iC')
call s:SetGlobalOptDefault('table_mode_insert_column_after_map', g:table_mode_map_prefix.'ic')
call s:SetGlobalOptDefault('table_mode_add_formula_map', g:table_mode_map_prefix.'fa') call s:SetGlobalOptDefault('table_mode_add_formula_map', g:table_mode_map_prefix.'fa')
call s:SetGlobalOptDefault('table_mode_eval_formula_map', g:table_mode_map_prefix.'fe') call s:SetGlobalOptDefault('table_mode_eval_formula_map', g:table_mode_map_prefix.'fe')
call s:SetGlobalOptDefault('table_mode_echo_cell_map', g:table_mode_map_prefix.'?') call s:SetGlobalOptDefault('table_mode_echo_cell_map', g:table_mode_map_prefix.'?')
@@ -102,6 +105,8 @@ xnoremap <silent> <Plug>(table-mode-cell-text-object-i) :<C-U>call tablemode#spr
nnoremap <silent> <Plug>(table-mode-delete-row) :<C-U>call tablemode#spreadsheet#DeleteRow()<CR> nnoremap <silent> <Plug>(table-mode-delete-row) :<C-U>call tablemode#spreadsheet#DeleteRow()<CR>
nnoremap <silent> <Plug>(table-mode-delete-column) :<C-U>call tablemode#spreadsheet#DeleteColumn()<CR> nnoremap <silent> <Plug>(table-mode-delete-column) :<C-U>call tablemode#spreadsheet#DeleteColumn()<CR>
nnoremap <silent> <Plug>(table-mode-insert-column-before) :<C-U>call tablemode#spreadsheet#InsertColumn(0)<CR>
nnoremap <silent> <Plug>(table-mode-insert-column-after) :<C-U>call tablemode#spreadsheet#InsertColumn(1)<CR>
nnoremap <silent> <Plug>(table-mode-add-formula) :call tablemode#spreadsheet#formula#Add()<CR> nnoremap <silent> <Plug>(table-mode-add-formula) :call tablemode#spreadsheet#formula#Add()<CR>
nnoremap <silent> <Plug>(table-mode-eval-formula) :call tablemode#spreadsheet#formula#EvaluateFormulaLine()<CR> nnoremap <silent> <Plug>(table-mode-eval-formula) :call tablemode#spreadsheet#formula#EvaluateFormulaLine()<CR>
@@ -110,13 +115,15 @@ nnoremap <silent> <Plug>(table-mode-echo-cell) :call <SID>TableEchoCell()<CR>
nnoremap <silent> <Plug>(table-mode-sort) :call tablemode#spreadsheet#Sort('')<CR> nnoremap <silent> <Plug>(table-mode-sort) :call tablemode#spreadsheet#Sort('')<CR>
if !hasmapto('<Plug>(table-mode-tableize)') if !g:table_mode_disable_tableize_mappings
exec "nmap" g:table_mode_tableize_map "<Plug>(table-mode-tableize)" if !hasmapto('<Plug>(table-mode-tableize)')
exec "xmap" g:table_mode_tableize_map "<Plug>(table-mode-tableize)" exec "nmap" g:table_mode_tableize_map "<Plug>(table-mode-tableize)"
endif exec "xmap" g:table_mode_tableize_map "<Plug>(table-mode-tableize)"
endif
if !hasmapto('<Plug>(table-mode-tableize-delimiter)') if !hasmapto('<Plug>(table-mode-tableize-delimiter)')
exec "xmap" g:table_mode_tableize_d_map "<Plug>(table-mode-tableize-delimiter)" exec "xmap" g:table_mode_tableize_d_map "<Plug>(table-mode-tableize-delimiter)"
endif
endif endif
augroup TableMode "{{{1 augroup TableMode "{{{1

View File

@@ -1,6 +1,6 @@
let g:table_mode_corner = '+' let g:table_mode_corner = '+'
let g:table_mode_separator = '|' let g:table_mode_separator = '|'
let g:table_mode_escaped_separator_regex = '\(\\\)\@<!|' let g:table_mode_escaped_separator_regex = '\V\C\\\@1<!|'
let g:table_mode_fillchar = '-' let g:table_mode_fillchar = '-'
let g:table_mode_header_fillchar = '-' let g:table_mode_header_fillchar = '-'
let g:table_mode_map_prefix = '<Leader>t' let g:table_mode_map_prefix = '<Leader>t'
@@ -22,6 +22,8 @@ let g:table_mode_cell_text_object_i_map = 'i<Bar>'
let g:table_mode_realign_map = '<Leader>tr' let g:table_mode_realign_map = '<Leader>tr'
let g:table_mode_delete_row_map = '<Leader>tdd' let g:table_mode_delete_row_map = '<Leader>tdd'
let g:table_mode_delete_column_map = '<Leader>tdc' let g:table_mode_delete_column_map = '<Leader>tdc'
let g:table_mode_insert_column_before_map = '<Leader>tiC'
let g:table_mode_insert_column_after_map = '<Leader>tic'
let g:table_mode_add_formula_map = '<Leader>tfa' let g:table_mode_add_formula_map = '<Leader>tfa'
let g:table_mode_eval_formula_map = '<Leader>tfe' let g:table_mode_eval_formula_map = '<Leader>tfe'
let g:table_mode_echo_cell_map = '<Leader>t?' let g:table_mode_echo_cell_map = '<Leader>t?'

View File

@@ -0,0 +1,3 @@
| 1 | 2 | 3 |
| | 0 | |
| 4 | 5 | 6 |

View File

@@ -0,0 +1,9 @@
|----------+----------+----------+----------|
| counting | backward | alphabet | backward |
|:========:+:=========+=========:+==========|
| 1 | 9 | a | z |
| 2 | 8 | b | y |
| 3 | 7 | c | x |
| 4 | 6 | d | w |
| 5 | 5 | e | v |
|----------+----------+----------+----------|

View File

@@ -0,0 +1,9 @@
|-------------------+---------------------------|
| The \| works as | It can be escaped by a \. |
| a separator. | |
| | |
| Escaping \ with | This feature would |
| a \ doesn't work. | be unnecessary, because |
| | a separator must be |
| | preceded by a space. |
|-------------------+---------------------------|

View File

@@ -74,11 +74,93 @@ describe 'spreadsheet'
call cursor(1,3) call cursor(1,3)
Expect tablemode#spreadsheet#Average('1:2') == 2.0 Expect tablemode#spreadsheet#Average('1:2') == 2.0
Expect tablemode#spreadsheet#Average('1,1:1,2') == 1.5 Expect tablemode#spreadsheet#Average('1,1:1,2') == 1.5
Expect tablemode#spreadsheet#Average('1,1:2,2') == 5.0 Expect tablemode#spreadsheet#Average('1,1:2,2') == 2.5
call cursor(2,7) call cursor(2,7)
Expect tablemode#spreadsheet#Average('1:2') == 3.0 Expect tablemode#spreadsheet#Average('1:2') == 3.0
Expect tablemode#spreadsheet#Average('2,1:2,2') == 3.5 Expect tablemode#spreadsheet#Average('2,1:2,2') == 3.5
end end
it 'should return the min of cell range'
call cursor(1,3)
Expect tablemode#spreadsheet#Min('1:2') == 1.0
Expect tablemode#spreadsheet#Min('1,1:1,2') == 1.0
Expect tablemode#spreadsheet#Min('1,1:2,2') == 1.0
call cursor(2,7)
Expect tablemode#spreadsheet#Min('1:2') == 2.0
Expect tablemode#spreadsheet#Min('2,1:2,2') == 3.0
end
it 'should return the max of cell range'
call cursor(1,3)
Expect tablemode#spreadsheet#Max('1:2') == 3.0
Expect tablemode#spreadsheet#Max('1,1:1,2') == 2.0
Expect tablemode#spreadsheet#Max('1,1:2,2') == 4.0
call cursor(2,7)
Expect tablemode#spreadsheet#Max('1:2') == 4.0
Expect tablemode#spreadsheet#Max('2,1:2,2') == 4.0
end
end
describe 'Count'
before
new
read t/fixtures/cell/counts.txt
end
it 'should return the count of empty cell range'
call cursor(1,3)
Expect tablemode#spreadsheet#CountE('1:3') == 1
Expect tablemode#spreadsheet#CountE('1,1:1,3') == 0
Expect tablemode#spreadsheet#CountE('2,1:2,3') == 2
Expect tablemode#spreadsheet#CountE('1,1:3,3') == 2
call cursor(3,11)
Expect tablemode#spreadsheet#CountE('1:3') == 1
Expect tablemode#spreadsheet#CountE('3,1:3,3') == 0
end
it 'should return the count of not-empty cell range'
call cursor(1,3)
Expect tablemode#spreadsheet#CountNE('1:3') == 2
Expect tablemode#spreadsheet#CountNE('1,1:1,3') == 3
Expect tablemode#spreadsheet#CountNE('2,1:2,3') == 1
Expect tablemode#spreadsheet#CountNE('1,1:3,3') == 7
call cursor(3,11)
Expect tablemode#spreadsheet#CountNE('1:3') == 2
Expect tablemode#spreadsheet#CountNE('3,1:3,3') == 3
end
it 'should return the percent count of empty cell range'
call cursor(1,3)
Expect tablemode#spreadsheet#PercentE('1:3') == 33
Expect tablemode#spreadsheet#PercentE('1,1:1,3') == 0
Expect tablemode#spreadsheet#PercentE('2,1:2,3') == 66
Expect tablemode#spreadsheet#PercentE('1,1:3,3') == 22
call cursor(3,11)
Expect tablemode#spreadsheet#PercentE('1:3') == 33
Expect tablemode#spreadsheet#PercentE('3,1:3,3') == 0
end
it 'should return the percent count of not-empty cell range'
call cursor(1,3)
Expect tablemode#spreadsheet#PercentNE('1:3') == 66
Expect tablemode#spreadsheet#PercentNE('1,1:1,3') == 100
Expect tablemode#spreadsheet#PercentNE('2,1:2,3') == 33
Expect tablemode#spreadsheet#PercentNE('1,1:3,3') == 77
call cursor(3,11)
Expect tablemode#spreadsheet#PercentNE('1:3') == 66
Expect tablemode#spreadsheet#PercentNE('3,1:3,3') == 100
end
it 'should return the average of not-empty cell range'
call cursor(1,3)
Expect tablemode#spreadsheet#AverageNE('1:3') == 2.5
Expect tablemode#spreadsheet#AverageNE('1,1:1,3') == 2.0
Expect tablemode#spreadsheet#AverageNE('2,1:2,3') == 0.0
Expect tablemode#spreadsheet#AverageNE('1,1:3,3') == 3.0
call cursor(3,11)
Expect tablemode#spreadsheet#AverageNE('1:3') == 4.5
Expect tablemode#spreadsheet#AverageNE('3,1:3,3') == 5.0
end
end end
end end
@@ -101,8 +183,62 @@ describe 'spreadsheet'
call tablemode#spreadsheet#DeleteColumn() call tablemode#spreadsheet#DeleteColumn()
Expect tablemode#spreadsheet#ColumnCount('.') == 1 Expect tablemode#spreadsheet#ColumnCount('.') == 1
end end
it 'should successfully insert a column before the cursor'
Expect tablemode#spreadsheet#ColumnCount('.') == 2
call tablemode#spreadsheet#InsertColumn(0)
Expect tablemode#spreadsheet#ColumnCount('.') == 3
Expect getline('.') == '| | test11 | test12 |'
end
it 'should successfully insert a column after the cursor'
normal! $
Expect tablemode#spreadsheet#ColumnCount('.') == 2
call tablemode#spreadsheet#InsertColumn(1)
Expect tablemode#spreadsheet#ColumnCount('.') == 3
Expect getline('.') == '| test11 | test12 | |'
end
end end
describe 'Manipulation of tables with headers'
before
new
normal! ggdG
let g:table_mode_header_fillchar = '='
read t/fixtures/complex_header.txt
call cursor(4, 7)
end
it 'should successfully delete a row '
Expect tablemode#spreadsheet#RowCount('.') == 5
call tablemode#spreadsheet#DeleteRow()
Expect tablemode#spreadsheet#RowCount('.') == 4
Expect getline(4) == '| 2 | 8 | b | y |'
end
it 'should successfully delete a column'
Expect tablemode#spreadsheet#ColumnCount('.') == 4
call tablemode#spreadsheet#DeleteColumn()
Expect tablemode#spreadsheet#ColumnCount('.') == 3
Expect getline(4) == '| 9 | a | z |'
end
it 'should successfully insert a column before the cursor'
Expect tablemode#spreadsheet#ColumnCount('.') == 4
call tablemode#spreadsheet#InsertColumn(0)
Expect tablemode#spreadsheet#ColumnCount('.') == 5
Expect getline(4) == '| | 1 | 9 | a | z |'
end
it 'should successfully insert a column after the cursor'
normal! $
Expect tablemode#spreadsheet#ColumnCount('.') == 4
call tablemode#spreadsheet#InsertColumn(1)
Expect tablemode#spreadsheet#ColumnCount('.') == 5
Expect getline(4) == '| 1 | 9 | a | z | |'
end
end
describe 'Repeated Manipulations' describe 'Repeated Manipulations'
before before
new new
@@ -122,5 +258,84 @@ describe 'spreadsheet'
.,.+1 call tablemode#spreadsheet#DeleteColumn() .,.+1 call tablemode#spreadsheet#DeleteColumn()
Expect tablemode#spreadsheet#ColumnCount('.') == 2 Expect tablemode#spreadsheet#ColumnCount('.') == 2
end end
it 'should insert multiple columns before the cursor correctly'
call cursor(2, 7)
Expect tablemode#spreadsheet#ColumnCount('.') == 4
execute "normal! 2:\<C-u>call tablemode#spreadsheet#InsertColumn(0)\<CR>"
Expect tablemode#spreadsheet#ColumnCount('.') == 6
Expect getline('.') == '| 1 | | | 9 | a | z |'
end
it 'should insert multiple columns after the cursor correctly'
call cursor(2, 7)
Expect tablemode#spreadsheet#ColumnCount('.') == 4
execute "normal! 2:\<C-u>call tablemode#spreadsheet#InsertColumn(1)\<CR>"
Expect tablemode#spreadsheet#ColumnCount('.') == 6
Expect getline('.') == '| 1 | 9 | | | a | z |'
end
end
describe 'Unicode table separators'
before
new
normal! ggdG
read t/fixtures/table/sample_realign_unicode_after.txt
call cursor(2, 19)
end
it 'should not prevent the deletion of rows'
Expect tablemode#spreadsheet#RowCount('.') == 4
call tablemode#spreadsheet#DeleteRow()
Expect tablemode#spreadsheet#RowCount('.') == 3
end
it 'should not prevent the deletion of columns'
Expect tablemode#spreadsheet#ColumnCount('.') == 3
call tablemode#spreadsheet#DeleteColumn()
Expect tablemode#spreadsheet#ColumnCount('.') == 2
end
it 'should not prevent the insertion of columns before the cursor'
Expect tablemode#spreadsheet#ColumnCount('.') == 3
call tablemode#spreadsheet#InsertColumn(1)
Expect tablemode#spreadsheet#ColumnCount('.') == 4
end
it 'should not prevent the insertion of columns after the cursor'
Expect tablemode#spreadsheet#ColumnCount('.') == 3
call tablemode#spreadsheet#InsertColumn(1)
Expect tablemode#spreadsheet#ColumnCount('.') == 4
end
end
describe 'Escaped table separators'
before
new
normal! ggdG
read t/fixtures/escaped_seperator.txt
call cursor(2, 3)
end
it 'should not prevent the deletion of rows'
Expect tablemode#spreadsheet#RowCount('.') == 7
call tablemode#spreadsheet#DeleteRow()
Expect tablemode#spreadsheet#RowCount('.') == 6
Expect getline('.') == '| a separator. | |'
end
it 'should not prevent the deletion of columns'
Expect tablemode#spreadsheet#ColumnCount('.') == 2
call tablemode#spreadsheet#DeleteColumn()
Expect tablemode#spreadsheet#ColumnCount('.') == 1
Expect getline('.') == '| It can be escaped by a \. |'
end
it 'should not prevent the insertion of columns'
Expect tablemode#spreadsheet#ColumnCount('.') == 2
call tablemode#spreadsheet#InsertColumn(1)
Expect tablemode#spreadsheet#ColumnCount('.') == 3
Expect getline('.') == '| The \| works as | | It can be escaped by a \. |'
end
end end
end end