aboutsummaryrefslogtreecommitdiff
path: root/vim/bundle/vim-table-mode
diff options
context:
space:
mode:
Diffstat (limited to 'vim/bundle/vim-table-mode')
-rw-r--r--vim/bundle/vim-table-mode/.gitignore2
-rw-r--r--vim/bundle/vim-table-mode/.travis.yml4
-rw-r--r--vim/bundle/vim-table-mode/CHANGELOG.md144
-rw-r--r--vim/bundle/vim-table-mode/Gemfile5
-rw-r--r--vim/bundle/vim-table-mode/Gemfile.lock18
-rw-r--r--vim/bundle/vim-table-mode/README.md248
-rw-r--r--vim/bundle/vim-table-mode/Rakefile13
-rw-r--r--vim/bundle/vim-table-mode/VimFlavor.lock1
-rw-r--r--vim/bundle/vim-table-mode/autoload/tablemode.vim195
-rw-r--r--vim/bundle/vim-table-mode/autoload/tablemode/align.vim134
-rw-r--r--vim/bundle/vim-table-mode/autoload/tablemode/logger.vim5
-rw-r--r--vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet.vim189
-rw-r--r--vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet/cell.vim258
-rw-r--r--vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet/formula.vim122
-rw-r--r--vim/bundle/vim-table-mode/autoload/tablemode/table.vim198
-rw-r--r--vim/bundle/vim-table-mode/autoload/tablemode/utils.vim49
-rw-r--r--vim/bundle/vim-table-mode/doc/table-mode.txt444
-rw-r--r--vim/bundle/vim-table-mode/plugin/table-mode.vim132
-rw-r--r--vim/bundle/vim-table-mode/t/align.vim20
-rw-r--r--vim/bundle/vim-table-mode/t/cell.vim135
-rw-r--r--vim/bundle/vim-table-mode/t/config/options.vim27
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/align/simple_after.txt2
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/align/simple_before.txt2
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/align/unicode_after.txt2
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/align/unicode_before.txt2
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/cell/sample.txt2
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/formula/formula.txt7
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/formula/sample.txt7
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/sample.txt4
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample.txt4
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_for_header.txt3
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_for_header_unicode.txt9
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_after.txt4
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_before.txt4
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_unicode_after.txt8
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_unicode_before.txt8
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_after.txt2
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_before.txt2
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_unicode_after.txt4
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_unicode_before.txt4
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/table/sample_with_header.txt7
-rw-r--r--vim/bundle/vim-table-mode/t/fixtures/tableize.txt4
-rw-r--r--vim/bundle/vim-table-mode/t/formula.vim39
-rw-r--r--vim/bundle/vim-table-mode/t/spreadsheet.vim105
-rw-r--r--vim/bundle/vim-table-mode/t/table.vim184
-rw-r--r--vim/bundle/vim-table-mode/t/tablemode.vim56
-rw-r--r--vim/bundle/vim-table-mode/t/utils.vim45
-rw-r--r--vim/bundle/vim-table-mode/youtube.pngbin0 -> 44355 bytes
48 files changed, 2863 insertions, 0 deletions
diff --git a/vim/bundle/vim-table-mode/.gitignore b/vim/bundle/vim-table-mode/.gitignore
new file mode 100644
index 0000000..a9bc329
--- /dev/null
+++ b/vim/bundle/vim-table-mode/.gitignore
@@ -0,0 +1,2 @@
+tags
+.vim-flavor/
diff --git a/vim/bundle/vim-table-mode/.travis.yml b/vim/bundle/vim-table-mode/.travis.yml
new file mode 100644
index 0000000..8dcbc68
--- /dev/null
+++ b/vim/bundle/vim-table-mode/.travis.yml
@@ -0,0 +1,4 @@
+language: ruby
+rvm:
+ - 2.2.0
+script: rake ci
diff --git a/vim/bundle/vim-table-mode/CHANGELOG.md b/vim/bundle/vim-table-mode/CHANGELOG.md
new file mode 100644
index 0000000..da60457
--- /dev/null
+++ b/vim/bundle/vim-table-mode/CHANGELOG.md
@@ -0,0 +1,144 @@
+# Change Log
+
+## 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
+* Removed dependence on Tabular and added code borrowed from Tabular for
+ aligning the table rows.
+* Added feature to be able to define & evaluate formulas.
+
+## Version 2.4.0
+* Added Table Cell text object.
+* Added api to delete entire table row.
+* Added api to delete entire table column.
+
+## Version 2.3.0
+* Refactored realignment logic. Generating borders by hand.
+
+## Version 2.2.2
+* Added mapping for realigning table columns.
+* Added table motions to move around in the table.
+
+## Version 2.2.1
+* Added feature to allow Table-Mode to work within comments. Uses
+ 'commentstring' option of vim to identify comments, so it should work for
+ most filetypes as long as 'commentstring' option has been set. This is
+ usually done appropriately in filetype plugins.
+
+## Version 2.2
+* Improved :Tableize to now accept a {pattern} just like :Tabular to match the
+ delimiter.
+
+## Version 2.1.3 :
+* Bug Fix #1, added new option `g:table_mode_no_border_padding` which removes
+ padding from the border.
+
+## Version 2.1.2 :
+* Bug Fixes #2, #3 & #4
+
+## Version 2.1.1 :
+* Added option `g:table_mode_align` to allow setting Tabular format option for
+ more control on how Tabular aligns text.
+
+## Version 2.1 :
+* VIM loads plugins in alphabetical order and so table-mode would be loaded
+ before Tabularize which it depends on. Hence Moved plugin into an after
+ plugin. Checking if Tabularize is available and finish immidiately if it's
+ not.
+
+## Version 2.0 :
+* Moved bulk of code to autoload for vimscript optimisation.
+
+## Version 1.1 :
+* Added Tableize command and mapping to convert existing content into a table.
+
+## Version 1.0 :
+* First stable release, create tables as you type.
+
+<!--
+ vim: ft=markdown
+-->
diff --git a/vim/bundle/vim-table-mode/Gemfile b/vim/bundle/vim-table-mode/Gemfile
new file mode 100644
index 0000000..61c6fc7
--- /dev/null
+++ b/vim/bundle/vim-table-mode/Gemfile
@@ -0,0 +1,5 @@
+source 'https://rubygems.org'
+
+ruby '2.2.0'
+gem 'rake'
+gem 'vim-flavor', '~> 1.1'
diff --git a/vim/bundle/vim-table-mode/Gemfile.lock b/vim/bundle/vim-table-mode/Gemfile.lock
new file mode 100644
index 0000000..eb9fd06
--- /dev/null
+++ b/vim/bundle/vim-table-mode/Gemfile.lock
@@ -0,0 +1,18 @@
+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)
diff --git a/vim/bundle/vim-table-mode/README.md b/vim/bundle/vim-table-mode/README.md
new file mode 100644
index 0000000..53ff10d
--- /dev/null
+++ b/vim/bundle/vim-table-mode/README.md
@@ -0,0 +1,248 @@
+# VIM Table Mode v4.6.4 [![Build Status](https://travis-ci.org/dhruvasagar/vim-table-mode.png?branch=master)](https://travis-ci.org/dhruvasagar/vim-table-mode)
+
+An awesome automatic table creator & formatter allowing one to create neat
+tables as you type.
+
+## Getting Started
+
+### Installation
+
+There are several ways to do this
+
+1. I recommend installing <a
+ href="https://github.com/Shougo/neobundle.vim">NeoBundle</a> and then just
+ add `NeoBundle 'dhruvasagar/vim-table-mode'` to your ~/.vimrc
+
+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
+$ cd ~/.vim
+$ git submodule add git@github.com:dhruvasagar/vim-table-mode.git bundle/table-mode
+ ```
+3. Copy all files under autoload/, plugin/, doc/ to respective
+ ~/.vim/autoload/, ~/.vim/plugin and ~/.vim/doc under UNIX or
+ vimfiles/autoload/, vimfiles/plugin/ and vimfiles/doc under WINDOWS and
+ restart VIM
+
+### Creating table on-the-fly
+
+To start using the plugin in the on-the-fly mode use `:TableModeToggle` mapped to <kbd>\<Leader\>tm</kbd> by default (which means <kbd>\\</kbd> <kbd>t</kbd> <kbd>m</kbd> if you didn't override the <Leader> by `:let mapleader = ","` to have <kbd>,</kbd> <kbd>t</kbd> <kbd>m</kbd>).
+
+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:
+
+ | name | address | phone |
+
+In the second line (without leaving Insert mode), enter `|` twice. The plugin will write a properly formatted horizontal line:
+
+ | name | address | phone |
+ |------+---------+-------|
+
+When you enter the subsequent lines, the plugin will automatically adjust the formatting to match the text you’re 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
+ 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
+ simple. You can visually select multiple lines and call `:Tableize` on it,
+ or alternatively use the mapping <kbd>\<Leader\>tt</kbd> defined by the
+ `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`
+ option as the delimiter.
+
+ 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/;` uses ';' as the delimiter) or use the mapping <kbd>\<Leader\>T</kbd>
+ defined by `g:table_mode_tableize_op_map` option which takes input in the
+ cmd-line and uses the `{pattern}` input as the delimiter.
+
+ `: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.
+ You can use the mapping <kbd>\<Leader\>T</kbd> with a `[count]` to apply it to the
+ next `[count]` lines in standard vim style.
+
+### Moving around
+
+ Now you can move between cells using table mode motions <kbd>[|</kbd>,
+ <kbd>]|</kbd>, <kbd>{|</kbd> & <kbd>}|</kbd> to move left | right | up |
+ down cells respectively. The left | right motions wrap around the table
+ and move to the next | previous row after the last | first cell in the
+ current row if one exists.
+
+### Manipulating Table
+
+ - **Cell Text Object** :
+
+ Tableize provides a text object for manipulating table cells. Following
+ the vim philosophy the you have <kbd>i|</kbd> & <kbd>a|</kbd> for the
+ inner and around (including the immidiate right table separator) the
+ table cell.
+
+ - **Delete Row** :
+
+ You can use the <kbd>\<Leader\>tdd</kbd> mapping defined by the option
+ `g:table_mode_delete_row_map` to delete the current table row (provided
+ you are within a table row), this can be preceeded with a [count] to
+ delete multiple rows just like you would with 'dd'.
+
+ - **Delete Column** :
+
+ You can use the <kbd>\<Leader\>tdc</kbd> mapping defined by the option
+ `g:table_mode_delete_column_map` to delete the entire current column
+ (provided you are within a table row), this can also be preceeded with a
+ [count] to delete multiple columns.
+
+## Advanced Usage: Spreadsheet Capabilities
+
+### Table Formulas
+
+ Table Mode now has support for formulas like a spreadsheet. There are 2 ways
+ of defining formulas :
+
+ - You can add formulas using `:TableAddFormula` or the mapping <kbd>\<Leader\>tfa</kbd>
+ defined by the option `g:table_mode_add_formula_map` from within a table
+ 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
+ one will be created with the input formula taking the current cell as the
+ target cell. The formula line is evaluated immidiately to reflect the
+ results.
+
+ - You can directly add / manipulate formula expressions in the formula line.
+ The formula line is a commented line right after the table, beginning with
+ 'tmf:' (table mode formula). eg) `# tmf: $3=$2*$1`. You can add multiple
+ 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
+ mapping <kbd>\<Leader\>tfe</kbd> defined by the option `g:table_mode_eval_expr_map`
+ from anywhere inside the table or while on the formula line.
+
+ NOTE: You can now use the mapping <kbd>\<Leader\>t?</kbd>
+
+### Formula Expressions
+
+ Expressions are of the format `$target = formula`.
+
+ - The `target` can be of 2 forms :
+
+ - `$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
+ in it. You can use negative indice to represent column relative to the
+ last, -1 being the last.
+
+ - `$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
+ cell. You can also use negative values to refer to cells relative to
+ the size, -1 being the last (row or column).
+
+ - 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
+ can use all native vim functions within the formula. Apart from that table
+ mode also provides 2 special functions `Sum` and `Average`. Both these
+ 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`
+ through `r2`. If `r2` is negative it represents `r2` rows above the
+ current row (of the target cell).
+
+ - `r1,c1:r2,c2`: This represents cells in the table from cell r1,c1
+ through cell r2,c2 (row, column).
+
+ - Examples :
+ - `$2 = $1 * $1`
+ - `$2 = pow($1, 5)` NOTE: Remember to put space between the $1, and 5
+ here otherwise it will be treated like a table cell.
+ - `$2 = $1 / $1,3`
+ - `$1,2 = $1,1 * $1,1`
+ - `$5,1 = Sum(1:-1)`
+ - `$5,1 = float2nr(Sum(1:-1))`
+ - `$5,3 = Sum(1,2:5,2)`
+ - `$5,3 = Sum(1,2:5,2)/$5,1`
+ - `$5,3 = Average(1,2:5,2)/$5,1`
+
+## Demo
+
+<a href="http://www.youtube.com/watch?v=9lVQ0VJY3ps"><img
+src="https://raw.github.com/axil/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
+
+### Reporting an Issue :
+- Use <a href="https://github.com/dhruvasagar/vim-table-mode/issues">Github
+ Issue Tracker</a>
+
+### Contributing to code :
+- Fork it.
+- Commit your changes and give your commit message some love.
+- Push to your fork on github.
+- Open a Pull Request.
+
+## Credit
+I must thank Tim Pope for inspiration. The initial concept was created by him
+named <a href="https://gist.github.com/tpope/287147">cucumbertables.vim</a>.
+
+Also a shout out to godlygeek who developed the incredible <a
+href="http://github.com/godlygeek/tabular">Tabular</a> plugin.
diff --git a/vim/bundle/vim-table-mode/Rakefile b/vim/bundle/vim-table-mode/Rakefile
new file mode 100644
index 0000000..557fee1
--- /dev/null
+++ b/vim/bundle/vim-table-mode/Rakefile
@@ -0,0 +1,13 @@
+#!/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
diff --git a/vim/bundle/vim-table-mode/VimFlavor.lock b/vim/bundle/vim-table-mode/VimFlavor.lock
new file mode 100644
index 0000000..d021597
--- /dev/null
+++ b/vim/bundle/vim-table-mode/VimFlavor.lock
@@ -0,0 +1 @@
+kana/vim-vspec (1.1.2)
diff --git a/vim/bundle/vim-table-mode/autoload/tablemode.vim b/vim/bundle/vim-table-mode/autoload/tablemode.vim
new file mode 100644
index 0000000..defc3dd
--- /dev/null
+++ b/vim/bundle/vim-table-mode/autoload/tablemode.vim
@@ -0,0 +1,195 @@
+" Private Functions {{{1
+function! s:SetBufferOptDefault(opt, val) "{{{2
+ if !exists('b:' . a:opt)
+ let b:{a:opt} = a:val
+ endif
+endfunction
+
+function! s:Map(map, to, mode) "{{{2
+ if !empty(a:to) && !hasmapto(a:map, a:mode)
+ for l:mode in split(a:mode, '.\zs')
+ execute l:mode . 'map <buffer>' a:to a:map
+ endfor
+ endif
+endfunction
+
+function! s:UnMap(map, mode) "{{{2
+ if !empty(maparg(a:map, a:mode))
+ for mode in split(a:mode, '.\zs')
+ execute l:mode . 'unmap <buffer>' a:map
+ endfor
+ endif
+endfunction
+
+function! s:ToggleMapping() "{{{2
+ let separator_map = g:table_mode_separator
+ " '|' is a special character, we need to map <Bar> instead
+ if g:table_mode_separator ==# '|' | let separator_map = '<Bar>' | endif
+
+ if !g:table_mode_disable_mappings
+ if tablemode#IsActive()
+ call s:Map('<Plug>(table-mode-tableize)', separator_map, 'i')
+ call s:Map('<Plug>(table-mode-motion-up)', g:table_mode_motion_up_map, 'n')
+ call s:Map('<Plug>(table-mode-motion-down)', g:table_mode_motion_down_map, 'n')
+ call s:Map('<Plug>(table-mode-motion-left)', g:table_mode_motion_left_map, 'n')
+ call s:Map('<Plug>(table-mode-motion-right)', g:table_mode_motion_right_map, 'n')
+
+ call s:Map('<Plug>(table-mode-cell-text-object-a)', g:table_mode_cell_text_object_a_map, 'ox')
+ call s:Map('<Plug>(table-mode-cell-text-object-i)', g:table_mode_cell_text_object_i_map, 'ox')
+
+ call s:Map('<Plug>(table-mode-realign)', g:table_mode_realign_map, 'n')
+ call s:Map('<Plug>(table-mode-delete-row)', g:table_mode_delete_row_map, 'n')
+ call s:Map('<Plug>(table-mode-delete-column)', g:table_mode_delete_column_map, 'n')
+ call s:Map('<Plug>(table-mode-add-formula)', g:table_mode_add_formula_map, 'n')
+ call s:Map('<Plug>(table-mode-eval-formula)', g:table_mode_eval_formula_map, 'n')
+ call s:Map('<Plug>(table-mode-echo-cell)', g:table_mode_echo_cell_map, 'n')
+ call s:Map('<Plug>(table-mode-sort)', g:table_mode_sort_map, 'n')
+ else
+ call s:UnMap(separator_map, 'i')
+ call s:UnMap(g:table_mode_motion_up_map, 'n')
+ call s:UnMap(g:table_mode_motion_down_map, 'n')
+ call s:UnMap(g:table_mode_motion_left_map, 'n')
+ call s:UnMap(g:table_mode_motion_right_map, 'n')
+
+ call s:UnMap(g:table_mode_cell_text_object_a_map, 'ox')
+ call s:UnMap(g:table_mode_cell_text_object_i_map, 'ox')
+
+ call s:UnMap(g:table_mode_realign_map, 'n')
+ call s:UnMap(g:table_mode_delete_row_map, 'n')
+ call s:UnMap(g:table_mode_delete_column_map, 'n')
+ call s:UnMap(g:table_mode_add_formula_map, 'n')
+ call s:UnMap(g:table_mode_eval_formula_map, 'n')
+ call s:UnMap(g:table_mode_echo_cell_map, 'n')
+ call s:UnMap(g:table_mode_sort_map, 'n')
+ endif
+ endif
+endfunction
+
+function! tablemode#SyntaxEnable()
+ exec 'syntax match Table'
+ \ '/' . tablemode#table#StartExpr() . '\zs|.\+|\ze' . tablemode#table#EndExpr() . '/'
+ \ 'contains=TableBorder,TableSeparator,TableColumnAlign containedin=ALL'
+ syntax match TableSeparator /|/ contained
+ syntax match TableColumnAlign /:/ contained
+ syntax match TableBorder /[\-+]\+/ contained
+
+ hi! link TableBorder Delimiter
+ hi! link TableSeparator Delimiter
+ hi! link TableColumnAlign Type
+endfunction
+
+function! s:ToggleSyntax()
+ if tablemode#IsActive()
+ call tablemode#SyntaxEnable()
+ else
+ syntax clear Table
+ syntax clear TableBorder
+ syntax clear TableSeparator
+ syntax clear TableColumnAlign
+
+ hi! link TableBorder NONE
+ hi! link TableSeparator NONE
+ hi! link TableColumnAlign NONE
+ endif
+endfunction
+
+function! s:SetActive(bool) "{{{2
+ let b:table_mode_active = a:bool
+ call s:ToggleSyntax()
+ call s:ToggleMapping()
+ if tablemode#IsActive()
+ doautocmd User TableModeEnabled
+ else
+ doautocmd User TableModeDisabled
+ endif
+endfunction
+
+function! s:ConvertDelimiterToSeparator(line, ...) "{{{2
+ let old_gdefault = &gdefault
+ set nogdefault
+
+ let delim = g:table_mode_delimiter
+ if a:0 | let delim = a:1 | endif
+ if delim ==# ','
+ silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs,\\ze[^\'\"]*[\'\"]/__COMMA__/g"
+ endif
+
+ let [cstart, cend] = [tablemode#table#GetCommentStart(), tablemode#table#GetCommentEnd()]
+ let [match_char_start, match_char_end] = ['.', '.']
+ if tablemode#utils#strlen(cend) > 0 | let match_char_end = '[^' . cend . ']' | endif
+ if tablemode#utils#strlen(cstart) > 0 | let match_char_start = '[^' . cstart . ']' | endif
+
+ silent! execute a:line . 's/' . tablemode#table#StartExpr() . '\zs\ze' . match_char_start .
+ \ '\|' . delim . '\|' . match_char_end . '\zs\ze' . tablemode#table#EndExpr() . '/' .
+ \ g:table_mode_separator . '/g'
+
+ if delim ==# ','
+ silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs__COMMA__\\ze[^\'\"]*[\'\"]/,/g"
+ endif
+
+ let &gdefault=old_gdefault
+endfunction
+
+function! s:Tableizeline(line, ...) "{{{2
+ let delim = g:table_mode_delimiter
+ if a:0 && type(a:1) == type('') && !empty(a:1) | let delim = a:1[1:-1] | endif
+ call s:ConvertDelimiterToSeparator(a:line, delim)
+endfunction
+
+" Public API {{{1
+function! tablemode#IsActive() "{{{2
+ if g:table_mode_always_active | return 1 | endif
+
+ call s:SetBufferOptDefault('table_mode_active', 0)
+ return b:table_mode_active
+endfunction
+
+function! tablemode#TableizeInsertMode() "{{{2
+ if tablemode#IsActive() && getline('.') =~# (tablemode#table#StartExpr() . g:table_mode_separator . g:table_mode_separator)
+ call tablemode#table#AddBorder('.')
+ normal! A
+ elseif tablemode#IsActive() && getline('.') =~# (tablemode#table#StartExpr() . g:table_mode_separator)
+ let column = tablemode#utils#strlen(substitute(getline('.')[0:col('.')], '[^' . g:table_mode_separator . ']', '', 'g'))
+ let position = tablemode#utils#strlen(matchstr(getline('.')[0:col('.')], '.*' . g:table_mode_separator . '\s*\zs.*'))
+ call tablemode#table#Realign('.')
+ normal! 0
+ call search(repeat('[^' . g:table_mode_separator . ']*' . g:table_mode_separator, column) . '\s\{-\}' . repeat('.', position), 'ce', line('.'))
+ endif
+endfunction
+
+function! tablemode#Enable() "{{{2
+ call s:SetActive(1)
+endfunction
+
+function! tablemode#Disable() "{{{2
+ call s:SetActive(0)
+endfunction
+
+function! tablemode#Toggle() "{{{2
+ if g:table_mode_always_active
+ return 1
+ endif
+
+ call s:SetBufferOptDefault('table_mode_active', 0)
+ call s:SetActive(!b:table_mode_active)
+endfunction
+
+function! tablemode#TableizeRange(...) range "{{{2
+ let lnum = a:firstline
+ while lnum < (a:firstline + (a:lastline - a:firstline + 1))
+ call s:Tableizeline(lnum, a:1)
+ undojoin
+ let lnum += 1
+ endwhile
+
+ call tablemode#table#Realign(lnum - 1)
+endfunction
+
+function! tablemode#TableizeByDelimiter() "{{{2
+ let delim = input('/')
+ if delim =~# "\<Esc>" || delim =~# "\<C-C>" | return | endif
+ let vm = visualmode()
+ if vm ==? 'line' || vm ==? 'V'
+ exec line("'<") . ',' . line("'>") . "call tablemode#TableizeRange('/' . delim)"
+ endif
+endfunction
diff --git a/vim/bundle/vim-table-mode/autoload/tablemode/align.vim b/vim/bundle/vim-table-mode/autoload/tablemode/align.vim
new file mode 100644
index 0000000..9e6330c
--- /dev/null
+++ b/vim/bundle/vim-table-mode/autoload/tablemode/align.vim
@@ -0,0 +1,134 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/autoload/tablemode/logger.vim b/vim/bundle/vim-table-mode/autoload/tablemode/logger.vim
new file mode 100644
index 0000000..ab3986d
--- /dev/null
+++ b/vim/bundle/vim-table-mode/autoload/tablemode/logger.vim
@@ -0,0 +1,5 @@
+function! tablemode#logger#log(message)
+ if g:table_mode_verbose
+ echom message
+ endif
+endfunction
diff --git a/vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet.vim b/vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet.vim
new file mode 100644
index 0000000..6f79d5c
--- /dev/null
+++ b/vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet.vim
@@ -0,0 +1,189 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet/cell.vim b/vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet/cell.vim
new file mode 100644
index 0000000..d1d912b
--- /dev/null
+++ b/vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet/cell.vim
@@ -0,0 +1,258 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet/formula.vim b/vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet/formula.vim
new file mode 100644
index 0000000..8271b5d
--- /dev/null
+++ b/vim/bundle/vim-table-mode/autoload/tablemode/spreadsheet/formula.vim
@@ -0,0 +1,122 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/autoload/tablemode/table.vim b/vim/bundle/vim-table-mode/autoload/tablemode/table.vim
new file mode 100644
index 0000000..82344b1
--- /dev/null
+++ b/vim/bundle/vim-table-mode/autoload/tablemode/table.vim
@@ -0,0 +1,198 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/autoload/tablemode/utils.vim b/vim/bundle/vim-table-mode/autoload/tablemode/utils.vim
new file mode 100644
index 0000000..215da6c
--- /dev/null
+++ b/vim/bundle/vim-table-mode/autoload/tablemode/utils.vim
@@ -0,0 +1,49 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/doc/table-mode.txt b/vim/bundle/vim-table-mode/doc/table-mode.txt
new file mode 100644
index 0000000..b8e2754
--- /dev/null
+++ b/vim/bundle/vim-table-mode/doc/table-mode.txt
@@ -0,0 +1,444 @@
+*table-mode.txt* Table Mode for easy table formatting
+===============================================================================
+ Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER
+ VERSION 4.6.4
+
+ Author: Dhruva Sagar <http://dhruvasagar.com/>
+ License: MIT <http://opensource.org/licenses/MIT/>
+===============================================================================
+CONTENTS *table-mode-contents*
+
+ 1. Introduction .................... |table-mode-introduction|
+ 2. Getting Started ................. |table-mode-getting-started|
+ 3. Options ......................... |table-mode-options|
+ 4. Mappings ........................ |table-mode-mappings|
+ 5. Commands ........................ |table-mode-commands|
+ 6. Contributing .................... |table-mode-contributing|
+ 7. Report Issues ................... |table-mode-report-issues|
+
+===============================================================================
+INTRODUCTION *table-mode-introduction*
+
+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 -
+https://gist.github.com/tpope/287147, which in turn utilizes the Tabular
+Plugin.
+
+===============================================================================
+GETTING STARTED *table-mode-getting-started*
+
+Create Table on the fly:
+ 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
+ away! The plugin does the rest automatically for you as you type. With
+ each additional separator you add, it aligns the table properly,
+ 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
+ using |table-mode-toggle-map| or you can also enable it permanently
+ using |table-mode-always-active| if you wish though not recommended.
+
+ Table Mode allows for creation of tables within comments, it looks at
+ the 'commentstring' setting to identify whether the current line is
+ commented.
+
+Tableize content:
+ Table Mode enables conversion of delimited text into tables. Again
+ like table creation, this is also applicable within comments.
+
+Move between cells :
+ Now you can move between cells using table mode motions
+ '<Leader>t[hjkl]' to move left | down | up | right cells respectively.
+ You can use |table-mode-map-prefix| option to define the prefix
+ 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
+ cell in the current row if one exists.
+
+Manipulation of tables:
+ Tableize provides 3 easy ways to quickly manipulate tables.
+
+ 1. Cell Text Object : A text object for table cell
+ defined by |table-mode-cell-text-object|. You can use it with an
+ operator (d,c,y) to manipulate it easily. If you delete the cell using
+ this, it will delete the table separator along with it so if you type
+ out some new stuff, you will have to re-add it, which triggers a
+ re-alignment and the table would be formatted again.
+
+ 2. Delete Column : Delete an entire table column using
+ |table-mode-delete-column-map| .
+
+ 3. Delete Row : Delete an entire table row using
+ |table-mode-delete-row-map|
+
+Table Formulas:
+ Table Mode now has support for formulas like a spreadsheet. There
+ are 2 ways of defining formulas :
+
+ You can add formulas using |:TableAddFormula| or the mapping
+ |<Leader>tfa| defined by the option
+ |table-mode-add-formula-map| from within a table 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 one will be created with the input formula
+ taking the current cell as the target cell. The formula line
+ is evaluated immediately to reflect the results.
+
+ You can directly also add / manipulate formula expressions in
+ the formula line. The formula line is a commented line right
+ after the table, beginning with 'tmf:' (table mode formula).
+ eg) '# tmf: $3=$2*$1'. You can add multiple 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
+ mapping |<Leader>tfe| defined by the option |table-mode-expr-calc-map|
+
+Formula Expressions :
+ Expressions are of the format '$target = formula'.
+
+ The target can be of 2 forms :
+
+ '$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 in it. You can use negative indice to
+ represent column relative to the last, -1 being the last.
+
+ '$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 cell. You can also use negative values to
+ refer to cells relative to the size, -1 being the last (row or
+ column).
+
+ The formula can be a simple mathematical expression involving cells
+ which are also defined by the same format as that of the target cell.
+ Apart from basic mathematical expressions, table mode also provides
+ special functions 'Sum' and 'Average'. Both these functions take a
+ range as input. A range can be of two forms :
+
+ 'n:m': This represents cells in the current column from row
+ 'n' through 'm'. If 'm' is negative it represents 'm' row
+ above the current row (of the target cell).
+
+ 'r1,c1:r2,c2': This represents cells in the table from cell
+ r1,c1 through cell r2,c2 (row, column).
+
+ Examples :
+ $2 = $1 * $1
+ $2 = $1 / $1,3
+ $1,2 = $1,1 * $1,1
+ $5,1 = Sum(1:-1)
+ $5,3 = Sum(1,2:5,2)
+
+===============================================================================
+OPTIONS *table-mode-options*
+
+Overview:
+ |table-mode-loaded| ............. Disable the plugin.
+ |table-mode-corner| ............. Set corner character.
+ |table-mode-separator| .......... Set separator character.
+ |table-mode-fillchar| ........... Set table fillchar character.
+ |table-mode-map-prefix| ......... Set prefix for table mode commands.
+ |table-mode-toggle-map| ......... Set table mode toggle mapping.
+ |table-mode-always-active| ...... Set table mode to always enabled.
+ |table-mode-delimiter| .......... Set the delimiter for Tableize.
+ |table-mode-corner-corner| ...... Set the character to be used for
+ extreme corners of the table border.
+ |table-mode-align-char|.......... Set the alignment character which
+ can be added to the table header
+ border to control alignment of that
+ column.
+ |table-mode-motion-up-map| ...... Set the table motion up mapping
+ |table-mode-motion-down-map| .... Set the table motion down mapping
+ |table-mode-motion-left-map| .... Set the table motion left mapping
+ |table-mode-motion-right-map| ... Set the table motion right mapping
+ |table-mode-cell-text-object-a-map|
+ 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*
+ Use this option to disable the plugin: >
+ let g:loaded_table_mode = 1
+<
+g:table_mode_corner *table-mode-corner*
+ Use this option to define the table corner character: >
+ let g:table_mode_corner = '+'
+<
+g:table_mode_separator *table-mode-separator*
+ Use this option to define the table column separator character: >
+ let g:table_mode_separator = '|'
+<
+ This option also defines the trigger to be used to start creating a
+ table row in insert mode.
+
+g:table_mode_fillchar *table-mode-fillchar*
+ Use this option to define the table header border fill character: >
+ let g:table_mode_fillchar = '-'
+<
+
+g:table_mode_map_prefix *table-mode-map-prefix*
+ Use this option to define the table mode mapping prefix that will be
+ prefixed for all other table mode mappings. >
+ let g:table_mode_map_prefix = '<Leader>t'
+<
+
+g:table_mode_toggle_map *table-mode-toggle-map*
+ Use this option to define the mapping for toggling the table mode: >
+ let g:table_mode_toggle_map = 'm'
+<
+ Read |table-mode-mappings-toggle| for more info.
+
+ NOTE you will need to use the |table-mode-map-prefix| before this to
+ get the desired effect.
+
+g:table_mode_always_active *table-mode-always-active*
+ Use this option to permanently enable the table mode: >
+ let g:table_mode_always_active = 0
+<
+ This will trigger table creation once you type the
+ |table-mode-separator| as long as it's the first character on
+ the line, which can be annoying. I recommend you to instead use the
+ |table-mode-mappings-toggle| or |table-mode-commands-toggle| to toggle
+ the table mode or |table-mode-commands-enable| to enable and
+ |table-mode-commands-disable| to disable mode when needed.
+
+g:table_mode_delimiter *table-mode-delimiter*
+ Use this option to define the delimiter which used by
+ |table-mode-commands-tableize| >
+ 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
+ corners of the table border. >
+ let g:table_mode_corner_corner = '|'
+<
+g:table_mode_align_char *table-mode-align-char*
+ Use this option to define the character to be used for defining
+ alignments for columns in the table header border. >
+ let g:table_mode_align_char = ':'
+<
+g:table_mode_disable_mappings *table-mode-disable-mappings*
+ Set this to true to disable all mappings. >
+ let g:table_mode_disable_mappings = 1
+<
+g:table_mode_motion_up_map *table-mode-motion-up-map*
+ Set this to configure the mapping to move up a cell vertically. >
+ let g:table_mode_motion_up_map = '{<Bar>'
+<
+g:table_mode_motion_down_map *table-mode-motion-down-map*
+ Set this to configure the mapping to move down a cell vertically. >
+ let g:table_mode_motion_down_map = '}<Bar>'
+>
+g:table_mode_motion_left_map *table-mode-motion-left-map*
+ Set this to configure the mapping to move to the left cell. >
+ let g:table_mode_motion_left_map = '[<Bar>'
+>
+g:table_mode_motion_right_map *table-mode-motion-right-map*
+ Set this to configure the mapping to move to the right cell. >
+ let g:table_mode_motion_right_map = ']<Bar>'
+>
+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
+ cell object. >
+ let g:table_mode_cell_text_object_a_map = 'a<Bar>'
+>
+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
+ cell object. >
+ let g:table_mode_cell_text_object_i_map = 'i<Bar>'
+>
+g:table_mode_realign_map *table-mode-realign-map*
+ Set this to configure the mapping for table realign. >
+ let g:table_mode_realign_map = '<Leader>tr'
+>
+g:table_mode_delete_row_map *table-mode-delete-row-map*
+ Set this to configure the mapping for deleting a table row. >
+ let g:table_mode_delete_row_map = '<Leader>tdd'
+>
+g:table_mode_delete_column_map *table-mode-delete-column-map*
+ Set this to configure the mapping for deleting a table column. >
+ let g:table_mode_delete_column_map = '<Leader>tdc'
+>
+g:table_mode_add_formula_map *table-mode-add-formula-map*
+ Set this to configure the mapping for adding a formula for a table
+ cell. >
+ let g:table_mode_add_formula_map = '<Leader>tfa'
+>
+g:table_mode_eval_formula_map *table-mode-eval-formula-map*
+ Set this to configure the mapping for evaluating the formula line. >
+ let g:table_mode_eval_formula_map = '<Leader>tfe'
+>
+g:table_mode_echo_cell_map *table-mode-echo-cell-map*
+ Set this to configure the mapping for echoing the tablemode
+ 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*
+
+ *table-mode-mappings-prefix*
+<Leader>t This is a prefix defined by the option |table-mode-map-prefix|
+ used before all other table mode commands.
+
+ *table-mode-mappings-toggle*
+<Leader>tm Toggle table mode for the current buffer. You can change this
+ using the |toggle-mode-options-toggle-map| option.
+
+ NOTE This is applicable only if |table-mode-always-active| is
+ not set.
+
+ *table-mode-mappings-trigger*
+| Trigger table creation in table mode. You can change this
+ using the |toggle-mode-options-separator| option.
+
+<Leader>tt Triggers |table-mode-commands-tableize| on the visually
+ selected content.
+
+ *table-mode-mappings-op-trigger*
+<Leader>T Triggers |table-mode-commands-tableize| on the visually
+ selected asking for user to input the delimiter.
+
+ *table-mode-mappings-realign*
+<Leader>tr Realigns table columns
+
+<Leader>t? Echo the current table cells representation for defining
+ formulas.
+
+ *table-mode-mappings-motions*
+[| Move to previous cell
+]| Move to next cell
+{| Move to the cell above
+}| Move to the cell below
+
+ *table-mode-mappings-delete-row*
+<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|
+ option.
+
+ *table-mode-mappings-delete-column*
+<Leader>tdc Delete entire table column you are within. You can preceed it
+ with a [count] to delete multiple columns to the right. You
+ can change this using |table-mode-delete-column-map| option.
+
+ *table-mode-mappings-add-formula*
+<Leader>tfa Add a fomula for the current table cell. This invokes
+ |TableAddFormula| command.
+
+ *table-mode-mappings-evaluate-formula-line*
+<Leader>tfe Evaluate the formula line which is a commented line right
+ after the table beginning with 'tmf:'. If one exists this
+ would evaluate the formula line and update the table
+ accordingly. This invokes the |TableEvalFormulaLine| command.
+
+
+ *table-mode-mappings-sort-column*
+<Leader>ts Sort a column under the cursor. This invokes |TableSort|
+
+|| Expands to a header border. You can change this by changing
+ |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*
+
+ *:TableModeToggle*
+ *table-mode-:TableModeToggle*
+:TableModeToggle
+ Toggles the table mode. Same effect as |toggle-mode-mappings-toggle|.
+
+ NOTE this is applicable only if |table-mode-always-active| is
+ not set.
+
+ *:TableModeEnable*
+ *table-mode-:TableModeEnable*
+:TableModeEnable
+ Enables Table Mode.
+
+ NOTE this is applicable only if |table-mode-always-active| is
+ not set.
+
+ *:TableModeDisable*
+ *table-mode-:TableModeDisable*
+:TableModeDisable
+ Disables Table Mode.
+
+ NOTE this is applicable only if |table-mode-always-active| is
+ not set.
+
+ *:Tableize*
+ *table-mode-:Tableize*
+:Tableize
+ This converts the current line into a table if it consists of
+ |table-mode-delimiter|. This accepts a range, without which it
+ applies on the current line.
+
+ This accepts a {pattern} similar to Tabular which defines the
+ delimiter. eg.) >
+ :Tableize/;
+<
+ The above command will Tableize using ';' as the delimiter.
+
+ NOTE this is optional, by default without the expression it will
+ tableize the content using |table-mode-delimiter| as the delimiter.
+
+ *:TableModeRealign*
+ *table-mode-:TableModeRealign*
+:TableModeRealign
+ This command triggers |table-mode-mappings-realign|
+
+ *:TableAddFormula*
+ *table-mode-:TableAddFormula*
+:TableAddFormula
+ 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
+ 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.
+
+ *:TableEvalFormulaLine*
+ *table-mode-:TableEvalFormulaLine*
+:TableEvalFormulaLine
+ This command when invoked from anywhere within the table or directly
+ 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*
+
+If you want to take a stab at it, by all means, send me a pull request on
+Github (http://github.com/dhruvasagar/table-mode) or get in touch with me
+directly via e-mail at dhruva 'dot' sagar 'at' gmail.com.
+
+===============================================================================
+REPORT ISSUES *table-mode-report-issues*
+
+If you discover any issues, please report them at
+http://github.com/dhruvasagar/table-mode/issues.
+
+ vim:tw=78:ts=8:ft=help:norl:ai:et
diff --git a/vim/bundle/vim-table-mode/plugin/table-mode.vim b/vim/bundle/vim-table-mode/plugin/table-mode.vim
new file mode 100644
index 0000000..3e78186
--- /dev/null
+++ b/vim/bundle/vim-table-mode/plugin/table-mode.vim
@@ -0,0 +1,132 @@
+" Finish if already loaded {{{1
+if exists('g:loaded_table_mode')
+ finish
+endif
+let g:loaded_table_mode = 1
+
+" Avoiding side effects {{{1
+let s:save_cpo = &cpo
+set cpo&vim
+
+function! s:SetGlobalOptDefault(opt, val) "{{{1
+ if !exists('g:' . a:opt)
+ let g:{a:opt} = a:val
+ endif
+endfunction
+
+" Set Global Defaults {{{1
+call s:SetGlobalOptDefault('table_mode_corner', '+')
+call s:SetGlobalOptDefault('table_mode_verbose', 0)
+call s:SetGlobalOptDefault('table_mode_separator', '|')
+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_toggle_map', 'm')
+call s:SetGlobalOptDefault('table_mode_always_active', 0)
+call s:SetGlobalOptDefault('table_mode_delimiter', ',')
+call s:SetGlobalOptDefault('table_mode_corner_corner', '|')
+call s:SetGlobalOptDefault('table_mode_align_char', ':')
+call s:SetGlobalOptDefault('table_mode_disable_mappings', 0)
+
+call s:SetGlobalOptDefault('table_mode_motion_up_map', '{<Bar>')
+call s:SetGlobalOptDefault('table_mode_motion_down_map', '}<Bar>')
+call s:SetGlobalOptDefault('table_mode_motion_left_map', '[<Bar>')
+call s:SetGlobalOptDefault('table_mode_motion_right_map', ']<Bar>')
+
+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
+
+augroup TableMode
+ au!
+
+ autocmd Syntax * if tablemode#IsActive() | call tablemode#SyntaxEnable() | endif
+augroup END
+
+" Define Commands & Mappings {{{1
+if !g:table_mode_always_active "{{{2
+ exec "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_toggle_map .
+ \ " <Esc>:call tablemode#Toggle()<CR>"
+ command! -nargs=0 TableModeToggle call tablemode#Toggle()
+ command! -nargs=0 TableModeEnable call tablemode#Enable()
+ command! -nargs=0 TableModeDisable call tablemode#Disable()
+else
+ let table_mode_separator_map = g:table_mode_separator
+ " '|' is a special character, we need to map <Bar> instead
+ if g:table_mode_separator ==# '|' | let table_mode_separator_map = '<Bar>' | endif
+
+ execute "inoremap <silent> " . table_mode_separator_map . ' ' .
+ \ table_mode_separator_map . "<Esc>:call tablemode#TableizeInsertMode()<CR>a"
+ unlet table_mode_separator_map
+endif
+" }}}2
+
+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
+if g:table_mode_separator ==# '|' | let separator_map = '<Bar>' | endif
+execute 'inoremap <silent> <Plug>(table-mode-tableize)' separator_map . '<Esc>:call tablemode#TableizeInsertMode()<CR>a'
+
+nnoremap <silent> <Plug>(table-mode-tableize) :Tableize<CR>
+xnoremap <silent> <Plug>(table-mode-tableize) :Tableize<CR>
+xnoremap <silent> <Plug>(table-mode-tableize-delimiter) :<C-U>call tablemode#TableizeByDelimiter()<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
+let &cpo = s:save_cpo
+
+" ModeLine {{{
+" vim: sw=2 sts=2 fdl=0 fdm=marker
diff --git a/vim/bundle/vim-table-mode/t/align.vim b/vim/bundle/vim-table-mode/t/align.vim
new file mode 100644
index 0000000..930504d
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/align.vim
@@ -0,0 +1,20 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/t/cell.vim b/vim/bundle/vim-table-mode/t/cell.vim
new file mode 100644
index 0000000..e3d03ed
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/cell.vim
@@ -0,0 +1,135 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/t/config/options.vim b/vim/bundle/vim-table-mode/t/config/options.vim
new file mode 100644
index 0000000..99b5098
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/config/options.vim
@@ -0,0 +1,27 @@
+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'
diff --git a/vim/bundle/vim-table-mode/t/fixtures/align/simple_after.txt b/vim/bundle/vim-table-mode/t/fixtures/align/simple_after.txt
new file mode 100644
index 0000000..ed96f07
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/align/simple_after.txt
@@ -0,0 +1,2 @@
+| This | is a | table |
+| This | is also | a table |
diff --git a/vim/bundle/vim-table-mode/t/fixtures/align/simple_before.txt b/vim/bundle/vim-table-mode/t/fixtures/align/simple_before.txt
new file mode 100644
index 0000000..b483ea5
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/align/simple_before.txt
@@ -0,0 +1,2 @@
+|This|is a|table|
+|This|is also|a table|
diff --git a/vim/bundle/vim-table-mode/t/fixtures/align/unicode_after.txt b/vim/bundle/vim-table-mode/t/fixtures/align/unicode_after.txt
new file mode 100644
index 0000000..8778914
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/align/unicode_after.txt
@@ -0,0 +1,2 @@
+| This | is 測試 | table |
+| This | is also | a table |
diff --git a/vim/bundle/vim-table-mode/t/fixtures/align/unicode_before.txt b/vim/bundle/vim-table-mode/t/fixtures/align/unicode_before.txt
new file mode 100644
index 0000000..3edd654
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/align/unicode_before.txt
@@ -0,0 +1,2 @@
+| This | is 測試 | table |
+| This | is also | a table |
diff --git a/vim/bundle/vim-table-mode/t/fixtures/cell/sample.txt b/vim/bundle/vim-table-mode/t/fixtures/cell/sample.txt
new file mode 100644
index 0000000..9e670d5
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/cell/sample.txt
@@ -0,0 +1,2 @@
+| 1 | 2 |
+| 3 | 4 |
diff --git a/vim/bundle/vim-table-mode/t/fixtures/formula/formula.txt b/vim/bundle/vim-table-mode/t/fixtures/formula/formula.txt
new file mode 100644
index 0000000..ab2df91
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/formula/formula.txt
@@ -0,0 +1,7 @@
+| Item | Cost |
+|----------+-------|
+| Bread | 20 |
+| Tomatoes | 5 |
+| Pasta | 100 |
+| Total | 0 |
+/* tmf: $4,2=Sum(1:-1) */
diff --git a/vim/bundle/vim-table-mode/t/fixtures/formula/sample.txt b/vim/bundle/vim-table-mode/t/fixtures/formula/sample.txt
new file mode 100644
index 0000000..2920bbc
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/formula/sample.txt
@@ -0,0 +1,7 @@
+| Item | Cost |
+|----------+------|
+| Bread | 20 |
+| Tomatoes | 5 |
+| Pasta | 100 |
+| Total | |
+| Test | |
diff --git a/vim/bundle/vim-table-mode/t/fixtures/sample.txt b/vim/bundle/vim-table-mode/t/fixtures/sample.txt
new file mode 100644
index 0000000..e447226
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/sample.txt
@@ -0,0 +1,4 @@
+
+| test11 | test12 |
+| test21 | test22 |
+
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample.txt
new file mode 100644
index 0000000..e447226
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample.txt
@@ -0,0 +1,4 @@
+
+| test11 | test12 |
+| test21 | test22 |
+
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_for_header.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_for_header.txt
new file mode 100644
index 0000000..75f8f25
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_for_header.txt
@@ -0,0 +1,3 @@
+| test11 | test12 |
+
+| test21 | test22 |
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_for_header_unicode.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_for_header_unicode.txt
new file mode 100644
index 0000000..7b4e02a
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_for_header_unicode.txt
@@ -0,0 +1,9 @@
+
+| abc | 测试长度 | 长测试 |
+
+| 长 | 测试测试测试测试 | 测试测试 |
+
+| 测试测试 | 测试 | 测试测测试 |
+
+| 测试测试测试 | 测试测试 | 测试 |
+
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_after.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_after.txt
new file mode 100644
index 0000000..e4362a1
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_after.txt
@@ -0,0 +1,4 @@
+| S. No | Title | Message |
+|-------+:------+:-------:|
+| 1 | t1 | msg1 |
+| 2 | t2 | msg2 |
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_before.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_before.txt
new file mode 100644
index 0000000..1f65bfd
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_before.txt
@@ -0,0 +1,4 @@
+|S. No|Title|Message|
+|-----+:----+:-----:|
+|1|t1|msg1|
+|2|t2|msg2|
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_unicode_after.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_unicode_after.txt
new file mode 100644
index 0000000..4c70b01
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_unicode_after.txt
@@ -0,0 +1,8 @@
+|--------------+------------------+------------|
+| 测试测试 | 测试长度 | 长测试 |
+|--------------+:----------------:+-----------:|
+| abc | 测试长度 | 长测试 |
+| 长 | 测试测试测试测试 | 测试测试 |
+| 测试测试 | 测试 | 测试测测试 |
+| 测试测试测试 | 测试测试 | 测试 |
+|--------------+------------------+------------|
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_unicode_before.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_unicode_before.txt
new file mode 100644
index 0000000..67bf1db
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_header_realign_unicode_before.txt
@@ -0,0 +1,8 @@
+|--------+--------+------|
+|测试测试|测试长度|长测试|
+|--------+:------:+-----:|
+|abc|测试长度|长测试|
+|长|测试测试测试测试|测试测试|
+|测试测试|测试|测试测测试|
+|测试测试测试|测试测试|测试|
+|------------+--------+----|
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_after.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_after.txt
new file mode 100644
index 0000000..e7fd9e1
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_after.txt
@@ -0,0 +1,2 @@
+| test11 | test12 |
+| test21 | test22 |
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_before.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_before.txt
new file mode 100644
index 0000000..d1b3499
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_before.txt
@@ -0,0 +1,2 @@
+|test11|test12|
+|test21|test22|
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_unicode_after.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_unicode_after.txt
new file mode 100644
index 0000000..b479b24
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_unicode_after.txt
@@ -0,0 +1,4 @@
+| abc | 测试长度 | 长测试 |
+| 长 | 测试测试测试测试 | 测试测试 |
+| 测试测试 | 测试 | 测试测测试 |
+| 测试测试测试 | 测试测试 | 测试 |
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_unicode_before.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_unicode_before.txt
new file mode 100644
index 0000000..8c3124f
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_realign_unicode_before.txt
@@ -0,0 +1,4 @@
+|abc|测试长度|长测试|
+|长|测试测试测试测试|测试测试|
+|测试测试|测试|测试测测试|
+|测试测试测试|测试测试|测试|
diff --git a/vim/bundle/vim-table-mode/t/fixtures/table/sample_with_header.txt b/vim/bundle/vim-table-mode/t/fixtures/table/sample_with_header.txt
new file mode 100644
index 0000000..9213e7f
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/table/sample_with_header.txt
@@ -0,0 +1,7 @@
+|--------+---------|
+| Title | Message |
+|--------+---------|
+| test11 | test12 |
+| test21 | test22 |
+|--------+---------|
+
diff --git a/vim/bundle/vim-table-mode/t/fixtures/tableize.txt b/vim/bundle/vim-table-mode/t/fixtures/tableize.txt
new file mode 100644
index 0000000..ee1cc7a
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/fixtures/tableize.txt
@@ -0,0 +1,4 @@
+
+asd,asd;asd,asd
+asd,asd;asd,asd
+
diff --git a/vim/bundle/vim-table-mode/t/formula.vim b/vim/bundle/vim-table-mode/t/formula.vim
new file mode 100644
index 0000000..a052392
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/formula.vim
@@ -0,0 +1,39 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/t/spreadsheet.vim b/vim/bundle/vim-table-mode/t/spreadsheet.vim
new file mode 100644
index 0000000..093475c
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/spreadsheet.vim
@@ -0,0 +1,105 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/t/table.vim b/vim/bundle/vim-table-mode/t/table.vim
new file mode 100644
index 0000000..516467c
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/table.vim
@@ -0,0 +1,184 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/t/tablemode.vim b/vim/bundle/vim-table-mode/t/tablemode.vim
new file mode 100644
index 0000000..132c4bb
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/tablemode.vim
@@ -0,0 +1,56 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/t/utils.vim b/vim/bundle/vim-table-mode/t/utils.vim
new file mode 100644
index 0000000..3bfff19
--- /dev/null
+++ b/vim/bundle/vim-table-mode/t/utils.vim
@@ -0,0 +1,45 @@
+" 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
diff --git a/vim/bundle/vim-table-mode/youtube.png b/vim/bundle/vim-table-mode/youtube.png
new file mode 100644
index 0000000..6654fd9
--- /dev/null
+++ b/vim/bundle/vim-table-mode/youtube.png
Binary files differ