Compare commits

...

10 Commits
v3.0 ... v3.2.1

Author SHA1 Message Date
Dhruva Sagar
6dfc508af5 Fixed headerExpr to incorporate comments & spaces around header border 2013-09-19 13:55:07 +05:30
Dhruva Sagar
ed441f19a1 Added travis status to README 2013-09-19 13:26:42 +05:30
Dhruva Sagar
e4525c465a Fixed travis.yml file, issue with tabs 2013-09-19 13:24:20 +05:30
Dhruva Sagar
19bfa092a3 Updating CHANGELOG 2013-09-19 13:23:19 +05:30
Dhruva Sagar
f91ec2458f Updated README & CHANGELOG 2013-09-19 12:33:28 +05:30
Dhruva Sagar
0799523ffb Releasing v3.2
* Added tests to test various use cases
* Added .travis.yml for travis integration
2013-09-19 12:28:47 +05:30
Dhruva Sagar
9875a117a7 Fixed iabbrev 2013-09-19 07:04:12 +05:30
Dhruva Sagar
cca55e72ce Releasing Table Mode v3.1
* Removed table border and related options. You can now optionally have
  a header instead, simply add a table header and add a border to it
  triggered by the vim iabbrev '+-' on the line immidiately after the
  header and it will expand to the correct border. It will auto update
  as the table realigns with changes. Similar approach as followed by
  tables in org-mode.
* Fixed bug of incorrect indentation of a newly added formula line.
* Fixed bug in ConvertDelimiterToSeparator causing incorrect
  tableization of commented blocks of delimited content.
2013-09-19 02:10:49 +05:30
Dhruva Sagar
eed25aee91 Removed unnecessary closing markers for folds 2013-06-10 09:56:54 +05:30
Dhruva Sagar
0683cec58c Added more error checks in GetCells 2013-05-22 07:36:53 +05:30
12 changed files with 332 additions and 161 deletions

1
.gitignore vendored
View File

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

4
.travis.yml Normal file
View File

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

View File

@@ -1,4 +1,16 @@
# Change Log # Change Log
## Version 3.2
* Added tests to test various use cases using <a
href='https://github.com/kana/vim-vspec'>Vspec</a>..
* Added travis integration for automated tests.
## Version 3.1
* Removed borders. You can now optionally create a table header by simply
adding a header border immidiately after the header line by using the
iabbrev trigger '+-'. Just type that on the line immidiately after the
header and press space / \<CR\> to complete the header border.
* Some Bug Fixes
## Version 3.0 ## Version 3.0
* Removed dependence on Tabular and added code borrowed from Tabular for * Removed dependence on Tabular and added code borrowed from Tabular for
aligning the table rows. aligning the table rows.

4
Gemfile Normal file
View File

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

18
Gemfile.lock Normal file
View File

@@ -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.2)
parslet (~> 1.0)
thor (~> 0.14)
PLATFORMS
ruby
DEPENDENCIES
rake
vim-flavor (~> 1.1)

View File

