diff options
author | Karel Kočí <cynerd@email.cz> | 2016-06-30 16:03:25 +0200 |
---|---|---|
committer | Karel Kočí <cynerd@email.cz> | 2016-06-30 16:03:25 +0200 |
commit | e573b3020c032400eed60b649a2cbf55266e6bb0 (patch) | |
tree | 8f572394ac8433529c7a8e70d160a2fbe8268b4e /vim/bundle/vim-table-mode | |
parent | b8c667bd64b3edd38d56c63c5bd1db53a23b4499 (diff) | |
download | myconfigs-e573b3020c032400eed60b649a2cbf55266e6bb0.tar.gz myconfigs-e573b3020c032400eed60b649a2cbf55266e6bb0.tar.bz2 myconfigs-e573b3020c032400eed60b649a2cbf55266e6bb0.zip |
Add current configurations from old repository
Diffstat (limited to 'vim/bundle/vim-table-mode')
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 Binary files differnew file mode 100644 index 0000000..6654fd9 --- /dev/null +++ b/vim/bundle/vim-table-mode/youtube.png |