Compare commits

..

1 Commits

Author SHA1 Message Date
Dhruva Sagar
2e909c0668 Releasing Table Mode v3.1
* Removed table border and related options. You can now optionally have
  a header instead, simply add a table header and add a border to it
  triggered by the vim iabbrev '+-' on the line immidiately after the
  header and it will expand to the correct border. It will auto update
  as the table realigns with changes. Similar approach as followed by
  tables in org-mode.
* Fixed bug of incorrect indentation of a newly added formula line.
* Fixed bug in ConvertDelimiterToSeparator causing incorrect
  tableization of commented blocks of delimited content.
2013-09-19 02:06:22 +05:30
48 changed files with 1108 additions and 2258 deletions

1
.gitignore vendored
View File

@@ -1,2 +1 @@
tags tags
.vim-flavor/

View File

@@ -1,4 +0,0 @@
language: ruby
rvm:
- 2.2.0
script: rake ci

View File

@@ -1,94 +1,4 @@
# Change Log # Change Log
## Version 4.6.4.1
* Added a fix for markdown commentstring
## Version 4.6.4
* Added support for center aligning columns
## Version 4.6.3
* Fixed tablemode#spreadsheet#LineNr()
* Fixed tablemode#spreadsheet#cell#SetCell()
## Version 4.6.2
* Added custom User autocmd event for tablemode activation (enabled /
disabled)
* Adding better header support for pandoc, headers can now have a different
fillchar configured with `g:table_mode_header_fillchar`
## Version 4.6.1
* Minor bug fixes
## Version 4.6.0
* Added better table header support. The first line of the table if separated
by a table border will be considered as the header. This also means that it
will not be considered / included when evaluating table formulas and that
the first line after the header would be considered the first line of the
table.
## Version 4.5.0
* Refactored toggled mappings
* Table Syntax now gets toggled with Table Mode
## Version 4.4.2
* Updated mappings to be buffer local.
* Updated mappings to toggle and function only when table mode is active.
## Version 4.4.1
* Added syntax for matching tables
## Version 4.4.0
* Minor bug fixes
* Added feature to allow using negative indices within formulas to access rows,
columns relative to the last, -1 being the last.
## Version 4.3.0
* Refactored some more
* Fixed issue #19, hiphens in the table broke alignment
* Added feature #26, you can now define column alignments in the table header
## Version 4.2.0
* Refactored cells logic out to autoload/tablemode/spreadsheet/cell.vim
* Refactored formula logic out to autoload/tablemode/spreadsheet/formula.vim
## Version 4.1.0
* Fixed bad references within plugin
* Added fixtures
## Version 4.0.0
* Major refactoring of the codebase.
* Improved modular tests.
* Fixed long standing unicode character alignment issue.
* Moved to providing \<Plug\> mappings rather than configuration based mappings
which can be more easily overriden by end user.
## Version 3.3.2
* Added new mapping \t? to echo a cells representation for use while defining
formulas.
## Version 3.3.1
* Improved logic to ignore table borders (add as many as you'd like), the
first row is not treated special, it is row # 1. Keep that in mind while
defining Formulas
* Improved test coverage
## Version 3.3
* Dropped +- mapping to create table border instead now using ||
* You can now have a top table border (before header) as well as a bottom
table border.
## Version 3.2
* Added tests to test various use cases using <a
href='https://github.com/kana/vim-vspec'>Vspec</a>..
* Added travis integration for automated tests.
## Version 3.1
* Removed borders. You can now optionally create a table header by simply
adding a header border immidiately after the header line by using the
iabbrev trigger '+-'. Just type that on the line immidiately after the
header and press space / \<CR\> to complete the header border.
* Some Bug Fixes
## Version 3.0 ## Version 3.0
* Removed dependence on Tabular and added code borrowed from Tabular for * Removed dependence on Tabular and added code borrowed from Tabular for
aligning the table rows. aligning the table rows.
@@ -141,7 +51,3 @@
## Version 1.0 : ## Version 1.0 :
* First stable release, create tables as you type. * First stable release, create tables as you type.
<!--
vim: ft=markdown
-->

View File

@@ -1,5 +0,0 @@
source 'https://rubygems.org'
ruby '2.2.0'
gem 'rake'
gem 'vim-flavor', '~> 1.1'

View File

@@ -1,18 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
blankslate (2.1.2.4)
parslet (1.5.0)
blankslate (~> 2.0)
rake (10.1.0)
thor (0.18.1)
vim-flavor (1.1.3)
parslet (~> 1.0)
thor (~> 0.14)
PLATFORMS
ruby
DEPENDENCIES
rake
vim-flavor (~> 1.1)

178
README.md
View File

@@ -1,164 +1,117 @@
# VIM Table Mode v4.6.4.1 [![Build Status](https://travis-ci.org/dhruvasagar/vim-table-mode.png?branch=master)](https://travis-ci.org/dhruvasagar/vim-table-mode) # 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.
## Getting Started ## Change Log
See <a
href="https://github.com/dhruvasagar/vim-table-mode/blob/master/CHANGELOG.md">
CHANGELOG.md </a>
## Getting Started
### Installation ### Installation
There are several ways to do this There are 2 ways to do this
1. I recommend installing <a 1. I recommend installing <a
href="https://github.com/Shougo/neobundle.vim">NeoBundle</a> and then just href="https://github.com/tpope/vim-pathogen">pathogen.vim</a> and then
add `NeoBundle 'dhruvasagar/vim-table-mode'` to your ~/.vimrc adding a git submodule for your plugin:
2. If you are using <a
href="https://github.com/tpope/vim-pathogen">pathogen.vim</a>, then
add a git submodule for your plugin:
```sh ```sh
$ cd ~/.vim $ cd ~/.vim
$ git submodule add git@github.com:dhruvasagar/vim-table-mode.git bundle/table-mode $ git submodule add git@github.com:dhruvasagar/vim-table-mode.git bundle/table-mode
``` ```
3. Copy all files under autoload/, plugin/, doc/ to respective 2. Copy autoload/todomode.vim, plugin/todo-mode.vim, doc/todo-mode.txt to
~/.vim/autoload/, ~/.vim/plugin and ~/.vim/doc under UNIX or respective ~/.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
### Creating table on-the-fly ### Usage
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>). - **On the fly table creation** :
Enter the first line, delimiting columns by the `|` symbol. The plugin reacts by inserting spaces between the text and the separator if you omit them: By default the table column separator is `|` defined by the
`g:table_mode_separator` option. As soon as you type it on a new line (ignores
indentation) the script gets to work on creating a table around it. As you
type and define more columns, the table is completed, formatted and aligned
automatically on the fly.
| name | address | phone | Since this could lead to unwanted behavior I have disabled table mode by
default. You have to use `:TableModeToggle` command or the table mode
toggle mapping, which is `<Leader>tm` defined by `g:table_mode_toggle_map`
option to toggle the table mode or you can directly use `:TableModeEnable`
and `:TableModeDisable` to enable or disable the table mode. This is on a
per buffer basis and so it does not cause any unusual behavior unless it is
enabled explicitly. Please read `:h table-mode` for further information.
In the second line (without leaving Insert mode), enter `|` twice. The plugin will write a properly formatted horizontal line: - **Format existing content into a table** :
| name | address | phone |
|------+---------+-------|
When you enter the subsequent lines, the plugin will automatically adjust the formatting to match the text youre entering every time you press `|`:
| name | address | phone |
|------------+---------+-------|
| John Adams |
Go on until the table is ready:
| name | address | phone |
|-----------------+--------------------------+------------|
| John Adams | 1600 Pennsylvania Avenue | 0123456789 |
|-----------------+--------------------------+------------|
| Sherlock Holmes | 221B Baker Street | 0987654321 |
|-----------------+--------------------------+------------|
Then you can return to the first line and above it enter `||`:
|-----------------+--------------------------+------------|
| name | address | phone |
|-----------------+--------------------------+------------|
| John Adams | 1600 Pennsylvania Avenue | 0123456789 |
|-----------------+--------------------------+------------|
| Sherlock Holmes | 221B Baker Street | 0987654321 |
|-----------------+--------------------------+------------|
Corner separators are adjustable:
For Markdown-compatible tables use
let g:table_mode_corner="|"
|-----------------|--------------------------|------------|
| name | address | phone |
|-----------------|--------------------------|------------|
| John Adams | 1600 Pennsylvania Avenue | 0123456789 |
|-----------------|--------------------------|------------|
| Sherlock Holmes | 221B Baker Street | 0987654321 |
|-----------------|--------------------------|------------|
To get ReST-compatible tables use
let g:table_mode_corner_corner="+"
let g:table_mode_header_fillchar="="
+-----------------+--------------------------+------------+
| name | address | phone |
+=================+==========================+============+
| John Adams | 1600 Pennsylvania Avenue | 0123456789 |
+-----------------+--------------------------+------------+
| Sherlock Holmes | 221B Baker Street | 0987654321 |
+-----------------+--------------------------+------------+
You can also define in a table header border how it's content should be
aligned, whether center, right or left by using a `:` character defined by
`g:table_mode_align_char` option.
### 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 it's 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
on the fly as you type, formatting existing content into a table is equally on the fly as you type, 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 or alternatively use the mapping `<Leader>tt` defined by the
`g:table_mode_tableize_map` option which would convert CSV (Comma Separated `g:table_mode_tableize_map` option which would convert CSV (Comma Separated
Value) data into a table and use `,` defined by `g:table_mode_delimiter` Value) data into a table and use `,` defined by `g:table_mode_delimiter`
option as the delimiter. 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 use tabular (eg.
`:Tableize/;` uses ';' as the delimiter) or use the mapping <kbd>\<Leader\>T</kbd> `:Tableize/;` uses ';' as the delimiter) or use the mapping `<Leader>T`
defined by `g:table_mode_tableize_op_map` option which takes input in the defined by `g:table_mode_tableize_op_map` option 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 and so you can also call it by giving
lines manually like `:line1,line2Tableize`, but this is not very intuitive. lines manually like `:line1,line2Tableize`, but this is not very intuitive.
You can use the mapping <kbd>\<Leader\>T</kbd> with a `[count]` to apply it to the You can use the mapping `<Leader>T` with a `[count]` to apply it to the
next `[count]` lines in standard vim style. next `[count]` lines in standard vim style.
### Moving around - **Move between cells** :
Now you can move between cells using table mode motions <kbd>[|</kbd>, Now you can move between cells using table mode motions `<Leader>t[hjkl]`
<kbd>]|</kbd>, <kbd>{|</kbd> & <kbd>}|</kbd> to move left | right | up | to move left | down | up | right cells respectively. You can use
down cells respectively. The left | right motions wrap around the table `g:table_mode_map_prefix` option to define the prefix mapping to be used
and move to the next | previous row after the last | first cell in the before 'hjkl'. The left | right motions wrap around the table and move to
current row if one exists. the next | previous row after the last | first cell in the current row if
one exists.
### Manipulating Table - **Manipulating Table** :
- **Cell Text Object** : - **Cell Text Object** :
Tableize provides a text object for manipulating table cells. Following Tableize provides a text object for manipulating table cells. By default
the vim philosophy the you have <kbd>i|</kbd> & <kbd>a|</kbd> for the it's `tc`, but that can be changed if you wish to by setting the
inner and around (including the immidiate right table separator) the `g:table_mode_cell_text_object` option.
table cell.
This is intelligent in the sense that if you use it to delete the
contents it will delete everything till the `g:table_mode_separator` so
that the cell is removed and you can enter new stuff if you wish to (had
you used 'c' operator), having to input the `g:table_mode_separator`
again to form the cell & realign it (since it can't be done from the
text object itself). However if you were to 'y' or yank the text, it
would copy the right text, i.e. the contents of the cell and nothing
else.
- **Delete Row** : - **Delete Row** :
You can use the <kbd>\<Leader\>tdd</kbd> mapping defined by the option You can use the `<Leader>tdd` 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 just like you would with 'dd'.
- **Delete Column** : - **Delete Column** :
You can use the <kbd>\<Leader\>tdc</kbd> mapping defined by the option You can use the `<Leader>tdc` 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.
## Advanced Usage: Spreadsheet Capabilities - **Table Formulas** :
### Table Formulas
Table Mode now has support for formulas like a spreadsheet. There are 2 ways Table Mode now has support for formulas like a spreadsheet. There are 2 ways
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 `<Leader>tfa`
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
@@ -172,12 +125,10 @@ To get ReST-compatible tables use
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 `<Leader>tfe` 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> - **Formula Expressions** :
### Formula Expressions
Expressions are of the format `$target = formula`. Expressions are of the format `$target = formula`.
@@ -185,13 +136,11 @@ To get ReST-compatible tables use
- `$n`: This matches the table column number `n`. So the `formula` would - `$n`: This matches the table column number `n`. So the `formula` would
be evaluated for each cell in that column and the result would be placed be evaluated for each cell in that column and the result would be placed
in it. You can use negative indice to represent column relative to the in it.
last, -1 being the last.
- `$n,m`: This matches the table cell n,m (row, column). So in this case - `$n,m`: This matches the table cell n,m (row, column). So in this case
the formula would be evaluated and the result will be placed in this the formula would be evaluated and the result will be placed in this
cell. You can also use negative values to refer to cells relative to cell.
the size, -1 being the last (row or column).
- 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. You which are also defined by the same format as that of the target cell. You
@@ -199,7 +148,7 @@ To get ReST-compatible tables use
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
current row (of the target cell). current row (of the target cell).
@@ -218,15 +167,10 @@ To get ReST-compatible tables use
- `$5,3 = Sum(1,2:5,2)/$5,1` - `$5,3 = Sum(1,2:5,2)/$5,1`
- `$5,3 = Average(1,2:5,2)/$5,1` - `$5,3 = Average(1,2:5,2)/$5,1`
## Demo ### Demo
<a href="http://www.youtube.com/watch?v=9lVQ0VJY3ps"><img <a href="http://www.youtube.com/watch?v=sK2IH1hiDkw"><img
src="https://raw.github.com/axil/vim-table-mode/master/youtube.png"/></a> src="https://raw.github.com/dhruvasagar/vim-table-mode/master/youtube.png"/></a>
## Change Log
See <a
href="https://github.com/dhruvasagar/vim-table-mode/blob/master/CHANGELOG.md">
CHANGELOG.md </a>
## Contributing ## Contributing

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env rake
task :ci => [:dump, :test]
task :dump do
sh 'vim --version'
end
task :test do
sh 'bundle exec vim-flavor test'
end
task :default => :test

