mirror of
https://github.com/dhruvasagar/vim-table-mode.git
synced 2025-11-08 11:03:47 -05:00
Compare commits
36 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6412352b54 | ||
|
|
a5909a01b9 | ||
|
|
0af25d72eb | ||
|
|
06adb63764 | ||
|
|
aedcd8e077 | ||
|
|
5ac34a22db | ||
|
|
8677840826 | ||
|
|
5ec330d114 | ||
|
|
d670f5e0f8 | ||
|
|
9781613f66 | ||
|
|
126897a6fb | ||
|
|
49c41900f5 | ||
|
|
934778947e | ||
|
|
865563f785 | ||
|
|
a40ef26c5c | ||
|
|
b6210c9392 | ||
|
|
fdfcb85fb3 | ||
|
|
229916cd00 | ||
|
|
ad9229c937 | ||
|
|
cdf33f680f | ||
|
|
5c3c30a9cc | ||
|
|
130e835ff7 | ||
|
|
a1be216c94 | ||
|
|
cf11264525 | ||
|
|
5483e163bd | ||
|
|
09f4336954 | ||
|
|
e646bee5c4 | ||
|
|
d0a6405189 | ||
|
|
c35fd9b104 | ||
|
|
bdd96b05cb | ||
|
|
b25fe6f9f0 | ||
|
|
322503e814 | ||
|
|
40fe641708 | ||
|
|
1d9d512ed1 | ||
|
|
9f383b92be | ||
|
|
a646b4033b |
12
.github/FUNDING.yml
vendored
Normal file
12
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: vim-table-mode
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
@@ -1,4 +1,4 @@
|
||||
language: ruby
|
||||
rvm:
|
||||
- 2.3.0
|
||||
- 2.5.3
|
||||
script: rake ci
|
||||
|
||||
2
Gemfile
2
Gemfile
@@ -1,5 +1,5 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
ruby '2.3.0'
|
||||
ruby '2.5.3'
|
||||
gem 'rake'
|
||||
gem 'vim-flavor', '~> 1.1'
|
||||
|
||||
@@ -4,7 +4,7 @@ GEM
|
||||
blankslate (2.1.2.4)
|
||||
parslet (1.5.0)
|
||||
blankslate (~> 2.0)
|
||||
rake (10.1.0)
|
||||
rake (12.3.3)
|
||||
thor (0.18.1)
|
||||
vim-flavor (1.1.3)
|
||||
parslet (~> 1.0)
|
||||
@@ -16,3 +16,9 @@ PLATFORMS
|
||||
DEPENDENCIES
|
||||
rake
|
||||
vim-flavor (~> 1.1)
|
||||
|
||||
RUBY VERSION
|
||||
ruby 2.5.3p105
|
||||
|
||||
BUNDLED WITH
|
||||
2.0.1
|
||||
|
||||
36
README.md
36
README.md
@@ -113,11 +113,17 @@ To get ReST-compatible tables use
|
||||
| Sherlock Holmes | 221B Baker Street | 0987654321 |
|
||||
+-----------------+--------------------------+------------+
|
||||
|
||||
Markdown and ReST filetypes have automatically configured corners.
|
||||
|
||||
You can also define in a table header border how it's content should be
|
||||
aligned, whether center, right or left by using a `:` character defined by
|
||||
`g:table_mode_align_char` option.
|
||||
|
||||
If you manipulate the table when table mode is disabled or copy paste a table
|
||||
from clipboard from outside and it ends up being misaligned, you can realign
|
||||
it using `:TableModeRealign` or using the default mapping
|
||||
<kbd>\<Leader\>tr</kbd> defined by `g:table_mode_relign_map` option.
|
||||
|
||||
### Formatting existing content into a table
|
||||
|
||||
Table Mode wouldn't justify it's name if it didn't allow formatting
|
||||
@@ -266,3 +272,33 @@ named <a href="https://gist.github.com/tpope/287147">cucumbertables.vim</a>.
|
||||
|
||||
Also a shout out to godlygeek who developed the incredible <a
|
||||
href="http://github.com/godlygeek/tabular">Tabular</a> plugin.
|
||||
|
||||
## Contributors
|
||||
|
||||
### Code Contributors
|
||||
|
||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
||||
<a href="https://github.com/dhruvasagar/vim-table-mode/graphs/contributors"><img src="https://opencollective.com/vim-table-mode/contributors.svg?width=890&button=false" /></a>
|
||||
|
||||
### Financial Contributors
|
||||
|
||||
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/vim-table-mode/contribute)]
|
||||
|
||||
#### Individuals
|
||||
|
||||
<a href="https://opencollective.com/vim-table-mode"><img src="https://opencollective.com/vim-table-mode/individuals.svg?width=890"></a>
|
||||
|
||||
#### Organizations
|
||||
|
||||
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/vim-table-mode/contribute)]
|
||||
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/0/website"><img src="https://opencollective.com/vim-table-mode/organization/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/1/website"><img src="https://opencollective.com/vim-table-mode/organization/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/2/website"><img src="https://opencollective.com/vim-table-mode/organization/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/3/website"><img src="https://opencollective.com/vim-table-mode/organization/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/4/website"><img src="https://opencollective.com/vim-table-mode/organization/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/5/website"><img src="https://opencollective.com/vim-table-mode/organization/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/6/website"><img src="https://opencollective.com/vim-table-mode/organization/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/7/website"><img src="https://opencollective.com/vim-table-mode/organization/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/8/website"><img src="https://opencollective.com/vim-table-mode/organization/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/vim-table-mode/organization/9/website"><img src="https://opencollective.com/vim-table-mode/organization/9/avatar.svg"></a>
|
||||
|
||||
@@ -98,10 +98,11 @@ function! s:ToggleAutoAlign() "{{{2
|
||||
augroup TableModeAutoAlign
|
||||
au!
|
||||
|
||||
autocmd CursorHold <buffer> nested silent! call tablemode#table#Realign('.')
|
||||
autocmd CursorHold <buffer> nested silent! if &modified | call tablemode#table#Realign('.') | endif
|
||||
" autocmd InsertLeave <buffer> nested silent! if &modified | call tablemode#table#Realign('.') | endif
|
||||
augroup END
|
||||
else
|
||||
silent! augroup! TableModeAutoAlign
|
||||
autocmd! TableModeAutoAlign
|
||||
endif
|
||||
endfunction
|
||||
|
||||
@@ -168,15 +169,17 @@ function! tablemode#IsActive() "{{{2
|
||||
endfunction
|
||||
|
||||
function! tablemode#TableizeInsertMode() "{{{2
|
||||
if tablemode#IsActive() && getline('.') =~# (tablemode#table#StartExpr() . g:table_mode_separator . g:table_mode_separator)
|
||||
call tablemode#table#AddBorder('.')
|
||||
normal! A
|
||||
elseif tablemode#IsActive() && getline('.') =~# (tablemode#table#StartExpr() . g:table_mode_separator)
|
||||
let column = tablemode#utils#strlen(substitute(getline('.')[0:col('.')], '[^' . g:table_mode_separator . ']', '', 'g'))
|
||||
let position = tablemode#utils#strlen(matchstr(getline('.')[0:col('.')], '.*' . g:table_mode_separator . '\s*\zs.*'))
|
||||
call tablemode#table#Realign('.')
|
||||
normal! 0
|
||||
call search(repeat('[^' . g:table_mode_separator . ']*' . g:table_mode_separator, column) . '\s\{-\}' . repeat('.', position), 'ce', line('.'))
|
||||
if tablemode#IsActive()
|
||||
if getline('.') =~# (tablemode#table#StartExpr() . g:table_mode_separator . g:table_mode_separator . tablemode#table#EndExpr())
|
||||
call tablemode#table#AddBorder('.')
|
||||
normal! A
|
||||
elseif getline('.') =~# (tablemode#table#StartExpr() . g:table_mode_separator)
|
||||
let column = tablemode#utils#strlen(substitute(getline('.')[0:col('.')], '[^' . g:table_mode_separator . ']', '', 'g'))
|
||||
let position = tablemode#utils#strlen(matchstr(getline('.')[0:col('.')], '.*' . g:table_mode_separator . '\s*\zs.*'))
|
||||
call tablemode#table#Realign('.')
|
||||
normal! 0
|
||||
call search(repeat('[^' . g:table_mode_separator . ']*' . g:table_mode_separator, column) . '\s\{-\}' . repeat('.', position), 'ce', line('.'))
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
@@ -67,7 +67,9 @@ function! tablemode#align#alignments(lnum, ncols) "{{{2
|
||||
let achr = g:table_mode_align_char
|
||||
let alignments = []
|
||||
if tablemode#table#IsBorder(a:lnum+1)
|
||||
let hcols = tablemode#align#Split(getline(a:lnum+1), '[' . g:table_mode_corner . g:table_mode_corner_corner . ']')
|
||||
let corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner')
|
||||
let corner_corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner_corner')
|
||||
let hcols = tablemode#align#Split(getline(a:lnum+1), '[' . corner . corner_corner . ']')
|
||||
for idx in range(len(hcols))
|
||||
" Right align if header
|
||||
call add(alignments, 'l')
|
||||
@@ -84,7 +86,7 @@ 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")')
|
||||
let lines = map(a:lines, 'map(v:val, "v:key =~# \"text\" ? tablemode#align#Split(v:val, g:table_mode_escaped_separator_regex) : v:val")')
|
||||
|
||||
for line in lines
|
||||
let stext = line.text
|
||||
|
||||
@@ -180,10 +180,19 @@ function! tablemode#spreadsheet#Average(range, ...) abort "{{{2
|
||||
return s:Average(call('tablemode#spreadsheet#cell#GetCellRange', args))
|
||||
endfunction
|
||||
|
||||
function! tablemode#spreadsheet#Sort(bang, ...) "{{{2
|
||||
function! tablemode#spreadsheet#Sort(bang, ...) range "{{{2
|
||||
if exists('*getcurpos')
|
||||
let col = getcurpos()[4] " curswant
|
||||
else
|
||||
let col = col('.')
|
||||
endif
|
||||
let opts = a:0 ? a:1 : ''
|
||||
let bang = a:bang ? '!' : ''
|
||||
let [firstRow, lastRow] = [tablemode#spreadsheet#GetFirstRow('.'), tablemode#spreadsheet#GetLastRow('.')]
|
||||
if a:firstline == a:lastline
|
||||
let [firstRow, lastRow] = [tablemode#spreadsheet#GetFirstRow('.'), tablemode#spreadsheet#GetLastRow('.')]
|
||||
else
|
||||
let [firstRow, lastRow] = [a:firstline, a:lastline]
|
||||
endif
|
||||
call tablemode#spreadsheet#MoveToStartOfCell()
|
||||
exec ':'.firstRow.','.lastRow . 'sort'.bang opts '/.*\%'.col('.').'v/'
|
||||
exec ':undojoin | '.firstRow.','.lastRow . 'sort'.bang opts '/.*\%'.col.'v/'
|
||||
endfunction
|
||||
|
||||
@@ -63,8 +63,8 @@ function! tablemode#spreadsheet#formula#EvaluateExpr(expr, line) abort "{{{2
|
||||
let expr = substitute(expr, 'Average(\([^)]*\))', 'tablemode#spreadsheet#Average("\1",'.line.','.colm.')', 'g')
|
||||
endif
|
||||
|
||||
if expr =~# '\$\d\+,\d\+'
|
||||
let expr = substitute(expr, '\$\(\d\+\),\(\d\+\)',
|
||||
if expr =~# '\$\-\?\d\+,\-\?\d\+'
|
||||
let expr = substitute(expr, '\$\(\-\?\d\+\),\(\-\?\d\+\)',
|
||||
\ '\=str2float(tablemode#spreadsheet#cell#GetCells(line, submatch(1), submatch(2)))', 'g')
|
||||
endif
|
||||
|
||||
|
||||
@@ -4,16 +4,21 @@ function! s:blank(string) "{{{2
|
||||
endfunction
|
||||
|
||||
function! s:BorderExpr() "{{{2
|
||||
let corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner')
|
||||
let corner_corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner_corner')
|
||||
let header_fillchar = tablemode#utils#get_buffer_or_global_option('table_mode_header_fillchar')
|
||||
return tablemode#table#StartExpr() .
|
||||
\ '[' . g:table_mode_corner . g:table_mode_corner_corner . ']' .
|
||||
\ '[' . escape(g:table_mode_fillchar . g:table_mode_header_fillchar . g:table_mode_corner . g:table_mode_align_char, '-') . ']\+' .
|
||||
\ '[' . g:table_mode_corner . g:table_mode_corner_corner . ']' .
|
||||
\ '[' . corner . corner_corner . ']' .
|
||||
\ '[' . escape(g:table_mode_fillchar . header_fillchar . corner . g:table_mode_align_char, '-') . ']\+' .
|
||||
\ '[' . corner . corner_corner . ']' .
|
||||
\ tablemode#table#EndExpr()
|
||||
endfunction
|
||||
|
||||
function! s:DefaultBorder() "{{{2
|
||||
if tablemode#IsActive()
|
||||
return g:table_mode_corner_corner . g:table_mode_fillchar . g:table_mode_corner . g:table_mode_fillchar . g:table_mode_corner_corner
|
||||
let corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner')
|
||||
let corner_corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner_corner')
|
||||
return corner_corner . g:table_mode_fillchar . corner . g:table_mode_fillchar . corner_corner
|
||||
else
|
||||
return ''
|
||||
endif
|
||||
@@ -31,16 +36,24 @@ function! s:GenerateHeaderBorder(line) "{{{2
|
||||
endif
|
||||
if tablemode#utils#strlen(line_val) <= 1 | return s:DefaultBorder() | endif
|
||||
|
||||
let corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner')
|
||||
let corner_corner = tablemode#utils#get_buffer_or_global_option('table_mode_corner_corner')
|
||||
let header_fillchar = tablemode#utils#get_buffer_or_global_option('table_mode_header_fillchar')
|
||||
|
||||
let tline = line_val[stridx(line_val, g:table_mode_separator):strridx(line_val, g:table_mode_separator)]
|
||||
let fillchar = tablemode#table#IsHeader(line - 1) ? g:table_mode_header_fillchar : g:table_mode_fillchar
|
||||
let seperator_match_regex = g:table_mode_separator . '\zs\([^' . g:table_mode_separator . ']*\)\ze' . g:table_mode_separator
|
||||
let border = substitute(tline, seperator_match_regex, '\=repeat(fillchar, tablemode#utils#StrDisplayWidth(submatch(0)))', 'g')
|
||||
let border = substitute(border, g:table_mode_separator, g:table_mode_corner, 'g')
|
||||
let border = substitute(border, '^' . g:table_mode_corner . '\(.*\)' . g:table_mode_corner . '$', g:table_mode_corner_corner . '\1' . g:table_mode_corner_corner, '')
|
||||
let fillchar = tablemode#table#IsHeader(line - 1) ? header_fillchar : g:table_mode_fillchar
|
||||
|
||||
let special_replacement = '___'
|
||||
let border = substitute(tline, g:table_mode_escaped_separator_regex, special_replacement, 'g')
|
||||
let seperator_match_regex = special_replacement . '\zs\(.\{-}\)\ze' . special_replacement
|
||||
let border = substitute(border, seperator_match_regex, '\=repeat(fillchar, tablemode#utils#StrDisplayWidth(submatch(0)))', 'g')
|
||||
let border = substitute(border, special_replacement, g:table_mode_separator, 'g')
|
||||
let border = substitute(border, g:table_mode_separator, corner, 'g')
|
||||
let border = substitute(border, '^' . corner . '\(.*\)' . corner . '$', corner_corner . '\1' . corner_corner, '')
|
||||
|
||||
" Incorporate header alignment chars
|
||||
if getline(line) =~# g:table_mode_align_char
|
||||
let pat = '[' . g:table_mode_corner_corner . g:table_mode_corner . ']'
|
||||
let pat = '[' . corner_corner . corner . ']'
|
||||
let hcols = tablemode#align#Split(getline(line), pat)
|
||||
let gcols = tablemode#align#Split(border, pat)
|
||||
|
||||
@@ -79,7 +92,7 @@ endfunction
|
||||
function! tablemode#table#GetCommentStart() "{{{2
|
||||
let cstring = &commentstring
|
||||
if tablemode#utils#strlen(cstring) > 0
|
||||
return substitute(split(cstring, '%s')[0], '[^()]', '\\\0', 'g')
|
||||
return substitute(split(cstring, '%s')[0], '[^(%)]', '\\\0', 'g')
|
||||
else
|
||||
return ''
|
||||
endif
|
||||
@@ -162,6 +175,9 @@ function! tablemode#table#AddBorder(line) "{{{2
|
||||
endfunction
|
||||
|
||||
function! tablemode#table#Realign(line) "{{{2
|
||||
let current_fm = &foldmethod " save foldmethod to be restored
|
||||
setlocal foldmethod=manual " manual foldmethod while table is being aligned
|
||||
|
||||
let line = tablemode#utils#line(a:line)
|
||||
|
||||
let lines = []
|
||||
@@ -196,4 +212,7 @@ function! tablemode#table#Realign(line) "{{{2
|
||||
for bline in blines
|
||||
call tablemode#table#AddBorder(bline)
|
||||
endfor
|
||||
|
||||
" restore foldmethod
|
||||
execute "setlocal foldmethod=" . current_fm
|
||||
endfunction
|
||||
|
||||
@@ -47,3 +47,7 @@ function! tablemode#utils#StrDisplayWidth(string) "{{{2
|
||||
return rv
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! tablemode#utils#get_buffer_or_global_option(table_option) "{{{2
|
||||
return get(b:, a:table_option, get(g:, a:table_option))
|
||||
endf
|
||||
|
||||
@@ -184,6 +184,9 @@ g:table_mode_verbose *table-mode-verbose*
|
||||
g:table_mode_corner *table-mode-corner*
|
||||
Use this option to define the table corner character: >
|
||||
let g:table_mode_corner = '+'
|
||||
<
|
||||
Or only in the current buffer: >
|
||||
let b:table_mode_corner = '+'
|
||||
<
|
||||
g:table_mode_separator *table-mode-separator*
|
||||
Use this option to define the table column separator character: >
|
||||
@@ -232,6 +235,9 @@ g:table_mode_corner_corner *table-mode-corner-corner*
|
||||
Use this option to define the character to be used for the extreme
|
||||
corners of the table border. >
|
||||
let g:table_mode_corner_corner = '|'
|
||||
<
|
||||
Or only in the current buffer: >
|
||||
let b:table_mode_corner_corner = '|'
|
||||
<
|
||||
g:table_mode_align_char *table-mode-align-char*
|
||||
Use this option to define the character to be used for defining
|
||||
@@ -299,6 +305,16 @@ g:table_mode_sort_map *table-mode-sort-map*
|
||||
current column. >
|
||||
let g:table_mode_sort_map = '<Leader>ts'
|
||||
>
|
||||
g:table_mode_tableize_map *table-mode-tableize-map*
|
||||
Set this to configure the mapping for converting the visual selection
|
||||
to a table. >
|
||||
let g:table_mode_tableize_map = '<Leader>tt'
|
||||
>
|
||||
g:table_mode_tableize_d_map *table-mode-tableize-d-map*
|
||||
Set this to configure the mapping for converting the visual selection
|
||||
to a table, asking the user for a delimiter. >
|
||||
let g:table_mode_tableize_d_map = '<Leader>T'
|
||||
>
|
||||
g:table_mode_syntax *table-mode-syntax*
|
||||
Control whether table mode should define table syntax definitions or
|
||||
not. >
|
||||
@@ -456,13 +472,13 @@ COMMANDS *table-mode-commands*
|
||||
CONTRIBUTING *table-mode-contributing*
|
||||
|
||||
If you want to take a stab at it, by all means, send me a pull request on
|
||||
Github (http://github.com/dhruvasagar/table-mode) or get in touch with me
|
||||
Github (http://github.com/dhruvasagar/vim-table-mode) or get in touch with me
|
||||
directly via e-mail at dhruva 'dot' sagar 'at' gmail.com.
|
||||
|
||||
===============================================================================
|
||||
REPORT ISSUES *table-mode-report-issues*
|
||||
|
||||
If you discover any issues, please report them at
|
||||
http://github.com/dhruvasagar/table-mode/issues.
|
||||
http://github.com/dhruvasagar/vim-table-mode/issues.
|
||||
|
||||
vim:tw=78:ts=8:ft=help:norl:ai:et
|
||||
|
||||
1
ftplugin/markdown_tablemode.vim
Normal file
1
ftplugin/markdown_tablemode.vim
Normal file
@@ -0,0 +1 @@
|
||||
let b:table_mode_corner = '|'
|
||||
2
ftplugin/rst_tablemode.vim
Normal file
2
ftplugin/rst_tablemode.vim
Normal file
@@ -0,0 +1,2 @@
|
||||
let b:table_mode_corner_corner = '+'
|
||||
let b:table_mode_header_fillchar = '='
|
||||
@@ -18,6 +18,7 @@ endfunction
|
||||
call s:SetGlobalOptDefault('table_mode_corner', '+')
|
||||
call s:SetGlobalOptDefault('table_mode_verbose', 1)
|
||||
call s:SetGlobalOptDefault('table_mode_separator', '|')
|
||||
call s:SetGlobalOptDefault('table_mode_escaped_separator_regex', '\(\\\)\@<!' . g:table_mode_separator)
|
||||
call s:SetGlobalOptDefault('table_mode_fillchar', '-')
|
||||
call s:SetGlobalOptDefault('table_mode_header_fillchar', '-')
|
||||
call s:SetGlobalOptDefault('table_mode_map_prefix', '<Leader>t')
|
||||
@@ -36,13 +37,15 @@ call s:SetGlobalOptDefault('table_mode_motion_right_map', ']<Bar>')
|
||||
call s:SetGlobalOptDefault('table_mode_cell_text_object_a_map', 'a<Bar>')
|
||||
call s:SetGlobalOptDefault('table_mode_cell_text_object_i_map', 'i<Bar>')
|
||||
|
||||
call s:SetGlobalOptDefault('table_mode_realign_map', '<Leader>tr')
|
||||
call s:SetGlobalOptDefault('table_mode_delete_row_map', '<Leader>tdd')
|
||||
call s:SetGlobalOptDefault('table_mode_delete_column_map', '<Leader>tdc')
|
||||
call s:SetGlobalOptDefault('table_mode_add_formula_map', '<Leader>tfa')
|
||||
call s:SetGlobalOptDefault('table_mode_eval_formula_map', '<Leader>tfe')
|
||||
call s:SetGlobalOptDefault('table_mode_echo_cell_map', '<Leader>t?')
|
||||
call s:SetGlobalOptDefault('table_mode_sort_map', '<Leader>ts')
|
||||
call s:SetGlobalOptDefault('table_mode_realign_map', g:table_mode_map_prefix.'r')
|
||||
call s:SetGlobalOptDefault('table_mode_delete_row_map', g:table_mode_map_prefix.'dd')
|
||||
call s:SetGlobalOptDefault('table_mode_delete_column_map', g:table_mode_map_prefix.'dc')
|
||||
call s:SetGlobalOptDefault('table_mode_add_formula_map', g:table_mode_map_prefix.'fa')
|
||||
call s:SetGlobalOptDefault('table_mode_eval_formula_map', g:table_mode_map_prefix.'fe')
|
||||
call s:SetGlobalOptDefault('table_mode_echo_cell_map', g:table_mode_map_prefix.'?')
|
||||
call s:SetGlobalOptDefault('table_mode_sort_map', g:table_mode_map_prefix.'s')
|
||||
call s:SetGlobalOptDefault('table_mode_tableize_map', g:table_mode_map_prefix.'t')
|
||||
call s:SetGlobalOptDefault('table_mode_tableize_d_map', '<Leader>T')
|
||||
|
||||
call s:SetGlobalOptDefault('table_mode_syntax', 1)
|
||||
call s:SetGlobalOptDefault('table_mode_auto_align', 1)
|
||||
@@ -72,7 +75,7 @@ endif
|
||||
" }}}2
|
||||
|
||||
command! -nargs=? -range Tableize <line1>,<line2>call tablemode#TableizeRange(<q-args>)
|
||||
command! -nargs=? -bang TableSort call tablemode#spreadsheet#Sort(<bang>0, <q-args>)
|
||||
command! -nargs=? -bang -range TableSort <line1>,<line2>call tablemode#spreadsheet#Sort(<bang>0, <q-args>)
|
||||
command! TableAddFormula call tablemode#spreadsheet#formula#Add()
|
||||
command! TableModeRealign call tablemode#table#Realign('.')
|
||||
command! TableEvalFormulaLine call tablemode#spreadsheet#formula#EvaluateFormulaLine()
|
||||
@@ -97,8 +100,8 @@ onoremap <silent> <Plug>(table-mode-cell-text-object-i) :<C-U>call tablemode#spr
|
||||
xnoremap <silent> <Plug>(table-mode-cell-text-object-a) :<C-U>call tablemode#spreadsheet#cell#TextObject(0)<CR>
|
||||
xnoremap <silent> <Plug>(table-mode-cell-text-object-i) :<C-U>call tablemode#spreadsheet#cell#TextObject(1)<CR>
|
||||
|
||||
nnoremap <silent> <Plug>(table-mode-delete-row) :call tablemode#spreadsheet#DeleteRow()<CR>
|
||||
nnoremap <silent> <Plug>(table-mode-delete-column) :call tablemode#spreadsheet#DeleteColumn()<CR>
|
||||
nnoremap <silent> <Plug>(table-mode-delete-row) :<C-U>call tablemode#spreadsheet#DeleteRow()<CR>
|
||||
nnoremap <silent> <Plug>(table-mode-delete-column) :<C-U>call tablemode#spreadsheet#DeleteColumn()<CR>
|
||||
|
||||
nnoremap <silent> <Plug>(table-mode-add-formula) :call tablemode#spreadsheet#formula#Add()<CR>
|
||||
nnoremap <silent> <Plug>(table-mode-eval-formula) :call tablemode#spreadsheet#formula#EvaluateFormulaLine()<CR>
|
||||
@@ -108,12 +111,12 @@ nnoremap <silent> <Plug>(table-mode-echo-cell) :call <SID>TableEchoCell()<CR>
|
||||
nnoremap <silent> <Plug>(table-mode-sort) :call tablemode#spreadsheet#Sort('')<CR>
|
||||
|
||||
if !hasmapto('<Plug>(table-mode-tableize)')
|
||||
exec "nmap" g:table_mode_map_prefix . "t <Plug>(table-mode-tableize)"
|
||||
exec "xmap" g:table_mode_map_prefix . "t <Plug>(table-mode-tableize)"
|
||||
exec "nmap" g:table_mode_tableize_map "<Plug>(table-mode-tableize)"
|
||||
exec "xmap" g:table_mode_tableize_map "<Plug>(table-mode-tableize)"
|
||||
endif
|
||||
|
||||
if !hasmapto('<Plug>(table-mode-tableize-delimiter)')
|
||||
xmap <Leader>T <Plug>(table-mode-tableize-delimiter)
|
||||
exec "xmap" g:table_mode_tableize_d_map "<Plug>(table-mode-tableize-delimiter)"
|
||||
endif
|
||||
|
||||
augroup TableMode "{{{1
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
let g:table_mode_corner = '+'
|
||||
let g:table_mode_separator = '|'
|
||||
let g:table_mode_escaped_separator_regex = '\(\\\)\@<!|'
|
||||
let g:table_mode_fillchar = '-'
|
||||
let g:table_mode_header_fillchar = '-'
|
||||
let g:table_mode_map_prefix = '<Leader>t'
|
||||
@@ -25,6 +26,8 @@ let g:table_mode_add_formula_map = '<Leader>tfa'
|
||||
let g:table_mode_eval_formula_map = '<Leader>tfe'
|
||||
let g:table_mode_echo_cell_map = '<Leader>t?'
|
||||
let g:table_mode_sort_map = '<Leader>ts'
|
||||
let g:table_mode_tableize_map = '<Leader>tt'
|
||||
let g:table_mode_tableize_d_map = '<Leader>T'
|
||||
|
||||
let g:table_mode_syntax = 1
|
||||
let g:table_mode_auto_align = 1
|
||||
|
||||
7
t/fixtures/big_sample.txt
Normal file
7
t/fixtures/big_sample.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
|---+---+---+---|
|
||||
| 1 | 9 | a | z |
|
||||
| 2 | 8 | b | y |
|
||||
| 3 | 7 | c | x |
|
||||
| 4 | 6 | d | w |
|
||||
| 5 | 5 | e | v |
|
||||
|---+---+---+---|
|
||||
@@ -102,4 +102,25 @@ describe 'spreadsheet'
|
||||
Expect tablemode#spreadsheet#ColumnCount('.') == 1
|
||||
end
|
||||
end
|
||||
|
||||
describe 'Repeated Manipulations'
|
||||
before
|
||||
new
|
||||
normal! ggdG
|
||||
read t/fixtures/big_sample.txt
|
||||
call cursor(2, 3)
|
||||
end
|
||||
|
||||
it 'should delete multiple rows correctly'
|
||||
Expect tablemode#spreadsheet#RowCount('.') == 5
|
||||
.,.+1 call tablemode#spreadsheet#DeleteRow()
|
||||
Expect tablemode#spreadsheet#RowCount('.') == 3
|
||||
end
|
||||
|
||||
it 'should delete multiple columns correctly'
|
||||
Expect tablemode#spreadsheet#ColumnCount('.') == 4
|
||||
.,.+1 call tablemode#spreadsheet#DeleteColumn()
|
||||
Expect tablemode#spreadsheet#ColumnCount('.') == 2
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user