mirror of
https://github.com/dhruvasagar/vim-table-mode.git
synced 2025-11-08 11:03:47 -05:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c91a4efa2 | ||
|
|
8d9a0082f5 | ||
|
|
0f1254e1fe | ||
|
|
e7e806916f | ||
|
|
9336261063 | ||
|
|
a5ae0253be | ||
|
|
80ec86e385 | ||
|
|
7eff1e30f1 | ||
|
|
7258a56d20 | ||
|
|
8d3c4912a2 | ||
|
|
13e1a20002 | ||
|
|
d73236f964 | ||
|
|
c5efbe1ad7 | ||
|
|
8970d5ffbb | ||
|
|
859eb42856 | ||
|
|
d7ad97f099 | ||
|
|
dbd79f2c1e | ||
|
|
fa568fe91b | ||
|
|
53da3fb4c2 | ||
|
|
6007953f0e |
@@ -1,4 +1,4 @@
|
||||
language: ruby
|
||||
rvm:
|
||||
- 1.9.3
|
||||
- 2.1
|
||||
script: rake ci
|
||||
|
||||
16
CHANGELOG.md
16
CHANGELOG.md
@@ -1,4 +1,16 @@
|
||||
# Change Log
|
||||
|
||||
## 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,
|
||||
@@ -103,3 +115,7 @@
|
||||
|
||||
## Version 1.0 :
|
||||
* First stable release, create tables as you type.
|
||||
|
||||
<!--
|
||||
vim: ft=markdown
|
||||
-->
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# VIM Table Mode v4.4.0 [](https://travis-ci.org/dhruvasagar/vim-table-mode)
|
||||
# VIM Table Mode v4.5.0 [](https://travis-ci.org/dhruvasagar/vim-table-mode)
|
||||
|
||||
An awesome automatic table creator & formatter allowing one to create neat
|
||||
tables as you type.
|
||||
@@ -151,7 +151,7 @@ $ git submodule add git@github.com:dhruvasagar/vim-table-mode.git bundle/table-m
|
||||
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`
|
||||
- `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).
|
||||
|
||||
|
||||
@@ -32,21 +32,90 @@ function! s:SetBufferOptDefault(opt, val) "{{{2
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:ToggleMapping() "{{{2
|
||||
if exists('b:table_mode_active') && b:table_mode_active
|
||||
call s:SetBufferOptDefault('table_mode_separator_map', g:table_mode_separator)
|
||||
" '|' is a special character, we need to map <Bar> instead
|
||||
if g:table_mode_separator ==# '|' | let b:table_mode_separator_map = '<Bar>' | endif
|
||||
function! s:Map(map, to, mode)
|
||||
if !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
|
||||
|
||||
execute "inoremap <silent> <buffer> " . b:table_mode_separator_map . ' ' .
|
||||
\ b:table_mode_separator_map . "<Esc>:call tablemode#TableizeInsertMode()<CR>a"
|
||||
function! s:UnMap(map, mode)
|
||||
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 tablemode#IsActive()
|
||||
call s:Map('<Plug>(table-mode-tableize)', separator_map, 'i')
|
||||
call s:Map('<Plug>(table-mode-motion-up)', '{<Bar>', 'n')
|
||||
call s:Map('<Plug>(table-mode-motion-down)', '}<Bar>', 'n')
|
||||
call s:Map('<Plug>(table-mode-motion-left)', '[<Bar>', 'n')
|
||||
call s:Map('<Plug>(table-mode-motion-right)', ']<Bar>', 'n')
|
||||
|
||||
call s:Map('<Plug>(table-mode-cell-text-object-a)', 'a<Bar>', 'ox')
|
||||
call s:Map('<Plug>(table-mode-cell-text-object-i)', 'i<Bar>', 'ox')
|
||||
|
||||
call s:Map('<Plug>(table-mode-realign)', '<Leader>tr', 'n')
|
||||
call s:Map('<Plug>(table-mode-delete-row)', '<Leader>tdd', 'n')
|
||||
call s:Map('<Plug>(table-mode-delete-column)', '<Leader>tdc', 'n')
|
||||
call s:Map('<Plug>(table-mode-add-formula)', '<Leader>tfa', 'n')
|
||||
call s:Map('<Plug>(table-mode-eval-formula)', '<Leader>tfe', 'n')
|
||||
call s:Map('<Plug>(table-mode-echo-cell)', '<Leader>t?', 'n')
|
||||
else
|
||||
silent! execute "iunmap <silent> <buffer> " . b:table_mode_separator_map
|
||||
call s:UnMap(separator_map, 'i')
|
||||
call s:UnMap('{<Bar>', 'n')
|
||||
call s:UnMap('}<Bar>', 'n')
|
||||
call s:UnMap('[<Bar>', 'n')
|
||||
call s:UnMap(']<Bar>', 'n')
|
||||
call s:UnMap('a<Bar>', 'o')
|
||||
call s:UnMap('i<Bar>', 'o')
|
||||
call s:UnMap('<Leader>tdd', 'n')
|
||||
call s:UnMap('<Leader>tdc', 'n')
|
||||
call s:UnMap('<Leader>tfa', 'n')
|
||||
call s:UnMap('<Leader>tfe', 'n')
|
||||
call s:UnMap('<Leader>t?', 'n')
|
||||
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()
|
||||
endfunction
|
||||
|
||||
@@ -101,7 +170,7 @@ endfunction
|
||||
|
||||
function! tablemode#TableizeInsertMode() "{{{2
|
||||
if tablemode#IsActive() && getline('.') =~# (tablemode#table#StartExpr() . g:table_mode_separator . g:table_mode_separator)
|
||||
call tablemode#table#AddHeaderBorder('.')
|
||||
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'))
|
||||
|
||||
@@ -19,32 +19,6 @@
|
||||
|
||||
" Borrowed from Tabular
|
||||
" Private Functions {{{1
|
||||
" Return the number of bytes in a string after expanding tabs to spaces. {{{2
|
||||
" This expansion is done based on the current value of 'tabstop'
|
||||
if exists('*strdisplaywidth')
|
||||
" Needs vim 7.3
|
||||
let s:Strlen = function("strdisplaywidth")
|
||||
else
|
||||
function! s:Strlen(string)
|
||||
" 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
|
||||
endfunction
|
||||
endif
|
||||
" function! s:StripTrailingSpaces(string) - Remove all trailing spaces {{{2
|
||||
" from a string.
|
||||
function! s:StripTrailingSpaces(string)
|
||||
@@ -52,7 +26,7 @@ function! s:StripTrailingSpaces(string)
|
||||
endfunction
|
||||
|
||||
function! s:Padding(string, length, where) "{{{3
|
||||
let gap_length = a:length - s:Strlen(a:string)
|
||||
let gap_length = a:length - tablemode#utils#StrDisplayWidth(a:string)
|
||||
if a:where =~# 'l'
|
||||
return a:string . repeat(" ", gap_length)
|
||||
elseif a:where =~# 'r'
|
||||
@@ -119,7 +93,7 @@ endfunction
|
||||
|
||||
function! tablemode#align#alignments(lnum, ncols) "{{{2
|
||||
let alignments = []
|
||||
if tablemode#table#IsHeader(a:lnum+1)
|
||||
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
|
||||
@@ -132,6 +106,7 @@ function! tablemode#align#alignments(lnum, ncols) "{{{2
|
||||
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
|
||||
@@ -154,9 +129,9 @@ function! tablemode#align#Align(lines) "{{{2
|
||||
if len(stext) <= 1 | continue | endif
|
||||
for i in range(len(stext))
|
||||
if i == len(maxes)
|
||||
let maxes += [ s:Strlen(stext[i]) ]
|
||||
let maxes += [ tablemode#utils#StrDisplayWidth(stext[i]) ]
|
||||
else
|
||||
let maxes[i] = max([ maxes[i], s:Strlen(stext[i]) ])
|
||||
let maxes[i] = max([ maxes[i], tablemode#utils#StrDisplayWidth(stext[i]) ])
|
||||
endif
|
||||
endfor
|
||||
endfor
|
||||
|
||||
@@ -50,10 +50,10 @@ function! tablemode#spreadsheet#GetFirstRow(line) "{{{2
|
||||
if tablemode#table#IsRow(a:line)
|
||||
let line = tablemode#utils#line(a:line)
|
||||
|
||||
while tablemode#table#IsRow(line - 1) || tablemode#table#IsHeader(line - 1)
|
||||
while tablemode#table#IsRow(line - 1) || tablemode#table#IsBorder(line - 1)
|
||||
let line -= 1
|
||||
endwhile
|
||||
if tablemode#table#IsHeader(line) | let line += 1 | endif
|
||||
if tablemode#table#IsBorder(line) | let line += 1 | endif
|
||||
|
||||
return line
|
||||
endif
|
||||
@@ -69,10 +69,10 @@ function! tablemode#spreadsheet#GetLastRow(line) "{{{2
|
||||
if tablemode#table#IsRow(a:line)
|
||||
let line = tablemode#utils#line(a:line)
|
||||
|
||||
while tablemode#table#IsRow(line + 1) || tablemode#table#IsHeader(line + 1)
|
||||
while tablemode#table#IsRow(line + 1) || tablemode#table#IsBorder(line + 1)
|
||||
let line += 1
|
||||
endwhile
|
||||
if tablemode#table#IsHeader(line) | let line -= 1 | endif
|
||||
if tablemode#table#IsBorder(line) | let line -= 1 | endif
|
||||
|
||||
return line
|
||||
endif
|
||||
@@ -89,7 +89,7 @@ function! tablemode#spreadsheet#LineNr(row) "{{{2
|
||||
let line = tablemode#spreadsheet#GetFirstRow('.')
|
||||
let row_nr = 0
|
||||
|
||||
while tablemode#table#IsRow(line + 1) || tablemode#table#IsHeader(line + 1)
|
||||
while tablemode#table#IsRow(line + 1) || tablemode#table#IsBorder(line + 1)
|
||||
if tablemode#table#IsRow(line)
|
||||
let row_nr += 1
|
||||
if row ==# row_nr | break | endif
|
||||
@@ -105,7 +105,7 @@ function! tablemode#spreadsheet#RowNr(line) "{{{2
|
||||
let line = tablemode#utils#line(a:line)
|
||||
|
||||
let rowNr = 0
|
||||
while tablemode#table#IsRow(line) || tablemode#table#IsHeader(line)
|
||||
while tablemode#table#IsRow(line) || tablemode#table#IsBorder(line)
|
||||
if tablemode#table#IsRow(line) | let rowNr += 1 | endif
|
||||
let line -= 1
|
||||
endwhile
|
||||
@@ -117,13 +117,13 @@ function! tablemode#spreadsheet#RowCount(line) "{{{2
|
||||
let line = tablemode#utils#line(a:line)
|
||||
|
||||
let [tline, totalRowCount] = [line, 0]
|
||||
while tablemode#table#IsRow(tline) || tablemode#table#IsHeader(tline)
|
||||
while tablemode#table#IsRow(tline) || tablemode#table#IsBorder(tline)
|
||||
if tablemode#table#IsRow(tline) | let totalRowCount += 1 | endif
|
||||
let tline -= 1
|
||||
endwhile
|
||||
|
||||
let tline = line + 1
|
||||
while tablemode#table#IsRow(tline) || tablemode#table#IsHeader(tline)
|
||||
while tablemode#table#IsRow(tline) || tablemode#table#IsBorder(tline)
|
||||
if tablemode#table#IsRow(tline) | let totalRowCount += 1 | endif
|
||||
let tline += 1
|
||||
endwhile
|
||||
@@ -166,27 +166,27 @@ function! tablemode#spreadsheet#MoveToStartOfCell() "{{{2
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! tablemode#spreadsheet#GetLastRow(line) "{{{2
|
||||
function! tablemode#spreadsheet#GetFirstRow(line) "{{{2
|
||||
if tablemode#table#IsRow(a:line)
|
||||
let line = tablemode#utils#line(a:line)
|
||||
|
||||
while tablemode#table#IsRow(line + 1) || tablemode#table#IsHeader(line + 1)
|
||||
let line += 1
|
||||
while tablemode#table#IsRow(line - 1) || tablemode#table#IsBorder(line - 1)
|
||||
let line -= 1
|
||||
endwhile
|
||||
if tablemode#table#IsHeader(line) | let line -= 1 | endif
|
||||
if tablemode#table#IsBorder(line) | let line += 1 | endif
|
||||
|
||||
return line
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! tablemode#spreadsheet#GetFirstRow(line) "{{{2
|
||||
function! tablemode#spreadsheet#GetLastRow(line) "{{{2
|
||||
if tablemode#table#IsRow(a:line)
|
||||
let line = tablemode#utils#line(a:line)
|
||||
|
||||
while tablemode#table#IsRow(line - 1) || tablemode#table#IsHeader(line - 1)
|
||||
let line -= 1
|
||||
while tablemode#table#IsRow(line + 1) || tablemode#table#IsBorder(line + 1)
|
||||
let line += 1
|
||||
endwhile
|
||||
if tablemode#table#IsHeader(line) | let line += 1 | endif
|
||||
if tablemode#table#IsBorder(line) | let line -= 1 | endif
|
||||
|
||||
return line
|
||||
endif
|
||||
|
||||
@@ -85,7 +85,7 @@ function! tablemode#spreadsheet#cell#GetCells(line, ...) abort
|
||||
if row == 0
|
||||
let values = []
|
||||
let line = first_row
|
||||
while tablemode#table#IsRow(line) || tablemode#table#IsHeader(line)
|
||||
while tablemode#table#IsRow(line) || tablemode#table#IsBorder(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, '')))
|
||||
@@ -97,7 +97,7 @@ function! tablemode#spreadsheet#cell#GetCells(line, ...) abort
|
||||
let row_nr = 0
|
||||
let row_diff = row > 0 ? 1 : -1
|
||||
let line = row > 0 ? first_row : last_row
|
||||
while tablemode#table#IsRow(line) || tablemode#table#IsHeader(line)
|
||||
while tablemode#table#IsRow(line) || tablemode#table#IsBorder(line)
|
||||
if tablemode#table#IsRow(line)
|
||||
let row_nr += row_diff
|
||||
if row ==# row_nr | break | endif
|
||||
@@ -127,10 +127,27 @@ function! tablemode#spreadsheet#cell#GetCell(...) "{{{2
|
||||
endfunction
|
||||
|
||||
function! tablemode#spreadsheet#cell#GetRow(row, ...) abort "{{{2
|
||||
let line = a:0 < 1 ? '.' : a:1
|
||||
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('.')]
|
||||
@@ -169,23 +186,6 @@ function! tablemode#spreadsheet#cell#GetCellRange(range, ...) abort "{{{2
|
||||
return values
|
||||
endfunction
|
||||
|
||||
function! tablemode#spreadsheet#cell#GetRowColumn(col, ...) abort "{{{2
|
||||
let line = a:0 < 1 ? '.' : 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 < 1 ? '.' : a:1
|
||||
return tablemode#spreadsheet#cell#GetCells(line, 0, a:col)
|
||||
endfunction
|
||||
|
||||
function! tablemode#spreadsheet#cell#GetColumnRow(row, ...) abort "{{{2
|
||||
let line = a:0 < 1 ? '.' : a:1
|
||||
let col = tablemode#spreadsheet#ColumnNr('.')
|
||||
return tablemode#spreadsheet#cell#GetCells(line, a:row, col)
|
||||
endfunction
|
||||
|
||||
function! tablemode#spreadsheet#cell#SetCell(val, ...) "{{{2
|
||||
if a:0 == 0
|
||||
let [line, row, colm] = ['.', tablemode#spreadsheet#RowNr('.'), tablemode#spreadsheet#ColumnNr('.')]
|
||||
@@ -233,7 +233,7 @@ function! tablemode#spreadsheet#cell#Motion(direction, ...) "{{{2
|
||||
for ii in range(l:count)
|
||||
if a:direction ==# 'l'
|
||||
if tablemode#spreadsheet#IsLastCell()
|
||||
if !tablemode#table#IsRow(line('.') + 1) && (tablemode#table#IsHeader(line('.') + 1) && !tablemode#table#IsRow(line('.') + 2))
|
||||
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)
|
||||
@@ -248,7 +248,7 @@ function! tablemode#spreadsheet#cell#Motion(direction, ...) "{{{2
|
||||
endif
|
||||
elseif a:direction ==# 'h'
|
||||
if tablemode#spreadsheet#IsFirstCell()
|
||||
if !tablemode#table#IsRow(line('.') - 1) && (tablemode#table#IsHeader(line('.') - 1) && !tablemode#table#IsRow(line('.') - 2))
|
||||
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)
|
||||
@@ -265,7 +265,7 @@ function! tablemode#spreadsheet#cell#Motion(direction, ...) "{{{2
|
||||
if tablemode#table#IsRow(line('.') + 1)
|
||||
" execute 'normal! ' . 1 . 'j'
|
||||
normal! j
|
||||
elseif tablemode#table#IsHeader(line('.') + 1) && tablemode#table#IsRow(line('.') + 2)
|
||||
elseif tablemode#table#IsBorder(line('.') + 1) && tablemode#table#IsRow(line('.') + 2)
|
||||
" execute 'normal! ' . 2 . 'j'
|
||||
normal! 2j
|
||||
endif
|
||||
@@ -273,7 +273,7 @@ function! tablemode#spreadsheet#cell#Motion(direction, ...) "{{{2
|
||||
if tablemode#table#IsRow(line('.') - 1)
|
||||
" execute 'normal! ' . 1 . 'k'
|
||||
normal! k
|
||||
elseif tablemode#table#IsHeader(line('.') - 1) && tablemode#table#IsRow(line('.') - 2)
|
||||
elseif tablemode#table#IsBorder(line('.') - 1) && tablemode#table#IsRow(line('.') - 2)
|
||||
" execute 'normal! ' . (1 + 1) . 'k'
|
||||
normal! 2k
|
||||
endif
|
||||
|
||||
@@ -39,7 +39,7 @@ function! tablemode#spreadsheet#formula#Add(...) "{{{2
|
||||
if fr !=# ''
|
||||
let fr = '$' . row . ',' . colm . '=' . fr
|
||||
let fline = tablemode#spreadsheet#GetLastRow('.') + 1
|
||||
if tablemode#table#IsHeader(fline) | let fline += 1 | endif
|
||||
if tablemode#table#IsBorder(fline) | let fline += 1 | endif
|
||||
let cursor_pos = [line('.'), col('.')]
|
||||
if getline(fline) =~# 'tmf: '
|
||||
" Comment line correctly
|
||||
@@ -129,13 +129,13 @@ function! tablemode#spreadsheet#formula#EvaluateFormulaLine() abort "{{{2
|
||||
if tablemode#table#IsRow('.') " We're inside the table
|
||||
let line = tablemode#spreadsheet#GetLastRow('.')
|
||||
let fline = line + 1
|
||||
if tablemode#table#IsHeader(fline) | let fline += 1 | endif
|
||||
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#IsHeader(line) | let line -= 1 | endif
|
||||
if tablemode#table#IsBorder(line) | let line -= 1 | endif
|
||||
if tablemode#table#IsRow(line)
|
||||
let exprs = split(matchstr(getline('.'), matchexpr), ';')
|
||||
endif
|
||||
|
||||
@@ -47,7 +47,9 @@ function! s:GenerateHeaderBorder(line) "{{{2
|
||||
if tablemode#utils#strlen(line_val) <= 1 | return s:DefaultHeaderBorder() | 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')
|
||||
let border = substitute(border, '[^' . g:table_mode_corner . ']', g:table_mode_fillchar, 'g')
|
||||
" To accurately deal with unicode double width characters
|
||||
let fill_columns = map(split(border, g:table_mode_corner), 'repeat(g:table_mode_fillchar, tablemode#utils#StrDisplayWidth(v:val))')
|
||||
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
|
||||
@@ -94,24 +96,6 @@ function! tablemode#table#scope() "{{{2
|
||||
return s:
|
||||
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#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#GetCommentStart() "{{{2
|
||||
let cstring = &commentstring
|
||||
if tablemode#utils#strlen(cstring) > 0
|
||||
@@ -121,6 +105,15 @@ function! tablemode#table#GetCommentStart() "{{{2
|
||||
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
|
||||
@@ -135,6 +128,15 @@ function! tablemode#table#GetCommentEnd() "{{{2
|
||||
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
|
||||
@@ -153,15 +155,20 @@ function! tablemode#table#EndExpr() "{{{2
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! tablemode#table#IsHeader(line) "{{{2
|
||||
function! tablemode#table#IsBorder(line) "{{{2
|
||||
return getline(a:line) =~# s:HeaderBorderExpr()
|
||||
endfunction
|
||||
|
||||
function! tablemode#table#IsRow(line) "{{{2
|
||||
return !tablemode#table#IsHeader(a:line) && getline(a:line) =~# (tablemode#table#StartExpr() . g:table_mode_separator)
|
||||
function! tablemode#table#IsHeader(line) "{{{2
|
||||
let line = tablemode#utils#line(a:line)
|
||||
return tablemode#table#IsBorder(line+1) && !tablemode#table#IsRow(line-1) && !tablemode#table#IsRow(line-2)
|
||||
endfunction
|
||||
|
||||
function! tablemode#table#AddHeaderBorder(line) "{{{2
|
||||
function! tablemode#table#IsRow(line) "{{{2
|
||||
return !tablemode#table#IsBorder(a:line) && getline(a:line) =~# (tablemode#table#StartExpr() . g:table_mode_separator)
|
||||
endfunction
|
||||
|
||||
function! tablemode#table#AddBorder(line) "{{{2
|
||||
call setline(a:line, s:GenerateHeaderBorder(a:line))
|
||||
endfunction
|
||||
|
||||
@@ -170,8 +177,8 @@ function! tablemode#table#Realign(line) "{{{2
|
||||
|
||||
let lines = []
|
||||
let [lnum, blines] = [line, []]
|
||||
while tablemode#table#IsRow(lnum) || tablemode#table#IsHeader(lnum)
|
||||
if tablemode#table#IsHeader(lnum)
|
||||
while tablemode#table#IsRow(lnum) || tablemode#table#IsBorder(lnum)
|
||||
if tablemode#table#IsBorder(lnum)
|
||||
call insert(blines, lnum)
|
||||
let lnum -= 1
|
||||
continue
|
||||
@@ -181,8 +188,8 @@ function! tablemode#table#Realign(line) "{{{2
|
||||
endwhile
|
||||
|
||||
let lnum = line + 1
|
||||
while tablemode#table#IsRow(lnum) || tablemode#table#IsHeader(lnum)
|
||||
if tablemode#table#IsHeader(lnum)
|
||||
while tablemode#table#IsRow(lnum) || tablemode#table#IsBorder(lnum)
|
||||
if tablemode#table#IsBorder(lnum)
|
||||
call add(blines, lnum)
|
||||
let lnum += 1
|
||||
continue
|
||||
@@ -198,6 +205,6 @@ function! tablemode#table#Realign(line) "{{{2
|
||||
endfor
|
||||
|
||||
for bline in blines
|
||||
call tablemode#table#AddHeaderBorder(bline)
|
||||
call tablemode#table#AddBorder(bline)
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
@@ -51,3 +51,27 @@ endfunction
|
||||
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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
*table-mode.txt* Table Mode for easy table formatting. v4.4.0
|
||||
*table-mode.txt* Table Mode for easy table formatting. v4.5.0
|
||||
===============================================================================
|
||||
Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER
|
||||
VERSION 4.4.0
|
||||
VERSION 4.5.0
|
||||
|
||||
Author: Dhruva Sagar <http://dhruvasagar.com/>
|
||||
License: MIT <http://opensource.org/licenses/MIT/>
|
||||
@@ -119,7 +119,7 @@ Formula Expressions :
|
||||
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: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).
|
||||
|
||||
|
||||
@@ -50,6 +50,12 @@ function! s:TableEchoCell() "{{{1
|
||||
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 .
|
||||
@@ -73,6 +79,10 @@ 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>
|
||||
@@ -86,6 +96,8 @@ nnoremap <silent> <Plug>(table-mode-motion-right) :<C-U>call tablemode#spreadshe
|
||||
|
||||
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>
|
||||
@@ -104,48 +116,6 @@ if !hasmapto('<Plug>(table-mode-tableize-delimiter)')
|
||||
xmap <Leader>T <Plug>(table-mode-tableize-delimiter)
|
||||
endif
|
||||
|
||||
if !hasmapto('<Plug>(table-mode-realign)')
|
||||
nmap <Leader>tr <Plug>(table-mode-realign)
|
||||
endif
|
||||
|
||||
if !hasmapto('<Plug>(table-mode-motion-up)')
|
||||
nmap {<Bar> <Plug>(table-mode-motion-up)
|
||||
endif
|
||||
if !hasmapto('<Plug>(table-mode-motion-down)')
|
||||
nmap }<Bar> <Plug>(table-mode-motion-down)
|
||||
endif
|
||||
if !hasmapto('<Plug>(table-mode-motion-left)')
|
||||
nmap [<Bar> <Plug>(table-mode-motion-left)
|
||||
endif
|
||||
if !hasmapto('<Plug>(table-mode-motion-right)')
|
||||
nmap ]<Bar> <Plug>(table-mode-motion-right)
|
||||
endif
|
||||
|
||||
if !hasmapto('<Plug>(table-mode-cell-text-object-a)')
|
||||
omap a<Bar> <Plug>(table-mode-cell-text-object-a)
|
||||
endif
|
||||
if !hasmapto('<Plug>(table-mode-cell-text-object-i)')
|
||||
omap i<Bar> <Plug>(table-mode-cell-text-object-i)
|
||||
endif
|
||||
|
||||
if !hasmapto('<Plug>(table-mode-delete-row)')
|
||||
nmap <Leader>tdd <Plug>(table-mode-delete-row)
|
||||
endif
|
||||
if !hasmapto('<Plug>(table-mode-delete-column)')
|
||||
nmap <Leader>tdc <Plug>(table-mode-delete-column)
|
||||
endif
|
||||
|
||||
if !hasmapto('<Plug>(table-mode-add-formula)')
|
||||
nmap <Leader>tfa <Plug>(table-mode-add-formula)
|
||||
endif
|
||||
if !hasmapto('<Plug>(table-mode-eval-formula)')
|
||||
nmap <Leader>tfe <Plug>(table-mode-eval-formula)
|
||||
endif
|
||||
|
||||
if !hasmapto('<Plug>(table-mode-echo-cell)')
|
||||
nmap <Leader>t? <Plug>(table-mode-echo-cell)
|
||||
endif
|
||||
|
||||
" Avoiding side effects {{{1
|
||||
let &cpo = s:save_cpo
|
||||
|
||||
|
||||
32
t/cell.vim
32
t/cell.vim
@@ -10,7 +10,7 @@ describe 'cell'
|
||||
read t/fixtures/sample.txt
|
||||
end
|
||||
|
||||
it 'should return the cells'
|
||||
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']
|
||||
@@ -20,7 +20,17 @@ describe 'cell'
|
||||
Expect tablemode#spreadsheet#cell#GetCells(2, 0, 2) == ['test12', 'test22']
|
||||
end
|
||||
|
||||
it 'should return the cells in a range'
|
||||
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']]
|
||||
|
||||
@@ -54,20 +64,19 @@ describe 'cell'
|
||||
before
|
||||
new
|
||||
normal! ggdG
|
||||
call tablemode#Enable()
|
||||
normal i|test11|test12|
|
||||
|test21|test22|
|
||||
read t/fixtures/sample.txt
|
||||
call cursor(2, 3)
|
||||
end
|
||||
|
||||
it 'should move left when not on first column'
|
||||
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'
|
||||
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')
|
||||
@@ -82,7 +91,7 @@ describe 'cell'
|
||||
end
|
||||
|
||||
it 'should move to the next row first column if it exists when on last column'
|
||||
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')
|
||||
@@ -95,13 +104,12 @@ describe 'cell'
|
||||
before
|
||||
new
|
||||
normal! ggdG
|
||||
normal! ggdG
|
||||
call tablemode#Enable()
|
||||
normal i|test11|test12|
|
||||
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
|
||||
|
||||
2
t/fixtures/cell/sample.txt
Normal file
2
t/fixtures/cell/sample.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
| 1 | 2 |
|
||||
| 3 | 4 |
|
||||
4
t/fixtures/table/sample.txt
Normal file
4
t/fixtures/table/sample.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
| test11 | test12 |
|
||||
| test21 | test22 |
|
||||
|
||||
3
t/fixtures/table/sample_for_header.txt
Normal file
3
t/fixtures/table/sample_for_header.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
| test11 | test12 |
|
||||
|
||||
| test21 | test22 |
|
||||
9
t/fixtures/table/sample_for_header_unicode.txt
Normal file
9
t/fixtures/table/sample_for_header_unicode.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
|
||||
| abc | 测试长度 | 长测试 |
|
||||
|
||||
| 长 | 测试测试测试测试 | 测试测试 |
|
||||
|
||||
| 测试测试 | 测试 | 测试测测试 |
|
||||
|
||||
| 测试测试测试 | 测试测试 | 测试 |
|
||||
|
||||
4
t/fixtures/table/sample_header_realign_after.txt
Normal file
4
t/fixtures/table/sample_header_realign_after.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
| Title | Message |
|
||||
|------:+--------:|
|
||||
| t1 | msg1 |
|
||||
| t2 | msg2 |
|
||||
4
t/fixtures/table/sample_header_realign_before.txt
Normal file
4
t/fixtures/table/sample_header_realign_before.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
| Title | Message |
|
||||
|------:+--------:|
|
||||
| t1 | msg1 |
|
||||
| t2 | msg2 |
|
||||
8
t/fixtures/table/sample_header_realign_unicode_after.txt
Normal file
8
t/fixtures/table/sample_header_realign_unicode_after.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
|--------------+------------------+------------|
|
||||
| 测试测试 | 测试长度 | 长测试 |
|
||||
|--------------+------------------+-----------:|
|
||||
| abc | 测试长度 | 长测试 |
|
||||
| 长 | 测试测试测试测试 | 测试测试 |
|
||||
| 测试测试 | 测试 | 测试测测试 |
|
||||
| 测试测试测试 | 测试测试 | 测试 |
|
||||
|--------------+------------------+------------|
|
||||
@@ -0,0 +1,8 @@
|
||||
|--------+--------+------|
|
||||
|测试测试|测试长度|长测试|
|
||||
|--------+--------+-----:|
|
||||
|abc|测试长度|长测试|
|
||||
|长|测试测试测试测试|测试测试|
|
||||
|测试测试|测试|测试测测试|
|
||||
|测试测试测试|测试测试|测试|
|
||||
|------------+--------+----|
|
||||
2
t/fixtures/table/sample_realign_after.txt
Normal file
2
t/fixtures/table/sample_realign_after.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
| test11 | test12 |
|
||||
| test21 | test22 |
|
||||
2
t/fixtures/table/sample_realign_before.txt
Normal file
2
t/fixtures/table/sample_realign_before.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
|test11|test12|
|
||||
|test21|test22|
|
||||
4
t/fixtures/table/sample_realign_unicode_after.txt
Normal file
4
t/fixtures/table/sample_realign_unicode_after.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
| abc | 测试长度 | 长测试 |
|
||||
| 长 | 测试测试测试测试 | 测试测试 |
|
||||
| 测试测试 | 测试 | 测试测测试 |
|
||||
| 测试测试测试 | 测试测试 | 测试 |
|
||||
4
t/fixtures/table/sample_realign_unicode_before.txt
Normal file
4
t/fixtures/table/sample_realign_unicode_before.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
|abc|测试长度|长测试|
|
||||
|长|测试测试测试测试|测试测试|
|
||||
|测试测试|测试|测试测测试|
|
||||
|测试测试测试|测试测试|测试|
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|--------+---------|
|
||||
| Title | Message |
|
||||
|--------+---------|
|
||||
| test11 | test12 |
|
||||
@@ -25,6 +25,27 @@ describe 'spreadsheet'
|
||||
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
|
||||
@@ -34,13 +55,41 @@ describe 'spreadsheet'
|
||||
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 i|test11|test12|
|
||||
|test21|test22|
|
||||
normal! ggdG
|
||||
read t/fixtures/sample.txt
|
||||
call cursor(2, 3)
|
||||
end
|
||||
|
||||
it 'should delete a row successfully'
|
||||
|
||||
139
t/table.vim
139
t/table.vim
@@ -4,40 +4,159 @@ source t/config/options.vim
|
||||
call vspec#hint({'scope': 'tablemode#table#scope()', 'sid': 'tablemode#table#sid()'})
|
||||
|
||||
describe 'table'
|
||||
describe 'API'
|
||||
describe 'IsRow'
|
||||
before
|
||||
new
|
||||
read t/fixtures/sample.txt
|
||||
normal! ggdG
|
||||
read t/fixtures/table/sample.txt
|
||||
end
|
||||
|
||||
it 'should return true when inside a table'
|
||||
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 return false when outside a table'
|
||||
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 'IsHeader'
|
||||
before
|
||||
new
|
||||
read t/fixtures/sample_with_header.txt
|
||||
normal! ggdG
|
||||
read t/fixtures/table/sample_with_header.txt
|
||||
end
|
||||
|
||||
it 'should return true when on a table header'
|
||||
Expect tablemode#table#IsHeader(3) to_be_true
|
||||
Expect tablemode#table#IsHeader(6) to_be_true
|
||||
it 'should be true on the table header'
|
||||
Expect tablemode#table#IsHeader(2) to_be_true
|
||||
end
|
||||
|
||||
it 'should return false when not on a table header'
|
||||
it 'should be false anywhere else'
|
||||
Expect tablemode#table#IsHeader(1) to_be_false
|
||||
Expect tablemode#table#IsHeader(2) 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
|
||||
|
||||
24
t/utils.vim
24
t/utils.vim
@@ -3,7 +3,8 @@ source t/config/options.vim
|
||||
|
||||
call vspec#hint({'scope': 'tablemode#utils#scope()', 'sid': 'tablemode#utils#sid()'})
|
||||
|
||||
describe 'line'
|
||||
describe 'utils'
|
||||
describe 'line'
|
||||
it 'should return the current line number'
|
||||
Expect tablemode#utils#line('.') == line('.')
|
||||
end
|
||||
@@ -11,16 +12,16 @@ describe 'line'
|
||||
it 'should return the line number itself if it is a number'
|
||||
Expect tablemode#utils#line(1) == 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'strip'
|
||||
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
|
||||
end
|
||||
|
||||
describe 'strlen'
|
||||
describe 'strlen'
|
||||
it 'should return the length of a string correctly'
|
||||
let string = 'this is a test'
|
||||
Expect tablemode#utils#strlen(string) == 14
|
||||
@@ -30,4 +31,17 @@ describe 'strlen'
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user