@@ -1,4 +1,4 @@
# VIM Table Mode # VIM Table Mode [![Build Status](https://travis-ci.org/dhruvasagar/soulmate_rails.png?branch=master)](https://travis-ci.org/dhruvasagar/soulmate_rails)
An awesome automatic table creator & formatter allowing one to create neat An awesome automatic table creator & formatter allowing one to create neat
tables as you type. tables as you type.
@@ -11,17 +11,21 @@ CHANGELOG.md </a>
## Getting Started ## Getting Started
### Installation ### Installation
There are 2 ways to do this There are several ways to do this
1. I recommend installing <a 1. I recommend installing <a
href="https://github.com/tpope/vim-pathogen">pathogen.vim</a> and then href="https://github.com/Shougo/neobundle.vim">NeoBundle</a> and then just
adding a git submodule for your plugin: 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 ```sh
$ cd ~/.vim $ cd ~/.vim
$ git submodule add git@github.com:dhruvasagar/vim-table-mode.git bundle/table-mode $ git submodule add git@github.com:dhruvasagar/vim-table-mode.git bundle/table-mode
``` ```
2. Copy autoload/todomode.vim, plugin/todo-mode.vim, doc/todo-mode.txt to 3. Copy autoload/todomode.vim, plugin/todo-mode.vim, doc/todo-mode.txt to
respective ~/.vim/autoload/, ~/.vim/plugin and ~/.vim/doc under UNIX or respective ~/.vim/autoload/, ~/.vim/plugin and ~/.vim/doc under UNIX or
vimfiles/autoload/, vimfiles/plugin/ and vimfiles/doc under WINDOWS and vimfiles/autoload/, vimfiles/plugin/ and vimfiles/doc under WINDOWS and
restart VIM restart VIM

13
Rakefile Normal file
View File

@@ -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

1
VimFlavor.lock Normal file
View File

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

View File

@@ -1,10 +1,10 @@
" ============================== Header ==================================={{{ " ============================== Header ======================================
" File: autoload/tablemode.vim " File: autoload/tablemode.vim
" Description: Table mode for vim for creating neat tables. " Description: Table mode for vim for creating neat tables.
" Author: Dhruva Sagar <http://dhruvasagar.com/> " Author: Dhruva Sagar <http://dhruvasagar.com/>
" License: MIT (http://www.opensource.org/licenses/MIT) " License: MIT (http://www.opensource.org/licenses/MIT)
" Website: http://github.com/dhruvasagar/vim-table-mode " Website: http://github.com/dhruvasagar/vim-table-mode
" Version: 3.0 " Version: 3.2
" Note: This plugin was heavily inspired by the 'CucumberTables.vim' " Note: This plugin was heavily inspired by the 'CucumberTables.vim'
" (https://gist.github.com/tpope/287147) plugin by Tim Pope and " (https://gist.github.com/tpope/287147) plugin by Tim Pope and
" uses a small amount of code from it. " uses a small amount of code from it.
@@ -17,7 +17,7 @@
" of any kind, either expressed or implied. In no event will " of any kind, either expressed or implied. In no event will
" the copyright holder be liable for any damamges resulting " the copyright holder be liable for any damamges resulting
" from the use of this software. " from the use of this software.
" ==========================================================================}}} " =============================================================================
" Private Functions {{{1 " Private Functions {{{1
@@ -25,30 +25,25 @@ if exists('g:autoloaded_table_mode') "{{{2
finish finish
endif endif
let g:autoloaded_table_mode = 1 let g:autoloaded_table_mode = 1
" }}}2
function! s:throw(string) abort "{{{2 function! s:throw(string) abort "{{{2
let v:errmsg = 'table-mode: ' . a:string let v:errmsg = 'table-mode: ' . a:string
throw v:errmsg throw v:errmsg
endfunction endfunction
" }}}2
function! s:sub(str,pat,rep) abort "{{{2 function! s:sub(str,pat,rep) abort "{{{2
return substitute(a:str,'\v\C'.a:pat,a:rep,'') return substitute(a:str,'\v\C'.a:pat,a:rep,'')
endfunction endfunction
" }}}2
function! s:gsub(str,pat,rep) abort "{{{2 function! s:gsub(str,pat,rep) abort "{{{2
return substitute(a:str,'\v\C'.a:pat,a:rep,'g') return substitute(a:str,'\v\C'.a:pat,a:rep,'g')
endfunction endfunction
" }}}2
function! s:SetBufferOptDefault(opt, val) "{{{2 function! s:SetBufferOptDefault(opt, val) "{{{2
if !exists('b:' . a:opt) if !exists('b:' . a:opt)
let b:{a:opt} = a:val let b:{a:opt} = a:val
endif endif
endfunction endfunction
" }}}2
function! s:Line(line) "{{{2 function! s:Line(line) "{{{2
if type(a:line) == type('') if type(a:line) == type('')
@@ -57,19 +52,16 @@ function! s:Line(line) "{{{2
return a:line return a:line
endif endif
endfunction endfunction
" }}}2
" function! s:Strlen(text) - Count multibyte characters accurately {{{2 " function! s:Strlen(text) - Count multibyte characters accurately {{{2
" See :h strlen() for more details " See :h strlen() for more details
function! s:Strlen(text) function! s:Strlen(text)
return strlen(substitute(a:text, '.', 'x', 'g')) return strlen(substitute(a:text, '.', 'x', 'g'))
endfunction endfunction
" }}}2
function! s:Strip(string) "{{{2 function! s:Strip(string) "{{{2
return matchstr(a:string, '^\s*\zs.\{-}\ze\s*$') return matchstr(a:string, '^\s*\zs.\{-}\ze\s*$')
endfunction endfunction
" }}}2
function! s:Sum(list) "{{{2 function! s:Sum(list) "{{{2
let result = 0.0 let result = 0.0
@@ -84,12 +76,10 @@ function! s:Sum(list) "{{{2
endfor endfor
return result return result
endfunction endfunction
" }}}2
function! s:Average(list) "{{{2 function! s:Average(list) "{{{2
return s:Sum(a:list)/len(a:list) return s:Sum(a:list)/len(a:list)
endfunction endfunction
" }}}2
function! s:GetCommentStart() "{{{2 function! s:GetCommentStart() "{{{2
let cstring = &commentstring let cstring = &commentstring
@@ -99,7 +89,6 @@ function! s:GetCommentStart() "{{{2
return '' return ''
endif endif
endfunction endfunction
" }}}2
function! s:GetCommentEnd() "{{{2 function! s:GetCommentEnd() "{{{2
let cstring = &commentstring let cstring = &commentstring
@@ -114,7 +103,6 @@ function! s:GetCommentEnd() "{{{2
return '' return ''
endif endif
endfunction endfunction
" }}}2
function! s:StartExpr() "{{{2 function! s:StartExpr() "{{{2
let cstart = s:GetCommentStart() let cstart = s:GetCommentStart()
@@ -124,7 +112,7 @@ function! s:StartExpr() "{{{2
return '^\s*' return '^\s*'
endif endif
endfunction endfunction
" }}}2
function! s:EndExpr() "{{{2 function! s:EndExpr() "{{{2
let cend = s:GetCommentEnd() let cend = s:GetCommentEnd()
@@ -134,7 +122,10 @@ function! s:EndExpr() "{{{2
return '\s*$' return '\s*$'
endif endif
endfunction endfunction
" }}}2
function! s:HeaderBorderExpr() "{{{2
return s:StartExpr() . g:table_mode_corner . '[' . g:table_mode_fillchar . g:table_mode_corner . ']*' . g:table_mode_corner . s:EndExpr()
endfunction
function! s:StartCommentExpr() "{{{2 function! s:StartCommentExpr() "{{{2
let cstartexpr = s:GetCommentStart() let cstartexpr = s:GetCommentStart()
@@ -144,7 +135,6 @@ function! s:StartCommentExpr() "{{{2
return '' return ''
endif endif
endfunction endfunction
" }}}2
function! s:EndCommentExpr() "{{{2 function! s:EndCommentExpr() "{{{2
let cendexpr = s:GetCommentEnd() let cendexpr = s:GetCommentEnd()
@@ -154,7 +144,6 @@ function! s:EndCommentExpr() "{{{2
return '' return ''
endif endif
endfunction endfunction
" }}}2
function! s:IsTableModeActive() "{{{2 function! s:IsTableModeActive() "{{{2
if g:table_mode_always_active | return 1 | endif if g:table_mode_always_active | return 1 | endif
@@ -162,12 +151,11 @@ function! s:IsTableModeActive() "{{{2
call s:SetBufferOptDefault('table_mode_active', 0) call s:SetBufferOptDefault('table_mode_active', 0)
return b:table_mode_active return b:table_mode_active
endfunction endfunction
" }}}2
function! s:RowGap() "{{{2 function! s:RowGap() "{{{2
return g:table_mode_border ? 2 : 1 " Getting rid of borders, so the row gap is now just 1
return 1
endfunction endfunction
" }}}2
function! s:ToggleMapping() "{{{2 function! s:ToggleMapping() "{{{2
if exists('b:table_mode_active') && b:table_mode_active if exists('b:table_mode_active') && b:table_mode_active
@@ -177,64 +165,41 @@ function! s:ToggleMapping() "{{{2
execute "inoremap <silent> <buffer> " . b:table_mode_separator_map . ' ' . execute "inoremap <silent> <buffer> " . b:table_mode_separator_map . ' ' .
\ b:table_mode_separator_map . "<Esc>:call tablemode#TableizeInsertMode()<CR>a" \ b:table_mode_separator_map . "<Esc>:call tablemode#TableizeInsertMode()<CR>a"
execute "inoreabbrev <silent> <buffer> " . g:table_mode_corner .
\ g:table_mode_fillchar . " <Esc>:call tablemode#AddHeaderBorder('.')<CR>A"
else else
execute "iunmap <silent> <buffer> " . b:table_mode_separator_map execute "iunmap <silent> <buffer> " . b:table_mode_separator_map
execute "iunabbrev <silent> <buffer> " . g:table_mode_corner . g:table_mode_fillchar
endif endif
endfunction endfunction
" }}}2
function! s:SetActive(bool) "{{{2 function! s:SetActive(bool) "{{{2
let b:table_mode_active = a:bool let b:table_mode_active = a:bool
call s:ToggleMapping() call s:ToggleMapping()
endfunction endfunction
" }}}2
function! s:GenerateBorder(line) "{{{2 function! s:GenerateHeaderBorder(line) "{{{2
let line_val = getline(a:line)
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')
let border = substitute(border, '[^' . g:table_mode_corner . ']', g:table_mode_fillchar, 'g')
let cstartexpr = s:StartCommentExpr()
if s:Strlen(cstartexpr) > 0 && getline(a:line) =~# cstartexpr
let sce = matchstr(line_val, s:StartCommentExpr())
let ece = matchstr(line_val, s:EndCommentExpr())
return sce . border . ece
elseif getline(a:line) =~# s:StartExpr()
let indent = matchstr(line_val, s:StartExpr())
return indent . border
else
return border
endif
endfunction
" }}}2
function! s:UpdateLineBorder(line) "{{{2
let line = s:Line(a:line) let line = s:Line(a:line)
if tablemode#IsATableRow(line - s:RowGap())
let line_val = getline(line - s:RowGap())
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')
let border = substitute(border, '[^' . g:table_mode_corner . ']', g:table_mode_fillchar, 'g')
let hf = s:StartExpr() . g:table_mode_corner . '[' . g:table_mode_corner . let cstartexpr = s:StartCommentExpr()
\ g:table_mode_fillchar . ']*' . g:table_mode_corner . '\?' . s:EndExpr() if s:Strlen(cstartexpr) > 0 && getline(line) =~# cstartexpr
let sce = matchstr(line_val, s:StartCommentExpr())
let rowgap = s:RowGap() let ece = matchstr(line_val, s:EndCommentExpr())
let border = s:GenerateBorder(line) return sce . border . ece
elseif getline(line) =~# s:StartExpr()
let [prev_line, next_line] = [getline(line-1), getline(line+1)] let indent = matchstr(line_val, s:StartExpr())
if next_line =~# hf return indent . border
if s:Strlen(border) > s:Strlen(s:GenerateBorder(line + rowgap)) || !tablemode#IsATableRow(line + rowgap) else
call setline(line+1, border) return border
endif endif
else
call append(line, border)
endif
if prev_line =~# hf
if s:Strlen(border) > s:Strlen(s:GenerateBorder(line - rowgap)) || !tablemode#IsATableRow(line - rowgap)
call setline(line-1, border)
endif
else
call append(line-1, border)
endif endif
endfunction endfunction
" }}}2
function! s:ConvertDelimiterToSeparator(line, ...) "{{{2 function! s:ConvertDelimiterToSeparator(line, ...) "{{{2
let delim = g:table_mode_delimiter let delim = g:table_mode_delimiter
@@ -242,31 +207,34 @@ function! s:ConvertDelimiterToSeparator(line, ...) "{{{2
if delim ==# ',' if delim ==# ','
silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs,\\ze[^\'\"]*[\'\"]/__COMMA__/g" silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs,\\ze[^\'\"]*[\'\"]/__COMMA__/g"
endif endif
silent! execute a:line . 's/' . s:StartExpr() . '\zs\ze.\|' . delim . '\|.\zs\ze' . s:EndExpr() . '/' .
let [cstart, cend] = [s:GetCommentStart(), s:GetCommentEnd()]
let [match_char_start, match_char_end] = ['.', '.']
if s:Strlen(cend) > 0 | let match_char_end = '[^' . cend . ']' | endif
if s:Strlen(cstart) > 0 | let match_char_start = '[^' . cstart . ']' | endif
silent! execute a:line . 's/' . s:StartExpr() . '\zs\ze' . match_char_start .
\ '\|' . delim . '\|' . match_char_end . '\zs\ze' . s:EndExpr() . '/' .
\ g:table_mode_separator . '/g' \ g:table_mode_separator . '/g'
if delim ==# ',' if delim ==# ','
silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs__COMMA__\\ze[^\'\"]*[\'\"]/,/g" silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs__COMMA__\\ze[^\'\"]*[\'\"]/,/g"
endif endif
endfunction endfunction
" }}}2
function! s:Tableizeline(line, ...) "{{{2 function! s:Tableizeline(line, ...) "{{{2
let delim = g:table_mode_delimiter let delim = g:table_mode_delimiter
if a:0 && type(a:1) == type('') && !empty(a:1) | let delim = a:1[1:-1] | endif if a:0 && type(a:1) == type('') && !empty(a:1) | let delim = a:1[1:-1] | endif
call s:ConvertDelimiterToSeparator(a:line, delim) call s:ConvertDelimiterToSeparator(a:line, delim)
if g:table_mode_border | call s:UpdateLineBorder(a:line) | endif
endfunction endfunction
" }}}2
function! s:IsFirstCell() "{{{2 function! s:IsFirstCell() "{{{2
return tablemode#ColumnNr('.') ==# 1 return tablemode#ColumnNr('.') ==# 1
endfunction endfunction
" }}}2
function! s:IsLastCell() "{{{2 function! s:IsLastCell() "{{{2
return tablemode#ColumnNr('.') ==# tablemode#ColumnCount('.') return tablemode#ColumnNr('.') ==# tablemode#ColumnCount('.')
endfunction endfunction
" }}}2
function! s:GetFirstRow(line) "{{{2 function! s:GetFirstRow(line) "{{{2
if tablemode#IsATableRow(a:line) if tablemode#IsATableRow(a:line)
@@ -279,14 +247,12 @@ function! s:GetFirstRow(line) "{{{2
return line return line
endif endif
endfunction endfunction
" }}}2
function! s:MoveToFirstRow() "{{{2 function! s:MoveToFirstRow() "{{{2
if tablemode#IsATableRow('.') if tablemode#IsATableRow('.')
call cursor(s:GetFirstRow('.'), col('.')) call cursor(s:GetFirstRow('.'), col('.'))
endif endif
endfunction endfunction
" }}}2
function! s:GetLastRow(line) "{{{2 function! s:GetLastRow(line) "{{{2
if tablemode#IsATableRow(a:line) if tablemode#IsATableRow(a:line)
@@ -299,14 +265,12 @@ function! s:GetLastRow(line) "{{{2
return line return line
endif endif
endfunction endfunction
" }}}2
function! s:MoveToLastRow() "{{{2 function! s:MoveToLastRow() "{{{2
if tablemode#IsATableRow('.') if tablemode#IsATableRow('.')
call cursor(s:GetLastRow('.'), col('.')) call cursor(s:GetLastRow('.'), col('.'))
endif endif
endfunction endfunction
" }}}2
function! s:MoveToStartOfCell() "{{{2 function! s:MoveToStartOfCell() "{{{2
if getline('.')[col('.')-1] ==# g:table_mode_separator && !s:IsLastCell() if getline('.')[col('.')-1] ==# g:table_mode_separator && !s:IsLastCell()
@@ -315,7 +279,6 @@ function! s:MoveToStartOfCell() "{{{2
execute 'normal! F' . g:table_mode_separator . '2l' execute 'normal! F' . g:table_mode_separator . '2l'
endif endif
endfunction endfunction
" }}}2
" function! s:GetCells() - Function to get values of cells in a table {{{2 " function! s:GetCells() - Function to get values of cells in a table {{{2
" s:GetCells(row) - Get values of all cells in a row as a List. " s:GetCells(row) - Get values of all cells in a row as a List.
@@ -338,7 +301,7 @@ function! s:GetCells(line, ...) abort
let line = s:GetFirstRow(line) let line = s:GetFirstRow(line)
while tablemode#IsATableRow(line) while tablemode#IsATableRow(line)
let row_line = getline(line)[stridx(getline(line), g:table_mode_separator):strridx(getline(line), g:table_mode_separator)] let row_line = getline(line)[stridx(getline(line), g:table_mode_separator):strridx(getline(line), g:table_mode_separator)]
call add(values, s:Strip(split(row_line, g:table_mode_separator)[colm>0?colm-1:colm])) call add(values, s:Strip(get(split(row_line, g:table_mode_separator), colm>0?colm-1:colm, '')))
let line = line + s:RowGap() let line = line + s:RowGap()
endwhile endwhile
return values return values
@@ -353,12 +316,12 @@ function! s:GetCells(line, ...) abort
if colm == 0 if colm == 0
return map(split(row_line, g:table_mode_separator), 's:Strip(v:val)') return map(split(row_line, g:table_mode_separator), 's:Strip(v:val)')
else else
return s:Strip(split(row_line, g:table_mode_separator)[colm>0?colm-1:colm]) let split_line = split(row_line, g:table_mode_separator)
return s:Strip(get(split(row_line, g:table_mode_separator), colm>0?colm-1:colm, ''))
endif endif
endif endif
endif endif
endfunction endfunction
" }}}2
function! s:GetCell(...) "{{{2 function! s:GetCell(...) "{{{2
if a:0 == 0 if a:0 == 0
@@ -369,7 +332,6 @@ function! s:GetCell(...) "{{{2
return s:GetCells('.', row, col) return s:GetCells('.', row, col)
endfunction endfunction
" }}}2
function! s:SetCell(val, ...) abort "{{{2 function! s:SetCell(val, ...) abort "{{{2
if a:0 == 0 if a:0 == 0
@@ -385,6 +347,7 @@ function! s:SetCell(val, ...) abort "{{{2
let line_val = getline(line) let line_val = getline(line)
let cstartexpr = s:StartCommentExpr() let cstartexpr = s:StartCommentExpr()
let values = split(getline(line)[stridx(line_val, g:table_mode_separator):strridx(line_val, g:table_mode_separator)], g:table_mode_separator) 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 values[colm-1] = a:val
let line_value = g:table_mode_separator . join(values, g:table_mode_separator) . g:table_mode_separator let line_value = g:table_mode_separator . join(values, g:table_mode_separator) . g:table_mode_separator
if s:Strlen(cstartexpr) > 0 && line_val =~# cstartexpr if s:Strlen(cstartexpr) > 0 && line_val =~# cstartexpr
@@ -396,33 +359,28 @@ function! s:SetCell(val, ...) abort "{{{2
call tablemode#TableRealign(line) call tablemode#TableRealign(line)
endif endif
endfunction endfunction
" }}}2
function! s:GetRow(row, ...) abort "{{{2 function! s:GetRow(row, ...) abort "{{{2
let line = a:0 < 1 ? '.' : a:1 let line = a:0 < 1 ? '.' : a:1
return s:GetCells(line, a:row) return s:GetCells(line, a:row)
endfunction endfunction
" }}}2
function! s:GetRowColumn(col, ...) abort "{{{2 function! s:GetRowColumn(col, ...) abort "{{{2
let line = a:0 < 1 ? '.' : a:1 let line = a:0 < 1 ? '.' : a:1
let row = tablemode#RowNr('.') let row = tablemode#RowNr('.')
return s:GetCells(line, row, a:col) return s:GetCells(line, row, a:col)
endfunction endfunction
" }}}2
function! s:GetColumn(col, ...) abort "{{{2 function! s:GetColumn(col, ...) abort "{{{2
let line = a:0 < 1 ? '.' : a:1 let line = a:0 < 1 ? '.' : a:1
return s:GetCells(line, 0, a:col) return s:GetCells(line, 0, a:col)
endfunction endfunction
" }}}2
function! s:GetColumnRow(row, ...) abort "{{{2 function! s:GetColumnRow(row, ...) abort "{{{2
let line = a:0 < 1 ? '.' : a:1 let line = a:0 < 1 ? '.' : a:1
let col = tablemode#ColumnNr('.') let col = tablemode#ColumnNr('.')
return s:GetCells(line, a:row, col) return s:GetCells(line, a:row, col)
endfunction endfunction
" }}}2
function! s:ParseRange(range, ...) "{{{2 function! s:ParseRange(range, ...) "{{{2
if a:0 < 1 if a:0 < 1
@@ -454,7 +412,6 @@ function! s:ParseRange(range, ...) "{{{2
return [row1, col1, row2, col2] return [row1, col1, row2, col2]
endfunction endfunction
" }}}2
" function! s:GetCellRange(range, ...) {{{2 " function! s:GetCellRange(range, ...) {{{2
" range: A string representing range of cells. " range: A string representing range of cells.
@@ -498,7 +455,6 @@ function! s:GetCellRange(range, ...) abort
return values return values
endfunction endfunction
" }}}2
" Borrowed from Tabular : {{{2 " Borrowed from Tabular : {{{2
@@ -507,7 +463,6 @@ endfunction
function! s:StripTrailingSpaces(string) function! s:StripTrailingSpaces(string)
return matchstr(a:string, '^.\{-}\ze\s*$') return matchstr(a:string, '^.\{-}\ze\s*$')
endfunction endfunction
" }}}3
function! s:Padding(string, length, where) "{{{3 function! s:Padding(string, length, where) "{{{3
let gap_length = a:length - s:Strlen(a:string) let gap_length = a:length - s:Strlen(a:string)
@@ -521,7 +476,6 @@ function! s:Padding(string, length, where) "{{{3
return repeat(" ", left) . a:string . repeat(" ", right) return repeat(" ", left) . a:string . repeat(" ", right)
endif endif
endfunction endfunction
" }}}3
" function! s:Split() - Split a string into fields and delimiters {{{3 " function! s:Split() - Split a string into fields and delimiters {{{3
" Like split(), but include the delimiters as elements " Like split(), but include the delimiters as elements
@@ -565,7 +519,6 @@ function! s:Split(string, delim)
return rv return rv
endfunction endfunction
" }}}3
function! s:Align(lines) "{{{3 function! s:Align(lines) "{{{3
let lines = map(a:lines, 's:Split(v:val, g:table_mode_separator)') let lines = map(a:lines, 's:Split(v:val, g:table_mode_separator)')
@@ -614,23 +567,27 @@ function! s:Align(lines) "{{{3
return lines return lines
endfunction endfunction
" }}}3
" }}}2
" }}}1
" Public API {{{1 " Public API {{{1
function! tablemode#sid() "{{{2
return maparg('<SID>', 'n')
endfunction
nnoremap <SID> <SID>
function! tablemode#scope() "{{{2
return s:
endfunction
function! tablemode#GetLastRow(line) "{{{2 function! tablemode#GetLastRow(line) "{{{2
return s:GetLastRow(a:line) return s:GetLastRow(a:line)
endfunction endfunction
" }}}2
function! tablemode#GetFirstRow(line) "{{{2 function! tablemode#GetFirstRow(line) "{{{2
return s:GetFirstRow(a:line) return s:GetFirstRow(a:line)
endfunction endfunction
" }}}2
function! tablemode#TableizeInsertMode() "{{{2 function! tablemode#TableizeInsertMode() "{{{2
if s:IsTableModeActive() && getline('.') =~# (s:StartExpr() . g:table_mode_separator) if s:IsTableModeActive() && getline('.') =~# (s:StartExpr() . g:table_mode_separator)
@@ -641,17 +598,14 @@ function! tablemode#TableizeInsertMode() "{{{2
call search(repeat('[^' . g:table_mode_separator . ']*' . g:table_mode_separator, column) . '\s\{-\}' . repeat('.', position), 'ce', line('.')) call search(repeat('[^' . g:table_mode_separator . ']*' . g:table_mode_separator, column) . '\s\{-\}' . repeat('.', position), 'ce', line('.'))
endif endif
endfunction endfunction
" }}}2
function! tablemode#TableModeEnable() "{{{2 function! tablemode#TableModeEnable() "{{{2
call s:SetActive(1) call s:SetActive(1)
endfunction endfunction
" }}}2
function! tablemode#TableModeDisable() "{{{2 function! tablemode#TableModeDisable() "{{{2
call s:SetActive(0) call s:SetActive(0)
endfunction endfunction
" }}}2
function! tablemode#TableModeToggle() "{{{2 function! tablemode#TableModeToggle() "{{{2
if g:table_mode_always_active if g:table_mode_always_active
@@ -661,25 +615,17 @@ function! tablemode#TableModeToggle() "{{{2
call s:SetBufferOptDefault('table_mode_active', 0) call s:SetBufferOptDefault('table_mode_active', 0)
call s:SetActive(!b:table_mode_active) call s:SetActive(!b:table_mode_active)
endfunction endfunction
" }}}2
function! tablemode#TableizeRange(...) range "{{{2 function! tablemode#TableizeRange(...) range "{{{2
let shift = 1 let lnum = a:firstline
if g:table_mode_border | let shift += 1 | endif while lnum < (a:firstline + (a:lastline - a:firstline + 1)*s:RowGap())
call s:Tableizeline(a:firstline, a:1)
undojoin
" The first one causes 2 extra lines for top & bottom border while the
" following lines cause only 1 for the bottom border.
let lnum = a:firstline + shift + (g:table_mode_border > 0)
while lnum < (a:firstline + (a:lastline - a:firstline + 1)*shift)
call s:Tableizeline(lnum, a:1) call s:Tableizeline(lnum, a:1)
undojoin undojoin
let lnum = lnum + shift let lnum = lnum + s:RowGap()
endwhile endwhile
if g:table_mode_border | call tablemode#TableRealign(lnum - shift) | endif call tablemode#TableRealign(lnum - s:RowGap())
endfunction endfunction
" }}}2
function! tablemode#TableizeByDelimiter() "{{{2 function! tablemode#TableizeByDelimiter() "{{{2
let delim = input('/') let delim = input('/')
@@ -689,20 +635,39 @@ function! tablemode#TableizeByDelimiter() "{{{2
exec line("'<") . ',' . line("'>") . "call tablemode#TableizeRange('/' . delim)" exec line("'<") . ',' . line("'>") . "call tablemode#TableizeRange('/' . delim)"
endif endif
endfunction endfunction
" }}}2
function! tablemode#AddHeaderBorder(line) "{{{2
call setline(a:line, s:GenerateHeaderBorder(a:line))
endfunction
function! tablemode#TableRealign(line) "{{{2 function! tablemode#TableRealign(line) "{{{2
let line = s:Line(a:line) let line = s:Line(a:line)
let [lnums, lines] = [[], []] let [lnums, lines] = [[], []]
let tline = line let [bline, tline] = [0, line]
while tablemode#IsATableRow(tline) while tablemode#IsATableRow(tline)
call insert(lnums, tline) call insert(lnums, tline)
call insert(lines, getline(tline)) call insert(lines, getline(tline))
let tline = tline - s:RowGap() let tline = tline - s:RowGap()
endwhile endwhile
" If we reached header walking upwards
if getline(tline) =~# s:HeaderBorderExpr() && tablemode#IsATableRow(tline - s:RowGap())
let bline = tline
let tline = tline - s:RowGap()
" Insert the header line
call insert(lnums, tline)
call insert(lines, getline(tline))
endif
let tline = line + s:RowGap() let tline = line + s:RowGap()
" If we start at header
if !bline && getline(tline) =~# s:HeaderBorderExpr()
let bline = tline
let tline = tline + s:RowGap()
endif
while tablemode#IsATableRow(tline) while tablemode#IsATableRow(tline)
call add(lnums, tline) call add(lnums, tline)
call add(lines, getline(tline)) call add(lines, getline(tline))
@@ -714,16 +679,28 @@ function! tablemode#TableRealign(line) "{{{2
for lnum in lnums for lnum in lnums
let index = index(lnums, lnum) let index = index(lnums, lnum)
call setline(lnum, lines[index]) call setline(lnum, lines[index])
undojoin
call s:UpdateLineBorder(lnum)
endfor endfor
if bline
call tablemode#AddHeaderBorder(bline)
endif
endfunction endfunction
" }}}2
function! tablemode#IsATableRow(line) "{{{2 function! tablemode#IsATableRow(line) "{{{2
return getline(a:line) =~# (s:StartExpr() . g:table_mode_separator) return getline(a:line) =~# (s:StartExpr() . g:table_mode_separator)
endfunction endfunction
" }}}2
function! tablemode#LineNr(row) "{{{2
if tablemode#IsATableRow('.')
let line = s:Line('.')
let row = tablemode#RowNr('.')
if a:row != row
let line += a:row - row
endif
return line
endif
endfunction
function! tablemode#RowCount(line) "{{{2 function! tablemode#RowCount(line) "{{{2
let line = s:Line(a:line) let line = s:Line(a:line)
@@ -742,7 +719,6 @@ function! tablemode#RowCount(line) "{{{2
return totalRowCount return totalRowCount
endfunction endfunction
" }}}2
function! tablemode#RowNr(line) "{{{2 function! tablemode#RowNr(line) "{{{2
let line = s:Line(a:line) let line = s:Line(a:line)
@@ -755,14 +731,12 @@ function! tablemode#RowNr(line) "{{{2
return rowNr return rowNr
endfunction endfunction
" }}}2
function! tablemode#ColumnCount(line) "{{{2 function! tablemode#ColumnCount(line) "{{{2
let line = s:Line(a:line) let line = s:Line(a:line)
return s:Strlen(substitute(getline(line), '[^' . g:table_mode_separator . ']', '', 'g'))-1 return s:Strlen(substitute(getline(line), '[^' . g:table_mode_separator . ']', '', 'g'))-1
endfunction endfunction
" }}}2
function! tablemode#ColumnNr(pos) "{{{2 function! tablemode#ColumnNr(pos) "{{{2
let pos = [] let pos = []
@@ -776,7 +750,6 @@ function! tablemode#ColumnNr(pos) "{{{2
let row_start = stridx(getline(pos[0]), g:table_mode_separator) let row_start = stridx(getline(pos[0]), g:table_mode_separator)
return s:Strlen(substitute(getline(pos[0])[(row_start):pos[1]-2], '[^' . g:table_mode_separator . ']', '', 'g')) return s:Strlen(substitute(getline(pos[0])[(row_start):pos[1]-2], '[^' . g:table_mode_separator . ']', '', 'g'))
endfunction endfunction
" }}}2
function! tablemode#TableMotion(direction) "{{{2 function! tablemode#TableMotion(direction) "{{{2
if tablemode#IsATableRow('.') if tablemode#IsATableRow('.')
@@ -813,7 +786,6 @@ function! tablemode#TableMotion(direction) "{{{2
endif endif
endif endif
endfunction endfunction
" }}}2
function! tablemode#CellTextObject() "{{{2 function! tablemode#CellTextObject() "{{{2
if tablemode#IsATableRow('.') if tablemode#IsATableRow('.')
@@ -827,7 +799,6 @@ function! tablemode#CellTextObject() "{{{2
endif endif
endif endif
endfunction endfunction
" }}}2
function! tablemode#DeleteColumn() "{{{2 function! tablemode#DeleteColumn() "{{{2
if tablemode#IsATableRow('.') if tablemode#IsATableRow('.')
@@ -842,7 +813,6 @@ function! tablemode#DeleteColumn() "{{{2
call tablemode#TableRealign('.') call tablemode#TableRealign('.')
endif endif
endfunction endfunction
" }}}2
function! tablemode#DeleteRow() "{{{2 function! tablemode#DeleteRow() "{{{2
if tablemode#IsATableRow('.') if tablemode#IsATableRow('.')
@@ -863,47 +833,43 @@ function! tablemode#DeleteRow() "{{{2
call tablemode#TableRealign('.') call tablemode#TableRealign('.')
endif endif
endfunction endfunction
" }}}2
function! tablemode#GetCells(...) abort "{{{2 function! tablemode#GetCells(...) abort "{{{2
let args = copy(a:000) let args = copy(a:000)
call insert(args, '.') call insert(args, '.')
return call('s:GetCells', args) return call('s:GetCells', args)
endfunction endfunction
" }}}2
function! tablemode#SetCell(val, ...) "{{{2 function! tablemode#SetCell(val, ...) "{{{2
let args = copy(a:000) let args = copy(a:000)
call insert(args, a:val) call insert(args, a:val)
call call('s:SetCell', args) call call('s:SetCell', args)
endfunction endfunction
" }}}2
function! tablemode#GetCellRange(range, ...) abort "{{{2 function! tablemode#GetCellRange(range, ...) abort "{{{2
let args = copy(a:000) let args = copy(a:000)
call insert(args, a:range) call insert(args, a:range)
return call('s:GetCellRange', args) return call('s:GetCellRange', args)
endfunction endfunction
" }}}2
function! tablemode#Sum(range, ...) abort "{{{2 function! tablemode#Sum(range, ...) abort "{{{2
let args = copy(a:000) let args = copy(a:000)
call insert(args, a:range) call insert(args, a:range)
return s:Sum(call('s:GetCellRange', args)) return s:Sum(call('s:GetCellRange', args))
endfunction endfunction
" }}}2
function! tablemode#Average(range, ...) abort "{{{2 function! tablemode#Average(range, ...) abort "{{{2
let args = copy(a:000) let args = copy(a:000)
call insert(args, a:range) call insert(args, a:range)
return s:Average(call('s:GetCellRange', args)) return s:Average(call('s:GetCellRange', args))
endfunction endfunction
" }}}2
function! tablemode#AddFormula() "{{{2 function! tablemode#AddFormula() "{{{2
let fr = input('f=') let fr = input('f=')
let row = tablemode#RowNr('.') let row = tablemode#RowNr('.')
let colm = tablemode#ColumnNr('.') let colm = tablemode#ColumnNr('.')
let indent = indent('.')
let indent_str = repeat(' ', indent)
if fr !=# '' if fr !=# ''
let fr = '$' . row . ',' . colm . '=' . fr let fr = '$' . row . ',' . colm . '=' . fr
@@ -927,14 +893,13 @@ function! tablemode#AddFormula() "{{{2
let [cmss, cmse] = [cms[0], ''] let [cmss, cmse] = [cms[0], '']
endif endif
endif endif
let fr = cmss . ' tmf: ' . fr . ' ' . cmse let fr = indent_str . cmss . ' tmf: ' . fr . ' ' . cmse
call append(fline-1, fr) call append(fline-1, fr)
call cursor(cursor_pos) call cursor(cursor_pos)
endif endif
call tablemode#EvaluateFormulaLine() call tablemode#EvaluateFormulaLine()
endif endif
endfunction endfunction
" }}}2
function! tablemode#EvaluateExpr(expr, line) abort "{{{2 function! tablemode#EvaluateExpr(expr, line) abort "{{{2
let line = s:Line(a:line) let line = s:Line(a:line)
@@ -980,9 +945,8 @@ function! tablemode#EvaluateExpr(expr, line) abort "{{{2
endwhile endwhile
endif endif
endfunction endfunction
" }}}2
function! tablemode#EvaluateFormulaLine() "{{{2 function! tablemode#EvaluateFormulaLine() abort "{{{2
let exprs = [] let exprs = []
let cstring = &commentstring let cstring = &commentstring
let matchexpr = '' let matchexpr = ''
@@ -1012,8 +976,5 @@ function! tablemode#EvaluateFormulaLine() "{{{2
call tablemode#EvaluateExpr(expr, line) call tablemode#EvaluateExpr(expr, line)
endfor endfor
endfunction endfunction
" }}}2
" }}}1
" vim: sw=2 sts=2 fdl=0 fdm=marker " vim: sw=2 sts=2 fdl=0 fdm=marker

View File

@@ -1,7 +1,7 @@
*table-mode.txt* Table Mode for easy table formatting. v3.0 *table-mode.txt* Table Mode for easy table formatting. v3.2
=============================================================================== ===============================================================================
Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER
VERSION 3.0 VERSION 3.2
Author: Dhruva Sagar <http://dhruvasagar.com/> Author: Dhruva Sagar <http://dhruvasagar.com/>
License: MIT <http://opensource.org/licenses/MIT/> License: MIT <http://opensource.org/licenses/MIT/>
@@ -36,7 +36,7 @@ Create Table on the fly:
The table mode is disabled by default and you can enter table mode The table mode is disabled by default and you can enter table mode
using |table-mode-toggle-map| or you can also enable it permanently using |table-mode-toggle-map| or you can also enable it permanently
using |table-mode-always-active| if you wish. using |table-mode-always-active| if you wish though not recommended.
Table Mode allows for creation of tables within comments, it looks at Table Mode allows for creation of tables within comments, it looks at
the 'commentstring' setting to identify whether the current line is the 'commentstring' setting to identify whether the current line is
@@ -130,7 +130,6 @@ OPTIONS *table-mode-options*
Overview: Overview:
|table-mode-loaded| ............. Disable the plugin. |table-mode-loaded| ............. Disable the plugin.
|table-mode-border| ............. Enable border.
|table-mode-corner| ............. Set corner character. |table-mode-corner| ............. Set corner character.
|table-mode-separator| .......... Set separator character. |table-mode-separator| .......... Set separator character.
|table-mode-fillchar| ........... Set table fillchar character. |table-mode-fillchar| ........... Set table fillchar character.
@@ -154,12 +153,6 @@ g:loaded_table_mode *table-mode-loaded*
Use this option to disable the plugin: > Use this option to disable the plugin: >
let g:loaded_table_mode = 1 let g:loaded_table_mode = 1
< <
g:table_mode_border *table-mode-border*
Use this option to enable / disable table border: >
let g:table_mode_border = 1
<
g:table_mode_corner *table-mode-corner* g:table_mode_corner *table-mode-corner*
Use this option to define the table corner character: > Use this option to define the table corner character: >
let g:table_mode_corner = '+' let g:table_mode_corner = '+'
@@ -172,7 +165,7 @@ g:table_mode_separator *table-mode-separator*
table row in insert mode. table row in insert mode.
g:table_mode_fillchar *table-mode-fillchar* g:table_mode_fillchar *table-mode-fillchar*
Use this option to define the table border fill character: > Use this option to define the table header border fill character: >
let g:table_mode_fillchar = '-' let g:table_mode_fillchar = '-'
< <
@@ -330,6 +323,12 @@ MAPPINGS *table-mode-mappings*
would evaluate the formula line and update the table would evaluate the formula line and update the table
accordingly. This invokes the |TableEvalFormulaLine| command. accordingly. This invokes the |TableEvalFormulaLine| command.
+- Expands to a header border, the line immidiately above this
will be considered as the table header. You can change this by
changing |table-mode-corner| and |table-mode-fillchar|
options. This is an iabbrev so is triggered when you press
space or <CR> after typing the mapping.
=============================================================================== ===============================================================================
COMMANDS *table-mode-commands* COMMANDS *table-mode-commands*

View File

@@ -4,7 +4,7 @@
" Author: Dhruva Sagar <http://dhruvasagar.com/> " Author: Dhruva Sagar <http://dhruvasagar.com/>
" License: MIT (http://www.opensource.org/licenses/MIT) " License: MIT (http://www.opensource.org/licenses/MIT)
" Website: http://github.com/dhruvasagar/vim-table-mode " Website: http://github.com/dhruvasagar/vim-table-mode
" Version: 2.4.0 " Version: 3.2
" Note: This plugin was heavily inspired by the 'CucumberTables.vim' " Note: This plugin was heavily inspired by the 'CucumberTables.vim'
" (https://gist.github.com/tpope/287147) plugin by Tim Pope and " (https://gist.github.com/tpope/287147) plugin by Tim Pope and
" uses a small amount of code from it. " uses a small amount of code from it.
@@ -24,22 +24,18 @@ if exists('g:loaded_table_mode')
finish finish
endif endif
let g:loaded_table_mode = 1 let g:loaded_table_mode = 1
"}}}1
" Avoiding side effects {{{1 " Avoiding side effects {{{1
let s:save_cpo = &cpo let s:save_cpo = &cpo
set cpo&vim set cpo&vim
" }}}1
function! s:SetGlobalOptDefault(opt, val) "{{{1 function! s:SetGlobalOptDefault(opt, val) "{{{1
if !exists('g:' . a:opt) if !exists('g:' . a:opt)
let g:{a:opt} = a:val let g:{a:opt} = a:val
endif endif
endfunction endfunction
" }}}1
" Set Global Defaults {{{1 " Set Global Defaults {{{1
call s:SetGlobalOptDefault('table_mode_border', 1)
call s:SetGlobalOptDefault('table_mode_corner', '+') call s:SetGlobalOptDefault('table_mode_corner', '+')
call s:SetGlobalOptDefault('table_mode_separator', '|') call s:SetGlobalOptDefault('table_mode_separator', '|')
call s:SetGlobalOptDefault('table_mode_fillchar', '-') call s:SetGlobalOptDefault('table_mode_fillchar', '-')
@@ -55,7 +51,6 @@ call s:SetGlobalOptDefault('table_mode_delete_row_map', 'dd')
call s:SetGlobalOptDefault('table_mode_delete_column_map', 'dc') call s:SetGlobalOptDefault('table_mode_delete_column_map', 'dc')
call s:SetGlobalOptDefault('table_mode_add_formula_map', 'fa') call s:SetGlobalOptDefault('table_mode_add_formula_map', 'fa')
call s:SetGlobalOptDefault('table_mode_eval_expr_map', 'fe') call s:SetGlobalOptDefault('table_mode_eval_expr_map', 'fe')
"}}}1
function! s:TableMotion() "{{{1 function! s:TableMotion() "{{{1
let direction = nr2char(getchar()) let direction = nr2char(getchar())
@@ -63,7 +58,6 @@ function! s:TableMotion() "{{{1
call tablemode#TableMotion(direction) call tablemode#TableMotion(direction)
endfor endfor
endfunction endfunction
" }}}1
" Define Commands & Mappings {{{1 " Define Commands & Mappings {{{1
if !g:table_mode_always_active "{{{2 if !g:table_mode_always_active "{{{2
@@ -108,11 +102,9 @@ execute "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_add_formul
\ " :TableAddFormula<CR>" \ " :TableAddFormula<CR>"
execute "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_eval_expr_map . execute "nnoremap <silent> " . g:table_mode_map_prefix . g:table_mode_eval_expr_map .
\ " :TableEvalFormulaLine<CR>" \ " :TableEvalFormulaLine<CR>"
"}}}1
" Avoiding side effects {{{1 " Avoiding side effects {{{1
let &cpo = s:save_cpo let &cpo = s:save_cpo
" }}}1
" ModeLine {{{ " ModeLine {{{
" vim: sw=2 sts=2 fdl=0 fdm=marker " vim: sw=2 sts=2 fdl=0 fdm=marker

162
t/tablemode.vim Normal file
View File

@@ -0,0 +1,162 @@
let g:table_mode_corner = '+'
let g:table_mode_separator = '|'
let g:table_mode_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_tableize_map = 't'
let g:table_mode_tableize_op_map = '<Leader>T'
let g:table_mode_realign_map = 'r'
let g:table_mode_cell_text_object = 'tc'
let g:table_mode_delete_row_map = 'dd'
let g:table_mode_delete_column_map = 'dc'
let g:table_mode_add_formula_map = 'fa'
let g:table_mode_eval_expr_map = 'fe'
call vspec#hint({'scope': 'tablemode#scope()', 'sid': 'tablemode#sid()'})
describe 'tablemode'
describe 'Activation'
describe 'tablemode#TableModeEnable()'
before
call tablemode#TableModeEnable()
end
it 'should enable table mode'
Expect b:table_mode_active to_be_true
end
end
describe 'tablemode#TableModeDisable()'
before
call tablemode#TableModeDisable()
end
it 'should disable table mode'
Expect b:table_mode_active to_be_false
end
end
describe 'tablemode#TableModeToggle()'
it 'should toggle table mode'
call tablemode#TableModeToggle()
Expect b:table_mode_active to_be_true
call tablemode#TableModeToggle()
Expect b:table_mode_active to_be_false
end
end
end
describe 'API'
before
normal! ggdG
call tablemode#TableModeEnable()
normal! i
|test11|test12|
|test21|test22|
end
it 'should return true when inside a table'
Expect tablemode#IsATableRow(2) to_be_true
end
it 'should return false when outside a table'
Expect tablemode#IsATableRow(4) to_be_false
end
it 'should return the row count'
Expect tablemode#RowCount(2) == 2
Expect tablemode#RowCount(3) == 2
end
it 'should return the row number'
Expect tablemode#RowNr(2) == 1
Expect tablemode#RowNr(3) == 2
end
it 'should return the column count'
Expect tablemode#ColumnCount(2) == 2
Expect tablemode#ColumnCount(3) == 2
end
it 'should return the line number of the first row'
Expect tablemode#GetFirstRow(2) == 2
Expect tablemode#GetFirstRow(3) == 2
end
it 'should return the line nuber of the last row'
Expect tablemode#GetLastRow(2) == 3
Expect tablemode#GetLastRow(3) == 3
end
it 'should return the cells'
Expect Call('s:GetCells', 2, 1, 1) ==# 'test11'
" Get Rows
Expect Call('s:GetCells', 2, 1) == ['test11', 'test12']
Expect Call('s:GetCells', 2, 2) == ['test21', 'test22']
" Get Columns
Expect Call('s:GetCells', 2, 0, 1) == ['test11', 'test21']
Expect Call('s:GetCells', 2, 0, 2) == ['test12', 'test22']
end
it 'should return the cells in a range'
" Entire table as range
Expect Call('s:GetCellRange', '1,1:2,2', 2, 1) == [['test11', 'test21'], ['test12', 'test22']]
" Get Rows given different seed lines and columns
Expect Call('s:GetCellRange', '1,1:1,2', 2, 1) == ['test11', 'test12']
Expect Call('s:GetCellRange', '1,1:1,2', 2, 2) == ['test11', 'test12']
Expect Call('s:GetCellRange', '1,1:1,2', 3, 1) == ['test11', 'test12']
Expect Call('s:GetCellRange', '1,1:1,2', 3, 2) == ['test11', 'test12']
Expect Call('s:GetCellRange', '2,1:2,2', 2, 1) == ['test21', 'test22']
Expect Call('s:GetCellRange', '2,1:2,2', 2, 2) == ['test21', 'test22']
Expect Call('s:GetCellRange', '2,1:2,2', 3, 1) == ['test21', 'test22']
Expect Call('s:GetCellRange', '2,1:2,2', 3, 2) == ['test21', 'test22']
" Get Columns given different seed lines and column
Expect Call('s:GetCellRange', '1:2', 2, 1) == ['test11', 'test21']
Expect Call('s:GetCellRange', '1:2', 2, 2) == ['test12', 'test22']
Expect Call('s:GetCellRange', '1:2', 3, 1) == ['test11', 'test21']
Expect Call('s: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 Call('s:GetCellRange', '1:-1', 2, 1) == ['test11']
Expect Call('s:GetCellRange', '1:-1', 3, 1) == ['test11']
Expect Call('s:GetCellRange', '1:-1', 2, 2) == ['test12']
Expect Call('s:GetCellRange', '1:-1', 3, 2) == ['test12']
end
end
describe 'Tableize'
before
normal! ggdG
normal! i
asd,asd;asd,asd
asd,asd;asd,asd
end
it 'should tableize with default delimiter'
:2,3call tablemode#TableizeRange('')
Expect tablemode#IsATableRow(2) to_be_true
Expect tablemode#RowCount(2) == 2
Expect tablemode#ColumnCount(2) == 3
end
it 'should tableize with given delimiter'
:2,3call tablemode#TableizeRange('/;')
Expect tablemode#IsATableRow(2) to_be_true
Expect tablemode#RowCount(2) == 2
Expect tablemode#ColumnCount(2) == 2
end
end
describe 'Motions'
it 'should work'
TODO
end
end
describe 'Manipulations'
it 'should work'