View File

@@ -1 +0,0 @@
kana/vim-vspec (1.1.2)

File diff suppressed because it is too large Load Diff

View File

@@ -1,134 +0,0 @@
" Borrowed from Tabular
" Private Functions {{{1
" function! s:StripTrailingSpaces(string) - Remove all trailing spaces {{{2
" from a string.
function! s:StripTrailingSpaces(string)
return matchstr(a:string, '^.\{-}\ze\s*$')
endfunction
function! s:Padding(string, length, where) "{{{3
let gap_length = a:length - tablemode#utils#StrDisplayWidth(a:string)
if a:where =~# 'l'
return a:string . repeat(" ", gap_length)
elseif a:where =~# 'r'
return repeat(" ", gap_length) . a:string
elseif a:where =~# 'c'
let right = gap_length / 2
let left = right + (right * 2 != gap_length)
return repeat(" ", left) . a:string . repeat(" ", right)
endif
endfunction
" Public Functions {{{1
" function! tablemode#align#Split() - Split a string into fields and delimiters {{{2
" Like split(), but include the delimiters as elements
" All odd numbered elements are delimiters
" All even numbered elements are non-delimiters (including zero)
function! tablemode#align#Split(string, delim)
let rv = []
let beg = 0
let len = len(a:string)
let searchoff = 0
while 1
let mid = match(a:string, a:delim, beg + searchoff, 1)
if mid == -1 || mid == len
break
endif
let matchstr = matchstr(a:string, a:delim, beg + searchoff, 1)
let length = strlen(matchstr)
if length == 0 && beg == mid
" Zero-length match for a zero-length delimiter - advance past it
let searchoff += 1
continue
endif
if beg == mid
let rv += [ "" ]
else
let rv += [ a:string[beg : mid-1] ]
endif
let rv += [ matchstr ]
let beg = mid + length
let searchoff = 0
endwhile
let rv += [ strpart(a:string, beg) ]
return rv
endfunction
function! tablemode#align#alignments(lnum, ncols) "{{{2
let achr = g:table_mode_align_char
let alignments = []
if tablemode#table#IsBorder(a:lnum+1)
let hcols = tablemode#align#Split(getline(a:lnum+1), '[' . g:table_mode_corner . g:table_mode_corner_corner . ']')
for idx in range(len(hcols))
" Right align if header
call add(alignments, 'l')
if hcols[idx] =~# achr . '[^'.achr.']\+' . achr
let alignments[idx] = 'c'
elseif hcols[idx] =~# achr . '$'
let alignments[idx] = 'r'
endif
" if hcols[idx] !~# '[^0-9\.]' | let alignments[idx] = 'r' | endif
endfor
end
return alignments
endfunction
function! tablemode#align#Align(lines) "{{{2
if empty(a:lines) | return [] | endif
let lines = map(a:lines, 'map(v:val, "v:key =~# \"text\" ? tablemode#align#Split(v:val, g:table_mode_separator) : v:val")')
for line in lines
let stext = line.text
if len(stext) <= 1 | continue | endif
if stext[0] !~ tablemode#table#StartExpr()
let stext[0] = s:StripTrailingSpaces(stext[0])
endif
if len(stext) >= 2
for i in range(1, len(stext)-1)
let stext[i] = tablemode#utils#strip(stext[i])
endfor
endif
endfor
let maxes = []
for line in lines
let stext = line.text
if len(stext) <= 1 | continue | endif
for i in range(len(stext))
if i == len(maxes)
let maxes += [ tablemode#utils#StrDisplayWidth(stext[i]) ]
else
let maxes[i] = max([ maxes[i], tablemode#utils#StrDisplayWidth(stext[i]) ])
endif
endfor
endfor
let alignments = tablemode#align#alignments(lines[0].lnum, len(lines[0].text))
for idx in range(len(lines))
let tlnum = lines[idx].lnum
let tline = lines[idx].text
if len(tline) <= 1 | continue | endif
for jdx in range(len(tline))
" Dealing with the header being the first line
if jdx >= len(alignments) | call add(alignments, 'l') | endif
let field = s:Padding(tline[jdx], maxes[jdx], alignments[jdx])
let tline[jdx] = field . (jdx == 0 || jdx == len(tline) ? '' : ' ')
endfor
let lines[idx].text = s:StripTrailingSpaces(join(tline, ''))
endfor
return lines
endfunction

View File

@@ -1,5 +0,0 @@
function! tablemode#logger#log(message)
if g:table_mode_verbose
echom message
endif
endfunction

View File

@@ -1,189 +0,0 @@
" Private Functions {{{1
function! s:Sum(list) "{{{2
let result = 0.0
for item in a:list
if type(item) == type(1) || type(item) == type(1.0)
let result += item
elseif type(item) == type('')
let result += str2float(item)
elseif type(item) == type([])
let result += s:Sum(item)
endif
endfor
return result
endfunction
function! s:Average(list) "{{{2
return s:Sum(a:list)/len(a:list)
endfunction
" Public Functions {{{1
function! tablemode#spreadsheet#GetFirstRow(line) "{{{2
if tablemode#table#IsRow(a:line)
let line = tablemode#utils#line(a:line)
while !tablemode#table#IsHeader(line - 1) && (tablemode#table#IsRow(line - 1) || tablemode#table#IsBorder(line - 1))
let line -= 1
endwhile
if tablemode#table#IsBorder(line) | let line += 1 | endif
return line
endif
endfunction
function! tablemode#spreadsheet#MoveToFirstRow() "{{{2
if tablemode#table#IsRow('.')
call cursor(tablemode#spreadsheet#GetFirstRow('.'), col('.'))
endif
endfunction
function! tablemode#spreadsheet#GetLastRow(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#MoveToLastRow() "{{{2
if tablemode#table#IsRow('.')
call cursor(tablemode#spreadsheet#GetLastRow('.'), col('.'))
endif
endfunction
function! tablemode#spreadsheet#LineNr(line, row) "{{{2
if tablemode#table#IsRow(a:line)
let line = tablemode#spreadsheet#GetFirstRow(a:line)
let row_nr = 0
while tablemode#table#IsTable(line + 1)
if tablemode#table#IsRow(line)
let row_nr += 1
if a:row ==# row_nr | break | endif
endif
let line += 1
endwhile
return line
endif
endfunction
function! tablemode#spreadsheet#RowNr(line) "{{{2
let line = tablemode#utils#line(a:line)
let rowNr = 0
while !tablemode#table#IsHeader(line) && tablemode#table#IsTable(line)
if tablemode#table#IsRow(line) | let rowNr += 1 | endif
let line -= 1
endwhile
return rowNr
endfunction
function! tablemode#spreadsheet#RowCount(line) "{{{2
let line = tablemode#utils#line(a:line)
let [tline, totalRowCount] = [line, 0]
while !tablemode#table#IsHeader(tline) && tablemode#table#IsTable(tline)
if tablemode#table#IsRow(tline) | let totalRowCount += 1 | endif
let tline -= 1
endwhile
let tline = line + 1
while !tablemode#table#IsHeader(tline) && tablemode#table#IsTable(tline)
if tablemode#table#IsRow(tline) | let totalRowCount += 1 | endif
let tline += 1
endwhile
return totalRowCount
endfunction
function! tablemode#spreadsheet#ColumnNr(pos) "{{{2
let pos = []
if type(a:pos) == type('')
let pos = [line(a:pos), col(a:pos)]
elseif type(a:pos) == type([])
let pos = a:pos
else
return 0
endif
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'))
endfunction
function! tablemode#spreadsheet#ColumnCount(line) "{{{2
let line = tablemode#utils#line(a:line)
return tablemode#utils#strlen(substitute(getline(line), '[^' . g:table_mode_separator . ']', '', 'g'))-1
endfunction
function! tablemode#spreadsheet#IsFirstCell() "{{{2
return tablemode#spreadsheet#ColumnNr('.') ==# 1
endfunction
function! tablemode#spreadsheet#IsLastCell() "{{{2
return tablemode#spreadsheet#ColumnNr('.') ==# tablemode#spreadsheet#ColumnCount('.')
endfunction
function! tablemode#spreadsheet#MoveToStartOfCell() "{{{2
if getline('.')[col('.')-1] ==# g:table_mode_separator && !tablemode#spreadsheet#IsLastCell()
normal! 2l
else
execute 'normal! F' . g:table_mode_separator . '2l'
endif
endfunction
function! tablemode#spreadsheet#DeleteColumn() "{{{2
if tablemode#table#IsRow('.')
for i in range(v:count1)
call tablemode#spreadsheet#MoveToStartOfCell()
call tablemode#spreadsheet#MoveToFirstRow()
silent! execute "normal! h\<C-V>f" . g:table_mode_separator
call tablemode#spreadsheet#MoveToLastRow()
normal! d
endfor
call tablemode#table#Realign('.')
endif
endfunction
function! tablemode#spreadsheet#DeleteRow() "{{{2
if tablemode#table#IsRow('.')
for i in range(v:count1)
if tablemode#table#IsRow('.')
normal! dd
endif
if !tablemode#table#IsRow('.')
normal! k
endif
endfor
call tablemode#table#Realign('.')
endif
endfunction
function! tablemode#spreadsheet#Sum(range, ...) abort "{{{2
let args = copy(a:000)
call insert(args, a:range)
return s:Sum(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction
function! tablemode#spreadsheet#Average(range, ...) abort "{{{2
let args = copy(a:000)
call insert(args, a:range)
return s:Average(call('tablemode#spreadsheet#cell#GetCellRange', args))
endfunction
function! tablemode#spreadsheet#Sort(bang, ...) "{{{2
let opts = a:0 ? a:1 : ''
let bang = a:bang ? '!' : ''
let [firstRow, lastRow] = [tablemode#spreadsheet#GetFirstRow('.'), tablemode#spreadsheet#GetLastRow('.')]
call tablemode#spreadsheet#MoveToStartOfCell()
exec ':'.firstRow.','.lastRow . 'sort'.bang opts '/.*\%'.col('.').'v/'
endfunction

View File

@@ -1,258 +0,0 @@
" Private Functions {{{1
" function! s:ParseRange(range, ...) {{{2
" range: A string representing range of cells.
" - Can be row1:row2 for values in the current columns in those rows.
" - Can be row1,col1:row2,col2 for range between row1,col1 till
" row2,col2.
function! s:ParseRange(range, ...)
if a:0 < 1
let default_col = tablemode#spreadsheet#ColumnNr('.')
elseif a:0 < 2
let default_col = a:1
endif
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
let [row1, col1] = rcs1
else
let [row1, col1] = [rcs1[0], default_col]
endif
if len(rcs2) == 2
let [row2, col2] = rcs2
else
let [row2, col2] = [rcs2[0], default_col]
endif
return [row1, col1, row2, col2]
endfunction
" Public Functions {{{1
" function! tablemode#spreadsheet#cell#GetCells() - Function to get values of cells in a table {{{2
" tablemode#spreadsheet#GetCells(row) - Get values of all cells in a row as a List.
" tablemode#spreadsheet#GetCells(0, col) - Get values of all cells in a column as a List.
" tablemode#spreadsheet#GetCells(row, col) - Get the value of table cell by given row, col.
function! tablemode#spreadsheet#cell#GetCells(line, ...) abort
let line = tablemode#utils#line(a:line)
if tablemode#table#IsRow(line)
if a:0 < 1
let [row, colm] = [line, 0]
elseif a:0 < 2
let [row, colm] = [a:1, 0]
elseif a:0 < 3
let [row, colm] = a:000
endif
let first_row = tablemode#spreadsheet#GetFirstRow(line)
let last_row = tablemode#spreadsheet#GetLastRow(line)
if row == 0
let values = []
let line = first_row
while tablemode#table#IsTable(line)
if tablemode#table#IsRow(line)
let row_line = getline(line)[stridx(getline(line), g:table_mode_separator):strridx(getline(line), g:table_mode_separator)]
call add(values, tablemode#utils#strip(get(split(row_line, g:table_mode_separator), colm>0?colm-1:colm, '')))
endif
let line += 1
endwhile
return values
else
let row_nr = 0
let row_diff = row > 0 ? 1 : -1
let line = row > 0 ? first_row : last_row
while tablemode#table#IsTable(line)
if tablemode#table#IsRow(line)
let row_nr += row_diff
if row ==# row_nr | break | endif
endif
let line += row_diff
endwhile
let row_line = getline(line)[stridx(getline(line), g:table_mode_separator):strridx(getline(line), g:table_mode_separator)]
if colm == 0
return map(split(row_line, g:table_mode_separator), 'tablemode#utils#strip(v:val)')
else
let split_line = split(row_line, g:table_mode_separator)
return tablemode#utils#strip(get(split(row_line, g:table_mode_separator), colm>0?colm-1:colm, ''))
endif
endif
endif
endfunction
function! tablemode#spreadsheet#cell#GetCell(...) "{{{2
if a:0 == 0
let [row, colm] = [tablemode#spreadsheet#RowNr('.'), tablemode#spreadsheet#ColumnNr('.')]
elseif a:0 == 2
let [row, colm] = [a:1, a:2]
endif
return tablemode#spreadsheet#cell#GetCells('.', row, colm)
endfunction
function! tablemode#spreadsheet#cell#GetRow(row, ...) abort "{{{2
let line = a:0 ? a:1 : '.'
return tablemode#spreadsheet#cell#GetCells(line, a:row)
endfunction
function! tablemode#spreadsheet#cell#GetRowColumn(col, ...) abort "{{{2
let line = a:0 ? a:1 : '.'
let row = tablemode#spreadsheet#RowNr('.')
return tablemode#spreadsheet#cell#GetCells(line, row, a:col)
endfunction
function! tablemode#spreadsheet#cell#GetColumn(col, ...) abort "{{{2
let line = a:0 ? a:1 : '.'
return tablemode#spreadsheet#cell#GetCells(line, 0, a:col)
endfunction
function! tablemode#spreadsheet#cell#GetColumnRow(row, ...) abort "{{{2
let line = a:0 ? a:1 : '.'
let col = tablemode#spreadsheet#ColumnNr('.')
return tablemode#spreadsheet#cell#GetCells(line, a:row, col)
endfunction
function! tablemode#spreadsheet#cell#GetCellRange(range, ...) abort "{{{2
if a:0 < 1
let [line, colm] = ['.', tablemode#spreadsheet#ColumnNr('.')]
elseif a:0 < 2
let [line, colm] = [a:1, tablemode#spreadsheet#ColumnNr('.')]
elseif a:0 < 3
let [line, colm] = [a:1, a:2]
else
call tablemode#utils#throw('Invalid Range')
endif
let values = []
if tablemode#table#IsRow(line)
let [row1, col1, row2, col2] = s:ParseRange(a:range, colm)
if row1 == row2
if col1 == col2
call add(values, tablemode#spreadsheet#cell#GetCells(line, row1, col1))
else
let values = tablemode#spreadsheet#cell#GetRow(row1, line)[(col1-1):(col2-1)]
endif
else
if col1 == col2
let values = tablemode#spreadsheet#cell#GetColumn(col1, line)[(row1-1):(row2-1)]
else
let tcol = col1
while tcol <= col2
call add(values, tablemode#spreadsheet#cell#GetColumn(tcol, line)[(row1-1):(row2-1)])
let tcol += 1
endwhile
endif
endif
endif
return values
endfunction
function! tablemode#spreadsheet#cell#SetCell(val, ...) "{{{2
if a:0 == 0
let [line, row, colm] = ['.', tablemode#spreadsheet#RowNr('.'), tablemode#spreadsheet#ColumnNr('.')]
elseif a:0 == 2
let [line, row, colm] = ['.', a:1, a:2]
elseif a:0 == 3
let [line, row, colm] = a:000
endif
" Account for negative values to reference from relatively from the last
if row < 0 | let row = tablemode#spreadsheet#RowCount(line) + row + 1 | endif
if colm < 0 | let colm = tablemode#spreadsheet#ColumnCount(line) + colm + 1 | endif
if tablemode#table#IsRow(line)
let line = tablemode#spreadsheet#LineNr(line, row)
let line_val = getline(line)
let cstartexpr = tablemode#table#StartCommentExpr()
let values = split(getline(line)[stridx(line_val, g:table_mode_separator):strridx(line_val, g:table_mode_separator)], g:table_mode_separator)
if len(values) < colm | return | endif
let values[colm-1] = a:val
let line_value = g:table_mode_separator . join(values, g:table_mode_separator) . g:table_mode_separator
if tablemode#utils#strlen(cstartexpr) > 0 && line_val =~# cstartexpr
let sce = matchstr(line_val, tablemode#table#StartCommentExpr())
let ece = matchstr(line_val, tablemode#table#EndCommentExpr())
let line_value = sce . line_value . ece
endif
call setline(line, line_value)
call tablemode#table#Realign(line)
endif
endfunction
function! tablemode#spreadsheet#cell#TextObject(inner) "{{{2
if tablemode#table#IsRow('.')
call tablemode#spreadsheet#MoveToStartOfCell()
if a:inner
normal! v
call search('[^' . g:table_mode_separator . ']\ze\s*' . g:table_mode_separator)
else
execute 'normal! vf' . g:table_mode_separator . 'l'
endif
endif
endfunction
function! tablemode#spreadsheet#cell#Motion(direction, ...) "{{{2
let l:count = a:0 ? a:1 : v:count1
if tablemode#table#IsRow('.')
for ii in range(l:count)
if a:direction ==# 'l'
if tablemode#spreadsheet#IsLastCell()
if !tablemode#table#IsRow(line('.') + 1) && (tablemode#table#IsBorder(line('.') + 1) && !tablemode#table#IsRow(line('.') + 2))
return
endif
call tablemode#spreadsheet#cell#Motion('j', 1)
normal! 0
endif
" If line starts with g:table_mode_separator
if getline('.')[col('.')-1] ==# g:table_mode_separator
normal! 2l
else
execute 'normal! f' . g:table_mode_separator . '2l'
endif
elseif a:direction ==# 'h'
if tablemode#spreadsheet#IsFirstCell()
if !tablemode#table#IsRow(line('.') - 1) && (tablemode#table#IsBorder(line('.') - 1) && !tablemode#table#IsRow(line('.') - 2))
return
endif
call tablemode#spreadsheet#cell#Motion('k', 1)
normal! $
endif
" If line ends with g:table_mode_separator
if getline('.')[col('.')-1] ==# g:table_mode_separator
execute 'normal! F' . g:table_mode_separator . '2l'
else
execute 'normal! 2F' . g:table_mode_separator . '2l'
endif
elseif a:direction ==# 'j'
if tablemode#table#IsRow(line('.') + 1)
" execute 'normal! ' . 1 . 'j'
normal! j
elseif tablemode#table#IsBorder(line('.') + 1) && tablemode#table#IsRow(line('.') + 2)
" execute 'normal! ' . 2 . 'j'
normal! 2j
endif
elseif a:direction ==# 'k'
if tablemode#table#IsRow(line('.') - 1)
" execute 'normal! ' . 1 . 'k'
normal! k
elseif tablemode#table#IsBorder(line('.') - 1) && tablemode#table#IsRow(line('.') - 2)
" execute 'normal! ' . (1 + 1) . 'k'
normal! 2k
endif
endif
endfor
endif
endfunction
" vim: sw=2 sts=2 fdl=0 fdm=marker

View File

@@ -1,122 +0,0 @@
" Private Functions {{{1
" Public Functions {{{1
function! tablemode#spreadsheet#formula#Add(...) "{{{2
let fr = a:0 ? a:1 : input('f=')
let row = tablemode#spreadsheet#RowNr('.')
let colm = tablemode#spreadsheet#ColumnNr('.')
let indent = indent('.')
let indent_str = repeat(' ', indent)
if fr !=# ''
let fr = '$' . row . ',' . colm . '=' . fr
let fline = tablemode#spreadsheet#GetLastRow('.') + 1
if tablemode#table#IsBorder(fline) | let fline += 1 | endif
let cursor_pos = [line('.'), col('.')]
if getline(fline) =~# 'tmf: '
" Comment line correctly
let line_val = getline(fline)
let start_pos = match(line_val, tablemode#table#StartCommentExpr())
let end_pos = match(line_val, tablemode#table#EndCommentExpr())
if empty(end_pos) | let end_pos = len(line_val) | endif
let line_expr = strpart(line_val, start_pos, end_pos)
let sce = matchstr(line_val, tablemode#table#StartCommentExpr() . '\zs')
let ece = matchstr(line_val, tablemode#table#EndCommentExpr())
call setline(fline, sce . line_expr . '; ' . fr . ece)
else
let cstring = &commentstring
let [cmss, cmse] = ['', '']
if len(cstring) > 0
let cms = split(cstring, '%s')
if len(cms) == 2
let [cmss, cmse] = cms
else
let [cmss, cmse] = [cms[0], '']
endif
endif
let fr = indent_str . cmss . ' tmf: ' . fr . ' ' . cmse
call append(fline-1, fr)
call cursor(cursor_pos)
endif
call tablemode#spreadsheet#formula#EvaluateFormulaLine()
endif
endfunction
function! tablemode#spreadsheet#formula#EvaluateExpr(expr, line) abort "{{{2
let line = tablemode#utils#line(a:line)
let [target, expr] = map(split(a:expr, '='), 'tablemode#utils#strip(v:val)')
let cell = substitute(target, '\$', '', '')
if cell =~# ','
let [row, colm] = map(split(cell, ','), 'str2nr(v:val)')
else
let [row, colm] = [0, str2nr(cell)]
endif
if expr =~# 'Sum(.*)'
let expr = substitute(expr, 'Sum(\([^)]*\))', 'tablemode#spreadsheet#Sum("\1",'.line.','.colm.')', 'g')
endif
if expr =~# 'Average(.*)'
let expr = substitute(expr, 'Average(\([^)]*\))', 'tablemode#spreadsheet#Average("\1",'.line.','.colm.')', 'g')
endif
if expr =~# '\$\d\+,\d\+'
let expr = substitute(expr, '\$\(\d\+\),\(\d\+\)',
\ '\=str2float(tablemode#spreadsheet#cell#GetCells(line, submatch(1), submatch(2)))', 'g')
endif
if cell =~# ','
if expr =~# '\$'
let expr = substitute(expr, '\$\(\d\+\)',
\ '\=str2float(tablemode#spreadsheet#cell#GetCells(line, row, submatch(1)))', 'g')
endif
call tablemode#spreadsheet#cell#SetCell(eval(expr), line, row, colm)
else
let [row, line] = [1, tablemode#spreadsheet#GetFirstRow(line)]
while tablemode#table#IsRow(line)
let texpr = expr
if expr =~# '\$'
let texpr = substitute(texpr, '\$\(\d\+\)',
\ '\=str2float(tablemode#spreadsheet#cell#GetCells(line, row, submatch(1)))', 'g')
endif
call tablemode#spreadsheet#cell#SetCell(eval(texpr), line, row, colm)
let row += 1
let line += 1
endwhile
endif
endfunction
function! tablemode#spreadsheet#formula#EvaluateFormulaLine() abort "{{{2
let exprs = []
let cstring = &commentstring
let matchexpr = ''
if len(cstring) > 0
let cms = split(cstring, '%s')
if len(cms) == 2
let matchexpr = '^\s*' . escape(cms[0], '/*') . '\s*tmf: \zs.*\ze' . escape(cms[1], '/*') . '\s*$'
else
let matchexpr = '^\s*' . escape(cms[0], '/*') . '\s*tmf: \zs.*$'
endif
else
let matchexpr = '^\s* tmf: \zs.*$'
endif
if tablemode#table#IsRow('.') " We're inside the table
let line = tablemode#spreadsheet#GetLastRow('.')
let fline = line + 1
if tablemode#table#IsBorder(fline) | let fline += 1 | endif
if getline(fline) =~# 'tmf: '
let exprs = split(matchstr(getline(fline), matchexpr), ';')
endif
elseif getline('.') =~# 'tmf: ' " We're on the formula line
let line = line('.') - 1
if tablemode#table#IsBorder(line) | let line -= 1 | endif
if tablemode#table#IsRow(line)
let exprs = split(matchstr(getline('.'), matchexpr), ';')
endif
endif
for expr in exprs
call tablemode#spreadsheet#formula#EvaluateExpr(expr, line)
endfor
endfunction

View File

@@ -1,198 +0,0 @@
" Private Functions {{{1
function! s:BorderExpr() "{{{2
return tablemode#table#StartExpr() .
\ '[' . g:table_mode_corner . g:table_mode_corner_corner . ']' .
\ '[' . escape(g:table_mode_fillchar . g:table_mode_header_fillchar . g:table_mode_corner . g:table_mode_align_char, '-') . ']\+' .
\ '[' . g:table_mode_corner . g:table_mode_corner_corner . ']' .
\ tablemode#table#EndExpr()
endfunction
function! s:DefaultBorder() "{{{2
if tablemode#IsActive()
return g:table_mode_corner_corner . g:table_mode_fillchar . g:table_mode_corner . g:table_mode_fillchar . g:table_mode_corner_corner
else
return ''
endif
endfunction
function! s:GenerateHeaderBorder(line) "{{{2
let line = tablemode#utils#line(a:line)
if tablemode#table#IsRow(line - 1) || tablemode#table#IsRow(line + 1)
let line_val = ''
if tablemode#table#IsRow(line + 1)
let line_val = getline(line + 1)
endif
if tablemode#table#IsRow(line - 1) && tablemode#utils#strlen(line_val) < tablemode#utils#strlen(getline(line - 1))
let line_val = getline(line - 1)
endif
if tablemode#utils#strlen(line_val) <= 1 | return s:DefaultBorder() | endif
let border = substitute(line_val[stridx(line_val, g:table_mode_separator):strridx(line_val, g:table_mode_separator)], g:table_mode_separator, g:table_mode_corner, 'g')
" To accurately deal with unicode double width characters
if tablemode#table#IsHeader(line - 1)
let fill_columns = map(split(border, g:table_mode_corner), 'repeat(g:table_mode_header_fillchar, tablemode#utils#StrDisplayWidth(v:val))')
else
let fill_columns = map(split(border, g:table_mode_corner), 'repeat(g:table_mode_fillchar, tablemode#utils#StrDisplayWidth(v:val))')
endif
let border = g:table_mode_corner . join(fill_columns, g:table_mode_corner) . g:table_mode_corner
let border = substitute(border, '^' . g:table_mode_corner . '\(.*\)' . g:table_mode_corner . '$', g:table_mode_corner_corner . '\1' . g:table_mode_corner_corner, '')
" Incorporate header alignment chars
if getline(line) =~# g:table_mode_align_char
let pat = '[' . g:table_mode_corner_corner . g:table_mode_corner . ']'
let hcols = tablemode#align#Split(getline(line), pat)
let gcols = tablemode#align#Split(border, pat)
for idx in range(len(hcols))
if hcols[idx] =~# g:table_mode_align_char
" center align
if hcols[idx] =~# g:table_mode_align_char . '[^'.g:table_mode_align_char.']\+' . g:table_mode_align_char
let gcols[idx] = g:table_mode_align_char . gcols[idx][1:-2] . g:table_mode_align_char
elseif hcols[idx] =~# g:table_mode_align_char . '$'
let gcols[idx] = gcols[idx][:-2] . g:table_mode_align_char
else
let gcols[idx] = g:table_mode_align_char . gcols[idx][1:]
endif
endif
endfor
let border = join(gcols, '')
endif
let cstartexpr = tablemode#table#StartCommentExpr()
if tablemode#utils#strlen(cstartexpr) > 0 && getline(line) =~# cstartexpr
let sce = matchstr(line_val, tablemode#table#StartCommentExpr())
let ece = matchstr(line_val, tablemode#table#EndCommentExpr())
return sce . border . ece
elseif getline(line) =~# tablemode#table#StartExpr()
let indent = matchstr(line_val, tablemode#table#StartExpr())
return indent . border
else
return border
endif
else
return s:DefaultBorder()
endif
endfunction
" Public Functions {{{1
function! tablemode#table#GetCommentStart() "{{{2
let cstring = &commentstring
if tablemode#utils#strlen(cstring) > 0
return substitute(split(cstring, '%s')[0], '[^()]', '\\\0', 'g')
else
return ''
endif
endfunction
function! tablemode#table#StartCommentExpr() "{{{2
let cstartexpr = tablemode#table#GetCommentStart()
if tablemode#utils#strlen(cstartexpr) > 0
return '^\s*' . cstartexpr . '\s*'
else
return ''
endif
endfunction
function! tablemode#table#GetCommentEnd() "{{{2
let cstring = &commentstring
if tablemode#utils#strlen(cstring) > 0
let cst = split(cstring, '%s')
if len(cst) == 2
return substitute(cst[1], '[^()]', '\\\0', 'g')
else
return ''
endif
else
return ''
endif
endfunction
function! tablemode#table#EndCommentExpr() "{{{2
let cendexpr = tablemode#table#GetCommentEnd()
if tablemode#utils#strlen(cendexpr) > 0
return '.*\zs\s\+' . cendexpr . '\s*$'
else
return ''
endif
endfunction
function! tablemode#table#StartExpr() "{{{2
let cstart = tablemode#table#GetCommentStart()
if tablemode#utils#strlen(cstart) > 0
return '^\s*\(' . cstart . '\)\?\s*'
else
return '^\s*'
endif
endfunction
function! tablemode#table#EndExpr() "{{{2
let cend = tablemode#table#GetCommentEnd()
if tablemode#utils#strlen(cend) > 0
return '\s*\(\s\+' . cend . '\)\?\s*$'
else
return '\s*$'
endif
endfunction
function! tablemode#table#IsBorder(line) "{{{2
return !empty(getline(a:line)) && getline(a:line) =~# s:BorderExpr()
endfunction
function! tablemode#table#IsHeader(line) "{{{2
let line = tablemode#utils#line(a:line)
" if line <= 0 || line > line('$') | return 0 | endif
return tablemode#table#IsRow(line)
\ && !tablemode#table#IsRow(line-1)
\ && !tablemode#table#IsRow(line-2)
\ && !tablemode#table#IsBorder(line-2)
\ && tablemode#table#IsBorder(line+1)
endfunction
function! tablemode#table#IsRow(line) "{{{2
return !tablemode#table#IsBorder(a:line) && getline(a:line) =~# (tablemode#table#StartExpr() . g:table_mode_separator) . '[^' . g:table_mode_separator . ']\+'
endfunction
function! tablemode#table#IsTable(line) "{{{2
return tablemode#table#IsRow(a:line) || tablemode#table#IsBorder(a:line)
endfunction
function! tablemode#table#AddBorder(line) "{{{2
call setline(a:line, s:GenerateHeaderBorder(a:line))
endfunction
function! tablemode#table#Realign(line) "{{{2
let line = tablemode#utils#line(a:line)
let lines = []
let [lnum, blines] = [line, []]
while tablemode#table#IsTable(lnum)
if tablemode#table#IsBorder(lnum)
call insert(blines, lnum)
let lnum -= 1
continue
endif
call insert(lines, {'lnum': lnum, 'text': getline(lnum)})
let lnum -= 1
endwhile
let lnum = line + 1
while tablemode#table#IsTable(lnum)
if tablemode#table#IsBorder(lnum)
call add(blines, lnum)
let lnum += 1
continue
endif
call add(lines, {'lnum': lnum, 'text': getline(lnum)})
let lnum += 1
endwhile
let lines = tablemode#align#Align(lines)
for aline in lines
call setline(aline.lnum, aline.text)
endfor
for bline in blines
call tablemode#table#AddBorder(bline)
endfor
endfunction

View File

@@ -1,49 +0,0 @@
" Private Functions {{{1
" Public Functions {{{1
function! tablemode#utils#throw(string) abort "{{{2
let v:errmsg = 'table-mode: ' . a:string
throw v:errmsg
endfunction
function! tablemode#utils#line(row) "{{{2
if type(a:row) == type('')
return line(a:row)
else
return a:row
endif
endfunction
function! tablemode#utils#strip(string) "{{{2
return matchstr(a:string, '^\s*\zs.\{-}\ze\s*$')
endfunction
" function! tablemode#utils#strlen {{{2
" To count multibyte characters accurately
function! tablemode#utils#strlen(text)
return strlen(substitute(a:text, '.', 'x', 'g'))
endfunction
function! tablemode#utils#StrDisplayWidth(string) "{{{2
if exists('*strdisplaywidth')
return strdisplaywidth(a:string)
else
" Implement the tab handling part of strdisplaywidth for vim 7.2 and
" earlier - not much that can be done about handling doublewidth
" characters.
let rv = 0
let i = 0
for char in split(a:string, '\zs')
if char == "\t"
let rv += &ts - i
let i = 0
else
let rv += 1
let i = (i + 1) % &ts
endif
endfor
return rv
endif
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. v3.1
=============================================================================== ===============================================================================
Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER
VERSION 4.6.4.1 VERSION 3.1
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/>
@@ -20,7 +20,7 @@ CONTENTS *table-mode-contents*
INTRODUCTION *table-mode-introduction* INTRODUCTION *table-mode-introduction*
Table Mode is simple plugin that makes building tables in vim a breeze. It is Table Mode is simple plugin that makes building tables in vim a breeze. It is
inspired from tpope's auto aligning script for creating tables in vim - inspired from tpope's auto aligning script for creating tables in vim -
https://gist.github.com/tpope/287147, which in turn utilizes the Tabular https://gist.github.com/tpope/287147, which in turn utilizes the Tabular
Plugin. Plugin.
@@ -29,16 +29,11 @@ GETTING STARTED *table-mode-getting-started*
Create Table on the fly: Create Table on the fly:
Using Table Mode is dead simple. You simply start typing on a new line Using Table Mode is dead simple. You simply start typing on a new line
with the table separator - |table-mode-separator|, and you just type with the table separator - |g:table-mode-separator|, and you just type
away! The plugin does the rest automatically for you as you type. With away! The plugin does the rest automatically for you as you type. With
each additional separator you add, it aligns the table properly, each additional separator you add, it aligns the table properly,
without having to do anything else. without having to do anything else.
Table Mode now supports gfm style tables and allows to define column
alignments with the aid of placing ':' (configured using
|g:table_mode_align_char|) on the table header border appropriately to
align content left or right.
The table mode is disabled by default and you can enter table mode The table mode is disabled by default and you can enter table mode
using |table-mode-toggle-map| or you can also enable it permanently using |table-mode-toggle-map| or you can also enable it permanently
using |table-mode-always-active| if you wish though not recommended. using |table-mode-always-active| if you wish though not recommended.
@@ -57,7 +52,7 @@ Move between cells :
You can use |table-mode-map-prefix| option to define the prefix You can use |table-mode-map-prefix| option to define the prefix
mapping to be used before 'hjkl'. The left | right motions wrap around mapping to be used before 'hjkl'. The left | right motions wrap around
the table and move to the next | previous row after the last | first the table and move to the next | previous row after the last | first
cell in the current row if one 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.
@@ -86,7 +81,7 @@ Table Formulas:
input formula will be appended to the formula line if one input formula will be appended to the formula line if one
exists or a new one will be created with the input formula exists or a new one will be created with the input formula
taking the current cell as the target cell. The formula line taking the current cell as the target cell. The formula line
is evaluated immediately to reflect the results. is evaluated immidiately to reflect the results.
You can directly also add / manipulate formula expressions in You can directly also add / manipulate formula expressions in
the formula line. The formula line is a commented line right the formula line. The formula line is a commented line right
@@ -104,14 +99,11 @@ Formula Expressions :
'$n': This matches the table column number 'n'. So the formula '$n': This matches the table column number 'n'. So the formula
would be evaluated for each cell in that column and the result would be evaluated for each cell in that column and the result
would be placed in it. You can use negative indice to would be placed in it.
represent column relative to the last, -1 being the last.
'$n,m': This matches the table cell n,m (row, column). So in '$n,m': This matches the table cell n,m (row, column). So in
this case the formula would be evaluated and the result will this case the formula would be evaluated and the result will
be placed in this cell. You can also use negative values to be placed in this cell.
refer to cells relative to the size, -1 being the last (row or
column).
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.
@@ -119,7 +111,7 @@ Formula Expressions :
special functions 'Sum' and 'Average'. Both these functions take a special functions 'Sum' and 'Average'. Both these functions take a
range as input. A range can be of two forms : 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
above the current row (of the target cell). above the current row (of the target cell).
@@ -145,29 +137,17 @@ Overview:
|table-mode-toggle-map| ......... Set table mode toggle mapping. |table-mode-toggle-map| ......... Set table mode toggle mapping.
|table-mode-always-active| ...... Set table mode to always enabled. |table-mode-always-active| ...... Set table mode to always enabled.
|table-mode-delimiter| .......... Set the delimiter for Tableize. |table-mode-delimiter| .......... Set the delimiter for Tableize.
|table-mode-corner-corner| ...... Set the character to be used for |table-mode-tableize-map| ....... Set mapping for Tableize.
extreme corners of the table border. |table-mode-tableize-op-map| .... Set mapping for Tableize with input.
|table-mode-align-char|.......... Set the alignment character which |table-mode-realign-map| ........ Set mapping for table realigning.
can be added to the table header |table-mode-cell-text-object| ... Set mapping for table cell object.
border to control alignment of that |table-mode-delete-row-map| ..... Set mapping for deleting table row.
column. |table-mode-delete-column-map| .. Set mapping for deleting table
|table-mode-motion-up-map| ...... Set the table motion up mapping column.
|table-mode-motion-down-map| .... Set the table motion down mapping |table-mode-add-formula-map| .... Define a new table formula for the
|table-mode-motion-left-map| .... Set the table motion left mapping current cell.
|table-mode-motion-right-map| ... Set the table motion right mapping |table-mode-eval-expr-map| ...... Evaluate formula line and update
|table-mode-cell-text-object-a-map| table.
Set the 'a' cell text object
mapping
|table-mode-cell-text-object-i-map|
Set the 'i' cell text object
mapping
|table-mode-realign-map| ........ Set the realign mapping
|table-mode-delete-row-map| ..... Set the delete row mapping
|table-mode-delete-column-map| .. Set the delete column mapping
|table-mode-add-formula-map| .... Set the add formula mapping
|table-mode-eval-formula-map| ... Set the eval formula mapping
|table-mode-echo-cell-map| ...... Set the echo cell mapping
|table-mode-sort-map| ........... Set the table sort mapping
g:loaded_table_mode *table-mode-loaded* g:loaded_table_mode *table-mode-loaded*
Use this option to disable the plugin: > Use this option to disable the plugin: >
@@ -189,13 +169,13 @@ g:table_mode_fillchar *table-mode-fillchar*
let g:table_mode_fillchar = '-' let g:table_mode_fillchar = '-'
< <
g:table_mode_map_prefix *table-mode-map-prefix* g:table_mode_map_prefix *table-mode-map-prefix*
Use this option to define the table mode mapping prefix that will be Use this option to define the table mode mapping prefix that will be
prefixed for all other table mode mappings. > prefixed for all other table mode mappings. >
let g:table_mode_map_prefix = '<Leader>t' let g:table_mode_map_prefix = '<Leader>t'
< <
g:table_mode_toggle_map *table-mode-toggle-map* g:table_mode_toggle_map *table-mode-toggle-map*
Use this option to define the mapping for toggling the table mode: > Use this option to define the mapping for toggling the table mode: >
let g:table_mode_toggle_map = 'm' let g:table_mode_toggle_map = 'm'
< <
@@ -204,7 +184,7 @@ g:table_mode_toggle_map *table-mode-toggle-map*
NOTE you will need to use the |table-mode-map-prefix| before this to NOTE you will need to use the |table-mode-map-prefix| before this to
get the desired effect. get the desired effect.
g:table_mode_always_active *table-mode-always-active* g:table_mode_always_active *table-mode-always-active*
Use this option to permanently enable the table mode: > Use this option to permanently enable the table mode: >
let g:table_mode_always_active = 0 let g:table_mode_always_active = 0
< <
@@ -220,77 +200,77 @@ g:table_mode_delimiter *table-mode-delimiter*
|table-mode-commands-tableize| > |table-mode-commands-tableize| >
let g:table_mode_delimiter = ',' let g:table_mode_delimiter = ','
< <
g:table_mode_corner_corner *table-mode-corner-corner*
Use this option to define the character to be used for the extreme g:table_mode_tableize_map *table-mode-tableize-map*
corners of the table border. > Use this option to define the mapping to invoke |:Tableize| with
let g:table_mode_corner_corner = '|' default delimiter, i.e. |:Tableize| without input. >
let g:table_mode_tableize_map = 't'
< <
g:table_mode_align_char *table-mode-align-char*
Use this option to define the character to be used for defining g:table_mode_tableize_op_map *table-mode-tableize-op-map*
alignments for columns in the table header border. > Use this option to define the mapping to invoke |:Tableize| with input
let g:table_mode_align_char = ':' parameter. This option will ask for command-line input {pattern} that
defines the delimiter. >
let g:table_mode_tableize_op_map = '<Leader>T'
< <
g:table_mode_disable_mappings *table-mode-disable-mappings*
Set this to true to disable all mappings. > g:table_mode_realign_map *table-mode-realign-map*
let g:table_mode_disable_mappings = 1 Use this option to define the mapping for realigning table columns.
This is useful in case you make edits to an existing table. >
let g:table_mode_realign_map = 'r'
< <
g:table_mode_motion_up_map *table-mode-motion-up-map* NOTE you will need to use the |table-mode-map-prefix| before this to
Set this to configure the mapping to move up a cell vertically. > get the desired effect.
let g:table_mode_motion_up_map = '{<Bar>'
g:table_mode_cell_text_object *table-mode-cell-text-object*
Use this option to define the table mode cell text object. >
let g:table_mode_cell_text_object = 'tc'
< <
g:table_mode_motion_down_map *table-mode-motion-down-map* This text object automatically selects different text depending on the
Set this to configure the mapping to move down a cell vertically. > context.
let g:table_mode_motion_down_map = '}<Bar>'
> If you delete the cell using either the 'd' or the 'c'
g:table_mode_motion_left_map *table-mode-motion-left-map* operator, it will delete cell contents along with the table separator.
Set this to configure the mapping to move to the left cell. > In case you do it with 'c' while you add new content for the cell, you
let g:table_mode_motion_left_map = '[<Bar>' will have to re-add the |table-mode-separator|, which will trigger the
> re-alignment of the table again and format it correctly.
g:table_mode_motion_right_map *table-mode-motion-right-map*
Set this to configure the mapping to move to the right cell. > If you simply want to yank the table content, this text object will
let g:table_mode_motion_right_map = ']<Bar>' select only the table cell contents, without the padding (extra space
> around the text) or the |table-mode-separator|.
g:table_mode_cell_text_object_a_map *table-mode-cell-text-object-a-map*
Set this to configure the mapping to define the text object for around g:table_mode_delete_row_map *table-mode-delete-row-map*
cell object. > Use this option to define the mapping for deletion of the entire table
let g:table_mode_cell_text_object_a_map = 'a<Bar>' row. You can delete multiple rows by preceeding this with a [count]. >
> let g:table_mode_delete_column_map = 'dd'
g:table_mode_cell_text_object_i_map *table-mode-cell-text-object-i-map* <
Set this to configure the mapping to define the text object for inner NOTE you will need to use the |table-mode-map-prefix| before this to
cell object. > get the desired effect.
let g:table_mode_cell_text_object_i_map = 'i<Bar>'
> g:table_mode_delete_column_map *table-mode-delete-column-map*
g:table_mode_realign_map *table-mode-realign-map* Use this option to define the mapping for deletion of the entire table
Set this to configure the mapping for table realign. > column. You can delete multiple columns to the right by preceeding
let g:table_mode_realign_map = '<Leader>tr' this with a [count] >
> let g:table_mode_delete_column_map = 'dc'
g:table_mode_delete_row_map *table-mode-delete-row-map* <
Set this to configure the mapping for deleting a table row. > NOTE you will need to use the |table-mode-map-prefix| before this to
let g:table_mode_delete_row_map = '<Leader>tdd' get the desired effect.
>
g:table_mode_delete_column_map *table-mode-delete-column-map* g:table_mode_add_formula_map *table-mode-add-formula-map*
Set this to configure the mapping for deleting a table column. > Use this option to define the mapping for invoking |TableAddFormula|
let g:table_mode_delete_column_map = '<Leader>tdc' command. >
> let g:table_mode_add_formula_map = 'fa'
g:table_mode_add_formula_map *table-mode-add-formula-map* <
Set this to configure the mapping for adding a formula for a table NOTE you will need to use the |table-mode-map-prefix| before this to
cell. > get the desired effect.
let g:table_mode_add_formula_map = '<Leader>tfa'
> g:table_mode_eval_expr_map *table-mode-eval-expr-map*
g:table_mode_eval_formula_map *table-mode-eval-formula-map* Use this option to define the mapping for invoking
Set this to configure the mapping for evaluating the formula line. > |TableEvalFormulaLine| command. >
let g:table_mode_eval_formula_map = '<Leader>tfe' let g:table_mode_eval_expr_map = 'fe'
> <
g:table_mode_echo_cell_map *table-mode-echo-cell-map* NOTE you will need to use the |table-mode-map-prefix| before this to
Set this to configure the mapping for echoing the tablemode get the desired effect.
representation of the current cell. >
let g:table_mode_echo_cell_map = '<Leader>t?'
>
g:table_mode_sort_map *table-mode-sort-map*
Set this to configure the mapping for sorting the table mode by
current column. >
let g:table_mode_sort_map = '<Leader>ts'
>
=============================================================================== ===============================================================================
MAPPINGS *table-mode-mappings* MAPPINGS *table-mode-mappings*
@@ -302,9 +282,9 @@ MAPPINGS *table-mode-mappings*
*table-mode-mappings-toggle* *table-mode-mappings-toggle*
<Leader>tm Toggle table mode for the current buffer. You can change this <Leader>tm Toggle table mode for the current buffer. You can change this
using the |toggle-mode-options-toggle-map| option. using the |toggle-mode-options-toggle-map| option.
NOTE This is applicable only if |table-mode-always-active| is NOTE This is applicable only if
not set. |table-mode-always-active| is not set.
*table-mode-mappings-trigger* *table-mode-mappings-trigger*
| Trigger table creation in table mode. You can change this | Trigger table creation in table mode. You can change this
@@ -313,79 +293,70 @@ MAPPINGS *table-mode-mappings*
<Leader>tt Triggers |table-mode-commands-tableize| on the visually <Leader>tt Triggers |table-mode-commands-tableize| on the visually
selected content. selected content.
*table-mode-mappings-op-trigger* *table-mode-mappings-op-trigger*
<Leader>T Triggers |table-mode-commands-tableize| on the visually <Leader>T Triggers |table-mode-commands-tableize| on the visually
selected asking for user to input the delimiter. selected asking for user to input the delimiter.
*table-mode-mappings-realign* *table-mode-mappings-realign*
<Leader>tr Realigns table columns <Leader>tr Realigns table columns
<Leader>t? Echo the current table cells representation for defining
formulas.
*table-mode-mappings-motions* *table-mode-mappings-motions*
[| Move to previous cell <Leader>t[hjkl] Move to previous | below | above | right cell in the table.
]| Move to next cell
{| Move to the cell above
}| Move to the cell below
*table-mode-mappings-delete-row* *table-mode-mappings-delete-row*
<Leader>tdd Delete the entire table row you are on or multiple rows using <Leader>tdd Delete the entire table row you are on or multiple rows using
a [count]. You can change this using |table-mode-delete-row-map| a [count]. You can change this using |table-mode-delete-row-map|
option. option.
*table-mode-mappings-delete-column* *table-mode-mappings-delete-column*
<Leader>tdc Delete entire table column you are within. You can preceed it <Leader>tdc Delete entire table column you are within. You can preceed it
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-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.
*table-mode-mappings-evaluate-formula-line* *table-mode-mappings-evaluate-formula-line*
<Leader>tfe Evaluate the formula line which is a commented line right <Leader>tfe Evaluate the formula line which is a commented line right
after the table beginning with 'tmf:'. If one exists this after the table beginning with 'tmf:'. If one exists this
would evaluate the formula line and update the table would evaluate the formula line and update the table
accordingly. This invokes the |TableEvalFormulaLine| command. accordingly. This invokes the |TableEvalFormulaLine| command.
+- Expands to a header border, the line immidiately above this
*table-mode-mappings-sort-column* will be considered as the table header. You can change this by
<Leader>ts Sort a column under the cursor. This invokes |TableSort| changing |table-mode-corner| and |table-mode-fillchar|
options. This is an iabbrev so is triggered when you press
|| Expands to a header border. You can change this by changing space or <CR> after typing the mapping.
|table-mode-separator| option. You can change the character to
be used for te extreme corners of the border by changing
|table-mode-corner-corner| option.
=============================================================================== ===============================================================================
COMMANDS *table-mode-commands* COMMANDS *table-mode-commands*
*:TableModeToggle* *:TableModeToggle*
*table-mode-:TableModeToggle* *table-mode-:TableModeToggle*
:TableModeToggle :TableModeToggle
Toggles the table mode. Same effect as |toggle-mode-mappings-toggle|. Toggles the table mode. Same effect as |toggle-mode-mappings-toggle|.
NOTE this is applicable only if |table-mode-always-active| is NOTE this is applicable only if |table-mode-always-active| is
not set. not set.
*:TableModeEnable* *:TableModeEnable*
*table-mode-:TableModeEnable* *table-mode-:TableModeEnable*
:TableModeEnable :TableModeEnable
Enables Table Mode. Enables Table Mode.
NOTE this is applicable only if |table-mode-always-active| is NOTE this is applicable only if |table-mode-always-active| is
not set. not set.
*:TableModeDisable* *:TableModeDisable*
*table-mode-:TableModeDisable* *table-mode-:TableModeDisable*
:TableModeDisable :TableModeDisable
Disables Table Mode. Disables Table Mode.
NOTE this is applicable only if |table-mode-always-active| is NOTE this is applicable only if |table-mode-always-active| is
not set. not set.
*:Tableize* *:Tableize*
*table-mode-:Tableize* *table-mode-:Tableize*
:Tableize :Tableize
This converts the current line into a table if it consists of This converts the current line into a table if it consists of
@@ -401,33 +372,20 @@ COMMANDS *table-mode-commands*
NOTE this is optional, by default without the expression it will NOTE this is optional, by default without the expression it will
tableize the content using |table-mode-delimiter| as the delimiter. tableize the content using |table-mode-delimiter| as the delimiter.
*:TableModeRealign* *:TableAddFormula*
*table-mode-:TableModeRealign* *table-mode-:TableAddFormula*
:TableModeRealign
This command triggers |table-mode-mappings-realign|
*:TableAddFormula*
*table-mode-:TableAddFormula*
:TableAddFormula :TableAddFormula
This command is for defining a formula for the current table cell. It This command is for defining a formula for the current table cell. It
takes input on the cmd-line with a 'f=' prompt and appends it to the takes input on the cmd-line with a 'f=' prompt and appends it to the
formula line if it exists or adds a new formula line with the formula line if it exists or adds a new formula line with the
expression using the current cell as the target and the input formula. expression using the current cell as the target and the input formula.
*:TableEvalFormulaLine* *:TableEvalFormulaLine*
*table-mode-:TableEvalFormulaLine* *table-mode-:TableEvalFormulaLine*
:TableEvalFormulaLine :TableEvalFormulaLine
This command when invoked from anywhere within the table or directly This command when invoked from anywhere within the table or directly
on the formula line evaluates it and updates the table accordingly. on the formula line evaluates it and updates the table accordingly.
*:TableSort*
*table-mode-:TableSort*
:TableSort[!] [i][u][r][n][x][o]
This command sorts column under the cursor and inherits the same flags
as the |:sort| command.
With [!] the order is reversed.
=============================================================================== ===============================================================================
CONTRIBUTING *table-mode-contributing* CONTRIBUTING *table-mode-contributing*
@@ -441,4 +399,4 @@ REPORT ISSUES *table-mode-report-issues*
If you discover any issues, please report them at If you discover any issues, please report them at
http://github.com/dhruvasagar/table-mode/issues. http://github.com/dhruvasagar/table-mode/issues.
vim:tw=78:ts=8:ft=help:norl:ai:et vim:tw=78:ts=8:ft=help:norl:ai

View File

@@ -1,3 +1,24 @@
" =============================================================================
" File: plugin/table-mode.vim
" Description: Table mode for vim for creating neat tables.
" Author: Dhruva Sagar <http://dhruvasagar.com/>
" License: MIT (http://www.opensource.org/licenses/MIT)
" Website: http://github.com/dhruvasagar/vim-table-mode
" Version: 3.1
" Note: This plugin was heavily inspired by the 'CucumberTables.vim'
" (https://gist.github.com/tpope/287147) plugin by Tim Pope and
" uses a small amount of code from it.
"
" Copyright Notice:
" Permission is hereby granted to use and distribute this code,
" with or without modifications, provided that this copyright
" notice is copied with it. Like anything else that's free,
" table-mode.vim is provided *as is* and comes with no warranty
" of any kind, either expressed or implied. In no event will
" the copyright holder be liable for any damamges resulting
" from the use of this software.
" =============================================================================
" Finish if already loaded {{{1 " Finish if already loaded {{{1
if exists('g:loaded_table_mode') if exists('g:loaded_table_mode')
finish finish
@@ -16,53 +37,35 @@ endfunction
" Set Global Defaults {{{1 " Set Global Defaults {{{1
call s:SetGlobalOptDefault('table_mode_corner', '+') call s:SetGlobalOptDefault('table_mode_corner', '+')
call s:SetGlobalOptDefault('table_mode_verbose', 0)
call s:SetGlobalOptDefault('table_mode_separator', '|') call s:SetGlobalOptDefault('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_map_prefix', '<Leader>t') call s:SetGlobalOptDefault('table_mode_map_prefix', '<Leader>t')
call s:SetGlobalOptDefault('table_mode_toggle_map', 'm') call s:SetGlobalOptDefault('table_mode_toggle_map', 'm')
call s:SetGlobalOptDefault('table_mode_always_active', 0) call s:SetGlobalOptDefault('table_mode_always_active', 0)
call s:SetGlobalOptDefault('table_mode_delimiter', ',') call s:SetGlobalOptDefault('table_mode_delimiter', ',')
call s:SetGlobalOptDefault('table_mode_corner_corner', '|') call s:SetGlobalOptDefault('table_mode_tableize_map', 't')
call s:SetGlobalOptDefault('table_mode_align_char', ':') call s:SetGlobalOptDefault('table_mode_tableize_op_map', '<Leader>T')
call s:SetGlobalOptDefault('table_mode_disable_mappings', 0) call s:SetGlobalOptDefault('table_mode_realign_map', 'r')
call s:SetGlobalOptDefault('table_mode_cell_text_object', 'tc')
call s:SetGlobalOptDefault('table_mode_delete_row_map', 'dd')
call s:SetGlobalOptDefault('table_mode_delete_column_map', 'dc')
call s:SetGlobalOptDefault('table_mode_add_formula_map', 'fa')
call s:SetGlobalOptDefault('table_mode_eval_expr_map', 'fe')
call s:SetGlobalOptDefault('table_mode_motion_up_map', '{<Bar>') function! s:TableMotion() "{{{1
call s:SetGlobalOptDefault('table_mode_motion_down_map', '}<Bar>') let direction = nr2char(getchar())
call s:SetGlobalOptDefault('table_mode_motion_left_map', '[<Bar>') for i in range(v:count1)
call s:SetGlobalOptDefault('table_mode_motion_right_map', ']<Bar>') call tablemode#TableMotion(direction)
endfor
call s:SetGlobalOptDefault('table_mode_cell_text_object_a_map', 'a<Bar>')
call s:SetGlobalOptDefault('table_mode_cell_text_object_i_map', 'i<Bar>')
call s:SetGlobalOptDefault('table_mode_realign_map', '<Leader>tr')
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_add_formula_map', '<Leader>tfa')
call s:SetGlobalOptDefault('table_mode_eval_formula_map', '<Leader>tfe')
call s:SetGlobalOptDefault('table_mode_echo_cell_map', '<Leader>t?')
call s:SetGlobalOptDefault('table_mode_sort_map', '<Leader>ts')
function! s:TableEchoCell() "{{{1
if tablemode#table#IsRow('.')
echomsg '$' . tablemode#spreadsheet#RowNr('.') . ',' . tablemode#spreadsheet#ColumnNr('.')
endif
endfunction endfunction
augroup TableMode
au!
autocmd Syntax * if tablemode#IsActive() | call tablemode#SyntaxEnable() | endif
augroup END
" Define Commands & Mappings {{{1 " Define Commands & Mappings {{{1
if !g:table_mode_always_active "{{{2 if !g:table_mode_always_active "{{{2
exec "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_toggle_map . exec "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_toggle_map .
\ " <Esc>:call tablemode#Toggle()<CR>" \ " <Esc>:call tablemode#TableModeToggle()<CR>"
command! -nargs=0 TableModeToggle call tablemode#Toggle() command! -nargs=0 TableModeToggle call tablemode#TableModeToggle()
command! -nargs=0 TableModeEnable call tablemode#Enable() command! -nargs=0 TableModeEnable call tablemode#TableModeEnable()
command! -nargs=0 TableModeDisable call tablemode#Disable() command! -nargs=0 TableModeDisable call tablemode#TableModeDisable()
else else
let table_mode_separator_map = g:table_mode_separator let table_mode_separator_map = g:table_mode_separator
" '|' is a special character, we need to map <Bar> instead " '|' is a special character, we need to map <Bar> instead
@@ -75,56 +78,31 @@ endif
" }}}2 " }}}2
command! -nargs=? -range Tableize <line1>,<line2>call tablemode#TableizeRange(<q-args>) command! -nargs=? -range Tableize <line1>,<line2>call tablemode#TableizeRange(<q-args>)
command! -nargs=? -bang TableSort call tablemode#spreadsheet#Sort(<bang>0, <q-args>)
command! TableAddFormula call tablemode#spreadsheet#formula#Add()
command! TableModeRealign call tablemode#table#Realign('.')
command! TableEvalFormulaLine call tablemode#spreadsheet#formula#EvaluateFormulaLine()
" '|' is a special character, we need to map <Bar> instead command! TableAddFormula call tablemode#AddFormula()
if g:table_mode_separator ==# '|' | let separator_map = '<Bar>' | endif command! TableEvalFormulaLine call tablemode#EvaluateFormulaLine()
execute 'inoremap <silent> <Plug>(table-mode-tableize)' separator_map . '<Esc>:call tablemode#TableizeInsertMode()<CR>a'
nnoremap <silent> <Plug>(table-mode-tableize) :Tableize<CR> execute "xnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_tableize_map .
xnoremap <silent> <Plug>(table-mode-tableize) :Tableize<CR> \ " :Tableize<CR>"
xnoremap <silent> <Plug>(table-mode-tableize-delimiter) :<C-U>call tablemode#TableizeByDelimiter()<CR> execute "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_tableize_map .
\ " :Tableize<CR>"
execute "xnoremap <silent> " . g:table_mode_tableize_op_map .
\ " :<C-U>call tablemode#TableizeByDelimiter()<CR>"
execute "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_realign_map .
\ " :call tablemode#TableRealign('.')<CR>"
execute "nnoremap <silent> " . g:table_mode_map_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_map_prefix . g:table_mode_delete_row_map .
\ " :call tablemode#DeleteRow()<CR>"
execute "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_delete_column_map .
\ " :call tablemode#DeleteColumn()<CR>"
execute "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_add_formula_map .
\ " :TableAddFormula<CR>"
execute "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_eval_expr_map .
\ " :TableEvalFormulaLine<CR>"
nnoremap <silent> <Plug>(table-mode-realign) :call tablemode#table#Realign('.')<CR>
nnoremap <silent> <Plug>(table-mode-motion-up) :<C-U>call tablemode#spreadsheet#cell#Motion('k')<CR>
nnoremap <silent> <Plug>(table-mode-motion-down) :<C-U>call tablemode#spreadsheet#cell#Motion('j')<CR>
nnoremap <silent> <Plug>(table-mode-motion-left) :<C-U>call tablemode#spreadsheet#cell#Motion('h')<CR>
nnoremap <silent> <Plug>(table-mode-motion-right) :<C-U>call tablemode#spreadsheet#cell#Motion('l')<CR>
onoremap <silent> <Plug>(table-mode-cell-text-object-a) :<C-U>call tablemode#spreadsheet#cell#TextObject(0)<CR>
onoremap <silent> <Plug>(table-mode-cell-text-object-i) :<C-U>call tablemode#spreadsheet#cell#TextObject(1)<CR>
xnoremap <silent> <Plug>(table-mode-cell-text-object-a) :<C-U>call tablemode#spreadsheet#cell#TextObject(0)<CR>
xnoremap <silent> <Plug>(table-mode-cell-text-object-i) :<C-U>call tablemode#spreadsheet#cell#TextObject(1)<CR>
nnoremap <silent> <Plug>(table-mode-delete-row) :call tablemode#spreadsheet#DeleteRow()<CR>
nnoremap <silent> <Plug>(table-mode-delete-column) :call tablemode#spreadsheet#DeleteColumn()<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-echo-cell) :call <SID>TableEchoCell()<CR>
nnoremap <silent> <Plug>(table-mode-sort) :call tablemode#spreadsheet#Sort('')<CR>
if !hasmapto('<Plug>(table-mode-tableize)')
exec "nmap " . g:table_mode_map_prefix . "t <Plug>(table-mode-tableize)"
exec "xmap " . g:table_mode_map_prefix . "t <Plug>(table-mode-tableize)"
endif
if !hasmapto('<Plug>(table-mode-tableize-delimiter)')
xmap <Leader>T <Plug>(table-mode-tableize-delimiter)
endif
augroup TableMode "{{{1
au!
autocmd User TableModeEnabled call tablemode#logger#log('Table Mode Enabled')
autocmd User TableModeDisabled call tablemode#logger#log('Table Mode Disabled')
augroup END
" Avoiding side effects {{{1 " Avoiding side effects {{{1
let &cpo = s:save_cpo let &cpo = s:save_cpo

View File

@@ -1,20 +0,0 @@
" vim: fdm=indent
source t/config/options.vim
function! ConvertLines2Dict(lines)
let lines = []
for idx in range(len(a:lines))
call insert(lines, {"lnum": idx+1, "text": a:lines[idx]})
endfor
return lines
endfunction
describe 'Align'
it 'should align table content correctly'
Expect tablemode#align#Align(ConvertLines2Dict(readfile('t/fixtures/align/simple_before.txt'))) == ConvertLines2Dict(readfile('t/fixtures/align/simple_after.txt'))
end
it 'should align table content with unicode characters correctly'
Expect tablemode#align#Align(ConvertLines2Dict(readfile('t/fixtures/align/unicode_before.txt'))) == ConvertLines2Dict(readfile('t/fixtures/align/unicode_after.txt'))
end
end

View File

@@ -1,135 +0,0 @@
" vim: fdm=indent
source t/config/options.vim
describe 'cell'
describe 'API'
before
new
read t/fixtures/sample.txt
end
it 'should return the cells with GetCells'
Expect tablemode#spreadsheet#cell#GetCells(2, 1, 1) ==# 'test11'
" Get Rows
Expect tablemode#spreadsheet#cell#GetCells(2, 1) == ['test11', 'test12']
Expect tablemode#spreadsheet#cell#GetCells(2, 2) == ['test21', 'test22']
" Get Columns
Expect tablemode#spreadsheet#cell#GetCells(2, 0, 1) == ['test11', 'test21']
Expect tablemode#spreadsheet#cell#GetCells(2, 0, 2) == ['test12', 'test22']
end
it 'should return the row with GetRow'
Expect tablemode#spreadsheet#cell#GetRow(1, 2) == ['test11', 'test12']
Expect tablemode#spreadsheet#cell#GetRow(2, 2) == ['test21', 'test22']
end
it 'should return the column with GetColumn'
Expect tablemode#spreadsheet#cell#GetColumn(1, 2) == ['test11', 'test21']
Expect tablemode#spreadsheet#cell#GetColumn(2, 2) == ['test12', 'test22']
end
it 'should return the cells in a range with GetCellRange'
" Entire table as range
Expect tablemode#spreadsheet#cell#GetCellRange('1,1:2,2', 2, 1) == [['test11', 'test21'], ['test12', 'test22']]
" Get Rows given different seed lines and columns
Expect tablemode#spreadsheet#cell#GetCellRange('1,1:1,2', 2, 1) == ['test11', 'test12']
Expect tablemode#spreadsheet#cell#GetCellRange('1,1:1,2', 2, 2) == ['test11', 'test12']
Expect tablemode#spreadsheet#cell#GetCellRange('1,1:1,2', 3, 1) == ['test11', 'test12']
Expect tablemode#spreadsheet#cell#GetCellRange('1,1:1,2', 3, 2) == ['test11', 'test12']
Expect tablemode#spreadsheet#cell#GetCellRange('2,1:2,2', 2, 1) == ['test21', 'test22']
Expect tablemode#spreadsheet#cell#GetCellRange('2,1:2,2', 2, 2) == ['test21', 'test22']
Expect tablemode#spreadsheet#cell#GetCellRange('2,1:2,2', 3, 1) == ['test21', 'test22']
Expect tablemode#spreadsheet#cell#GetCellRange('2,1:2,2', 3, 2) == ['test21', 'test22']
" Get Columns given different seed lines and column
Expect tablemode#spreadsheet#cell#GetCellRange('1:2', 2, 1) == ['test11', 'test21']
Expect tablemode#spreadsheet#cell#GetCellRange('1:2', 2, 2) == ['test12', 'test22']
Expect tablemode#spreadsheet#cell#GetCellRange('1:2', 3, 1) == ['test11', 'test21']
Expect tablemode#spreadsheet#cell#GetCellRange('1:2', 3, 2) == ['test12', 'test22']
" Get Column given negative values in range for representing rows from
" the end, -1 being the second last row.
Expect tablemode#spreadsheet#cell#GetCellRange('1:-1', 2, 1) == ['test11']
Expect tablemode#spreadsheet#cell#GetCellRange('1:-1', 3, 1) == ['test11']
Expect tablemode#spreadsheet#cell#GetCellRange('1:-1', 2, 2) == ['test12']
Expect tablemode#spreadsheet#cell#GetCellRange('1:-1', 3, 2) == ['test12']
end
end
describe 'Motions'
describe 'left or right'
before
new
normal! ggdG
read t/fixtures/sample.txt
call cursor(2, 3)
end
it 'should move left when not on first column'
call cursor(2, 12)
Expect tablemode#spreadsheet#ColumnNr('.') == 2
call tablemode#spreadsheet#cell#Motion('h')
Expect tablemode#spreadsheet#ColumnNr('.') == 1
end
it 'should move to the previous row last column if it exists when on first column'
call cursor(3, 3)
Expect tablemode#spreadsheet#RowNr('.') == 2
Expect tablemode#spreadsheet#ColumnNr('.') == 1
call tablemode#spreadsheet#cell#Motion('h')
Expect tablemode#spreadsheet#RowNr('.') == 1
Expect tablemode#spreadsheet#ColumnNr('.') == 2
end
it 'should move right when not on last column'
Expect tablemode#spreadsheet#ColumnNr('.') == 1
call tablemode#spreadsheet#cell#Motion('l')
Expect tablemode#spreadsheet#ColumnNr('.') == 2
end
it 'should move to the next row first column if it exists when on last column'
call cursor(2, 12)
Expect tablemode#spreadsheet#RowNr('.') == 1
Expect tablemode#spreadsheet#ColumnNr('.') == 2
call tablemode#spreadsheet#cell#Motion('l')
Expect tablemode#spreadsheet#RowNr('.') == 2
Expect tablemode#spreadsheet#ColumnNr('.') == 1
end
end
describe 'up or down'
before
new
normal! ggdG
read t/fixtures/sample.txt
call cursor(2, 3)
end
it 'should move a row up unless on first row'
call cursor(3, 3)
Expect tablemode#spreadsheet#RowNr('.') == 2
call tablemode#spreadsheet#cell#Motion('k')
Expect tablemode#spreadsheet#RowNr('.') == 1
end
it 'should remain on first row when trying to move up'
Expect tablemode#spreadsheet#RowNr('.') == 1
call tablemode#spreadsheet#cell#Motion('k')
Expect tablemode#spreadsheet#RowNr('.') == 1
end
it 'should move a row down unless on last row'
Expect tablemode#spreadsheet#RowNr('.') == 1
call tablemode#spreadsheet#cell#Motion('j')
Expect tablemode#spreadsheet#RowNr('.') == 2
end
it 'should remain on last row when trying to move down'
Expect tablemode#spreadsheet#RowNr('.') == 1
call tablemode#spreadsheet#cell#Motion('k')
Expect tablemode#spreadsheet#RowNr('.') == 1
end
end
end
end

View File

@@ -1,27 +0,0 @@
let g:table_mode_corner = '+'
let g:table_mode_separator = '|'
let g:table_mode_fillchar = '-'
let g:table_mode_header_fillchar = '-'
let g:table_mode_map_prefix = '<Leader>t'
let g:table_mode_toggle_map = 'm'
let g:table_mode_always_active = 0
let g:table_mode_delimiter = ','
let g:table_mode_corner_corner = '|'
let g:table_mode_align_char = ':'
let g:table_mode_disable_mappings = 0
let g:table_mode_motion_up_map = '{<Bar>'
let g:table_mode_motion_down_map = '}<Bar>'
let g:table_mode_motion_left_map = '[<Bar>'
let g:table_mode_motion_right_map = ']<Bar>'
let g:table_mode_cell_text_object_a_map = 'a<Bar>'
let g:table_mode_cell_text_object_i_map = 'i<Bar>'
let g:table_mode_realign_map = '<Leader>tr'
let g:table_mode_delete_row_map = '<Leader>tdd'
let g:table_mode_delete_column_map = '<Leader>tdc'
let g:table_mode_add_formula_map = '<Leader>tfa'
let g:table_mode_eval_formula_map = '<Leader>tfe'
let g:table_mode_echo_cell_map = '<Leader>t?'
let g:table_mode_sort_map = '<Leader>ts'

View File

@@ -1,2 +0,0 @@
| This | is a | table |
| This | is also | a table |

View File

@@ -1,2 +0,0 @@
|This|is a|table|
|This|is also|a table|

View File

@@ -1,2 +0,0 @@
| This | is 測試 | table |
| This | is also | a table |

View File

@@ -1,2 +0,0 @@
| This | is 測試 | table |
| This | is also | a table |

View File

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

View File

@@ -1,7 +0,0 @@
| Item | Cost |
|----------+-------|
| Bread | 20 |
| Tomatoes | 5 |
| Pasta | 100 |
| Total | 0 |
/* tmf: $4,2=Sum(1:-1) */

View File

@@ -1,7 +0,0 @@
| Item | Cost |
|----------+------|
| Bread | 20 |
| Tomatoes | 5 |
| Pasta | 100 |
| Total | |
| Test | |

View File

@@ -1,4 +0,0 @@
| test11 | test12 |
| test21 | test22 |

View File

@@ -1,4 +0,0 @@
| test11 | test12 |
| test21 | test22 |

View File

@@ -1,3 +0,0 @@
| test11 | test12 |
| test21 | test22 |

View File

@@ -1,9 +0,0 @@
| abc | 测试长度 | 长测试 |
| 长 | 测试测试测试测试 | 测试测试 |
| 测试测试 | 测试 | 测试测测试 |
| 测试测试测试 | 测试测试 | 测试 |

View File

@@ -1,4 +0,0 @@
| S. No | Title | Message |
|-------+:------+:-------:|
| 1 | t1 | msg1 |
| 2 | t2 | msg2 |

View File

@@ -1,4 +0,0 @@
|S. No|Title|Message|
|-----+:----+:-----:|
|1|t1|msg1|
|2|t2|msg2|

View File

@@ -1,8 +0,0 @@
|--------------+------------------+------------|
| 测试测试 | 测试长度 | 长测试 |
|--------------+:----------------:+-----------:|
| abc | 测试长度 | 长测试 |
| 长 | 测试测试测试测试 | 测试测试 |
| 测试测试 | 测试 | 测试测测试 |
| 测试测试测试 | 测试测试 | 测试 |
|--------------+------------------+------------|

View File

@@ -1,8 +0,0 @@
|--------+--------+------|
|测试测试|测试长度|长测试|
|--------+:------:+-----:|
|abc|测试长度|长测试|
|长|测试测试测试测试|测试测试|
|测试测试|测试|测试测测试|
|测试测试测试|测试测试|测试|
|------------+--------+----|

View File

@@ -1,2 +0,0 @@
| test11 | test12 |
| test21 | test22 |

View File

@@ -1,2 +0,0 @@
|test11|test12|
|test21|test22|

View File

@@ -1,4 +0,0 @@
| abc | 测试长度 | 长测试 |
| 长 | 测试测试测试测试 | 测试测试 |
| 测试测试 | 测试 | 测试测测试 |
| 测试测试测试 | 测试测试 | 测试 |

View File

@@ -1,4 +0,0 @@
|abc|测试长度|长测试|
|长|测试测试测试测试|测试测试|
|测试测试|测试|测试测测试|
|测试测试测试|测试测试|测试|

View File

@@ -1,7 +0,0 @@
|--------+---------|
| Title | Message |
|--------+---------|
| test11 | test12 |
| test21 | test22 |
|--------+---------|

View File

@@ -1,4 +0,0 @@
asd,asd;asd,asd
asd,asd;asd,asd

View File

@@ -1,39 +0,0 @@
" vim: fdm=indent
source t/config/options.vim
describe 'Formulas'
describe 'Add Formula'
before
new
read t/fixtures/formula/sample.txt
end
it 'should add a formula successfully'
call cursor(6, 15)
call tablemode#spreadsheet#formula#Add("Sum(1:3)")
Expect tablemode#spreadsheet#cell#GetCell() == '125.0'
call cursor(8, 15)
Expect getline('.') == '/* tmf: $4,2=Sum(1:3) */'
call cursor(7, 15)
call tablemode#spreadsheet#formula#Add("Sum(1:-1)")
Expect tablemode#spreadsheet#cell#GetCell() == '250.0'
call cursor(8, 15)
Expect getline('.') == '/* tmf: $4,2=Sum(1:3); $5,2=Sum(1:-1) */'
end
end
describe 'Evaluate Formula'
before
new
read t/fixtures/formula/formula.txt
end
it 'should evaluate the formula successfull'
call cursor(6, 15)
call tablemode#spreadsheet#formula#EvaluateFormulaLine()
Expect &modified == 1
Expect tablemode#spreadsheet#cell#GetCell() == '125.0'
end
end
end

View File

@@ -1,105 +0,0 @@
" vim: fdm=indent
source t/config/options.vim
describe 'spreadsheet'
describe 'API'
before
new
read t/fixtures/sample.txt
end
it 'should return the row count'
Expect tablemode#spreadsheet#RowCount(2) == 2
Expect tablemode#spreadsheet#RowCount(3) == 2
end
it 'should return the row number'
Expect tablemode#spreadsheet#RowNr(2) == 1
Expect tablemode#spreadsheet#RowNr(3) == 2
end
it 'should return the column count'
Expect tablemode#spreadsheet#ColumnCount(2) == 2
Expect tablemode#spreadsheet#ColumnCount(3) == 2
end
it 'should return the column number'
call cursor(2,3)
Expect tablemode#spreadsheet#ColumnNr('.') == 1
call cursor(2,12)
Expect tablemode#spreadsheet#ColumnNr('.') == 2
end
it 'should return true when in the first cell'
call cursor(2,3)
Expect tablemode#spreadsheet#IsFirstCell() to_be_true
call cursor(2,12)
Expect tablemode#spreadsheet#IsFirstCell() to_be_false
end
it 'should return true when in the last cell'
call cursor(2,3)
Expect tablemode#spreadsheet#IsLastCell() to_be_false
call cursor(2,12)
Expect tablemode#spreadsheet#IsLastCell() to_be_true
end
it 'should return the line number of the first row'
Expect tablemode#spreadsheet#GetFirstRow(2) == 2
Expect tablemode#spreadsheet#GetFirstRow(3) == 2
end
it 'should return the line nuber of the last row'
Expect tablemode#spreadsheet#GetLastRow(2) == 3
Expect tablemode#spreadsheet#GetLastRow(3) == 3
end
describe 'Math'
before
new
read t/fixtures/cell/sample.txt
end
it 'should return the sum of cell range'
call cursor(1,3)
Expect tablemode#spreadsheet#Sum('1:2') == 4.0
Expect tablemode#spreadsheet#Sum('1,1:1,2') == 3.0
Expect tablemode#spreadsheet#Sum('1,1:2,2') == 10.0
call cursor(2,7)
Expect tablemode#spreadsheet#Sum('1:2') == 6.0
Expect tablemode#spreadsheet#Sum('2,1:2,2') == 7.0
end
it 'should return the average of cell range'
call cursor(1,3)
Expect tablemode#spreadsheet#Average('1:2') == 2.0
Expect tablemode#spreadsheet#Average('1,1:1,2') == 1.5
Expect tablemode#spreadsheet#Average('1,1:2,2') == 5.0
call cursor(2,7)
Expect tablemode#spreadsheet#Average('1:2') == 3.0
Expect tablemode#spreadsheet#Average('2,1:2,2') == 3.5
end
end
end
describe 'Manipulations'
before
new
normal! ggdG
read t/fixtures/sample.txt
call cursor(2, 3)
end
it 'should delete a row successfully'
Expect tablemode#spreadsheet#RowCount('.') == 2
call tablemode#spreadsheet#DeleteRow()
Expect tablemode#spreadsheet#RowCount('.') == 1
end
it 'should successfully delete column'
Expect tablemode#spreadsheet#ColumnCount('.') == 2
call tablemode#spreadsheet#DeleteColumn()
Expect tablemode#spreadsheet#ColumnCount('.') == 1
end
end
end

View File

@@ -1,184 +0,0 @@
" vim: fdm=indent
source t/config/options.vim
describe 'table'
describe 'IsRow'
before
new
normal! ggdG
read t/fixtures/table/sample.txt
end
it 'should be true when on a table row'
Expect tablemode#table#IsRow(2) to_be_true
Expect tablemode#table#IsRow(3) to_be_true
end
it 'should be false when not on a table row'
Expect tablemode#table#IsRow(1) to_be_false
Expect tablemode#table#IsRow(4) to_be_false
end
end
describe 'IsBorder'
before
new
normal! ggdG
read t/fixtures/table/sample_with_header.txt
end
it 'should be true on a table border'
Expect tablemode#table#IsBorder(1) to_be_true
Expect tablemode#table#IsBorder(3) to_be_true
Expect tablemode#table#IsBorder(6) to_be_true
end
it 'should be false when not on a table border'
Expect tablemode#table#IsBorder(2) to_be_false
Expect tablemode#table#IsBorder(4) to_be_false
Expect tablemode#table#IsBorder(5) to_be_false
end
end
describe 'IsTable'
before
new normal! ggdG
read t/fixtures/table/sample_with_header.txt
end
it 'should be true on a table row'
Expect tablemode#table#IsTable(2) to_be_true
Expect tablemode#table#IsTable(4) to_be_true
Expect tablemode#table#IsTable(5) to_be_true
end
it 'should be true when on a table border'
Expect tablemode#table#IsTable(1) to_be_true
Expect tablemode#table#IsTable(3) to_be_true
Expect tablemode#table#IsTable(6) to_be_true
end
it 'should not be true when not on a table'
Expect tablemode#table#IsTable(7) to_be_false
end
end
describe 'IsHeader'
before
new
normal! ggdG
read t/fixtures/table/sample_with_header.txt
end
it 'should be true on the table header'
Expect tablemode#table#IsHeader(2) to_be_true
end
it 'should be false anywhere else'
Expect tablemode#table#IsHeader(1) to_be_false
Expect tablemode#table#IsHeader(4) to_be_false
Expect tablemode#table#IsHeader(5) to_be_false
Expect tablemode#table#IsHeader(6) to_be_false
Expect tablemode#table#IsHeader(7) to_be_false
end
end
describe 'AddBorder'
before
new
normal! ggdG
read t/fixtures/table/sample_for_header.txt
end
it 'should add border to line'
call tablemode#table#AddBorder(2)
Expect tablemode#table#IsHeader(1) to_be_true
Expect tablemode#table#IsBorder(2) to_be_true
end
describe 'for unicode'
before
new
normal! ggdG
read t/fixtures/table/sample_for_header_unicode.txt
end
it 'should add border to line'
call tablemode#table#AddBorder(1)
call tablemode#table#AddBorder(3)
call tablemode#table#AddBorder(5)
call tablemode#table#AddBorder(7)
call tablemode#table#AddBorder(9)
Expect tablemode#table#IsBorder(1) to_be_true
Expect tablemode#utils#StrDisplayWidth(getline(1)) == tablemode#utils#StrDisplayWidth(getline(2))
Expect tablemode#table#IsBorder(3) to_be_true
Expect tablemode#utils#StrDisplayWidth(getline(3)) == tablemode#utils#StrDisplayWidth(getline(4))
Expect tablemode#table#IsBorder(5) to_be_true
Expect tablemode#utils#StrDisplayWidth(getline(5)) == tablemode#utils#StrDisplayWidth(getline(6))
Expect tablemode#table#IsBorder(7) to_be_true
Expect tablemode#utils#StrDisplayWidth(getline(7)) == tablemode#utils#StrDisplayWidth(getline(8))
Expect tablemode#table#IsBorder(9) to_be_true
Expect tablemode#utils#StrDisplayWidth(getline(9)) == tablemode#utils#StrDisplayWidth(getline(8))
end
end
end
describe 'Realign'
describe 'without header alignments'
describe 'for simple'
before
new
normal! ggdG
read t/fixtures/table/sample_realign_before.txt
end
it 'should be aligned properly'
call tablemode#table#Realign(1)
Expect getline(1,'$') == readfile('t/fixtures/table/sample_realign_after.txt')
end
end
describe 'for unicode'
before
new
normal! ggdG
read t/fixtures/table/sample_realign_unicode_before.txt
end
it 'should be aligned properly'
call tablemode#table#Realign(1)
Expect getline(1,'$') == readfile('t/fixtures/table/sample_realign_unicode_after.txt')
end
end
end
describe 'with header alignments'
describe 'for simple'
before
new
normal! ggdG
read t/fixtures/table/sample_header_realign_before.txt
end
it 'should be aligned properly'
call tablemode#table#Realign(1)
Expect getline(1,'$') == readfile('t/fixtures/table/sample_header_realign_after.txt')
end
end
describe 'for unicode'
before
new
normal! ggdG
read t/fixtures/table/sample_header_realign_unicode_before.txt
end
it 'should be aligned properly'
call tablemode#table#Realign(1)
Expect getline(1,'$') == readfile('t/fixtures/table/sample_header_realign_unicode_after.txt')
end
end
end
end
end

View File

@@ -1,56 +0,0 @@
" vim: fdm=indent
source t/config/options.vim
describe 'tablemode'
describe 'Activation'
describe 'tablemode#Enable()'
before
call tablemode#Enable()
end
it 'should enable table mode'
Expect b:table_mode_active to_be_true
end
end
describe 'tablemode#Disable()'
before
call tablemode#Disable()
end
it 'should disable table mode'
Expect b:table_mode_active to_be_false
end
end
describe 'tablemode#Toggle()'
it 'should toggle table mode'
call tablemode#Toggle()
Expect b:table_mode_active to_be_true
call tablemode#Toggle()
Expect b:table_mode_active to_be_false
end
end
end
describe 'Tableize'
before
new
read t/fixtures/tableize.txt
end
it 'should tableize with default delimiter'
:2,3call tablemode#TableizeRange('')
Expect tablemode#table#IsRow(2) to_be_true
Expect tablemode#spreadsheet#RowCount(2) == 2
Expect tablemode#spreadsheet#ColumnCount(2) == 3
end
it 'should tableize with given delimiter'
:2,3call tablemode#TableizeRange('/;')
Expect tablemode#table#IsRow(2) to_be_true
Expect tablemode#spreadsheet#RowCount(2) == 2
Expect tablemode#spreadsheet#ColumnCount(2) == 2
end
end
end

View File

@@ -1,45 +0,0 @@
" vim: fdm=indent
source t/config/options.vim
describe 'utils'
describe 'line'
it 'should return the current line number'
Expect tablemode#utils#line('.') == line('.')
end
it 'should return the line number itself if it is a number'
Expect tablemode#utils#line(1) == 1
end
end
describe 'strip'
it 'should strip all initial or trailing whitespace from a string'
let string = ' This is awesome '
Expect tablemode#utils#strip(string) == 'This is awesome'
end
end
describe 'strlen'
it 'should return the length of a string correctly'
let string = 'this is a test'
Expect tablemode#utils#strlen(string) == 14
end
it 'should return the length of a unicode string correctly'
let string = '測試 is good.'
Expect tablemode#utils#strlen(string) == 11
end
end
describe 'strdisplaywidth'
it 'should return the display width of a string correctly'
let string = 'this is a test'
Expect tablemode#utils#StrDisplayWidth(string) == 14
end
it 'should return the display width of a unicode string correctly'
let string = '測試 is good.'
Expect tablemode#utils#StrDisplayWidth(string) == 13
end
end
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 30 KiB