Compare commits

..

21 Commits
v2.1 ... v2.4.0

Author SHA1 Message Date
Dhruva Sagar
87a713efb7 Releasing v2.4.0
- Added table cell text object.
- Added api to delete table row.
- Added api to delete table column.
- Updated doc/table-mode.txt
- Updated CHANGELOG.md
2013-05-05 08:47:21 +05:30
Dhruva Sagar
272bef4ce0 Releasing v2.3.0
- Refactored realignment logic.
- Generating borders by hand rather than relying on
  tabular formatting since that puts restrictions on the borders
  (padding). With the new scheme, I am able to generate good looking
  tables with neat borders like they should be, without padding.
- Updated doc/table-mode.txt
2013-05-04 03:23:20 +05:30
Dhruva Sagar
7c4039e5e1 Updated Table Mode Public API
- Added tablemode#RowCount(line). Returns the total number of rows in a
  table given a line (row).
- Added tablemode#ColumnCount(line). Returns the total number of columns
  in a line (row).
- Added tablemode#RowNr(line). Returns the row number on given line.
- Added tablemode#ColumnNr(line). Returns the column on given line.
2013-05-03 16:22:20 +05:30
Dhruva Sagar
28b13a32ab Fixed #6
- Realign now updates table borders as well.
2013-05-01 12:08:39 +05:30
Dhruva Sagar
599a39c28d Updated documentation 2013-05-01 02:30:24 +05:30
Dhruva Sagar
241d0ccba0 Finished #6
- Updated doc.
- Bumped version.
- Added a mapping for realigning table columns.
- Added mapping for moving to next / prev row / column.
2013-05-01 01:57:47 +05:30
Dhruva Sagar
ef3e5323d0 Fixed bugs
- Covered case when commentstring is not set (default).
- Escaping commentstring symbols.
2013-04-09 10:53:57 +05:30
Dhruva Sagar
8489ca0c3b Refactored for table within inline comments 2013-04-08 21:40:02 +05:30
Dhruva Sagar
a5e2584347 Releasing v2.2.1
- Fixes #5. We now have the ability to invoke table mode within inline
  comments. Works for both instant table creation and table conversion
  for csv data. Uses 'commentstring' option of vim to identify comments,
  so it should work for most filetypes as long as 'commentstring' option
  has been set. This is usually done appropriately in filetype plugins.
2013-04-08 19:52:37 +05:30
Dhruva Sagar
c6609fd67d Moved Change Log to CHANGELOG.md 2013-03-28 18:02:14 +05:30
Dhruva Sagar
f189754d2e Releasing v2.2
- Improved :Tableize to accept a {patter} in a similar way as
  :Tabularize does. eg.)
      :Tableize/;
  The above command will tableize the selection taking ';' as the
  delimiter rather than the default ',' defined by the
  g:table_mode_delimiter option. If you do not provide a pattern, the
  default delimiter will be used.
- Updated doc/table-mode.txt
- Updated README.md
- Added tags to .gitignore to avoid checking in tags file.
2013-03-28 15:41:26 +05:30
Dhruva Sagar
87f9e9d3f5 Updated Table Mode
- Added recommended check for vi compatibility.
- Updated docs.
2013-03-26 16:46:40 +05:30
Dhruva Sagar
e997144d2f Releasing v2.1.3
- Fixed #1. Added new option `g:table_mode_no_border_padding` which if
  set to 1 (set to 0 by default) removes the padding around borders (and
  the text too), sets `g:table_mode_align` to `'c0'` for achieving the
  same.
2013-03-25 11:04:14 +05:30
Dhruva Sagar
554c57703f Minor refactoring 2013-03-23 12:40:48 +05:30
Dhruva Sagar
60ab92cd35 Updated doc & README.md 2013-03-21 13:37:30 +05:30
Dhruva Sagar
503271fca5 Fixed #4 2013-03-21 13:35:16 +05:30
Dhruva Sagar
b789e2c86f Fixed #3 2013-03-21 12:41:02 +05:30
Dhruva Sagar
7b89b6b50d Insert mode mapping is for current buffer only #2 2013-03-21 12:16:27 +05:30
Dhruva Sagar
28dc1626ab Merge branch 'master' of github.com:dhruvasagar/vim-table-mode 2013-03-21 08:47:53 +05:30
Dhruva Sagar
f8610cebdb Releasing v2.1.1
- Moved some code around for better readability.
- Added new option g:table_mode_align for allowing the user to set the
  format option for aligning the text, this is passed directly to
  Tabular.
- Updated vim doc.
- Updated README.md
2013-03-21 08:46:18 +05:30
Dhruva Sagar
da871cac51 Releasing v2.1.1
- Moved some code around for better readability.
- Added new option g:table_mode_align for allowing the user to set the
  format option for aligning the text, this is passed directly to
  Tabular.
- Updated vim doc.
- Updated README.md
2013-03-21 08:44:26 +05:30
7 changed files with 680 additions and 168 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
tags

48
CHANGELOG.md Normal file
View File

@@ -0,0 +1,48 @@
# Change Log
## Version 2.4.0
* Added Table Cell text object.
* Added api to delete entire table row.
* Added api to delete entire table column.
## Version 2.3.0
* Refactored realignment logic. Generating borders by hand.
## Version 2.2.2
* Added mapping for realigning table columns.
* Added table motions to move around in the table.
## Version 2.2.1
* Added feature to allow Table-Mode to work within comments. Uses
'commentstring' option of vim to identify comments, so it should work for
most filetypes as long as 'commentstring' option has been set. This is
usually done appropriately in filetype plugins.
## Version 2.2
* Improved :Tableize to now accept a {pattern} just like :Tabular to match the
delimiter.
## Version 2.1.3 :
* Bug Fix #1, added new option `g:table_mode_no_border_padding` which removes
padding from the border.
## Version 2.1.2 :
* Bug Fixes #2, #3 & #4
## Version 2.1.1 :
* Added option `g:table_mode_align` to allow setting Tabular format option for
more control on how Tabular aligns text.
## Version 2.1 :
* VIM loads plugins in alphabetical order and so table-mode would be loaded
before Tabularize which it depends on. Hence Moved plugin into an after
plugin. Checking if Tabularize is available and finish immidiately if it's
not.
## Version 2.0 :
* Moved bulk of code to autoload for vimscript optimisation.
## Version 1.1 :
* Added Tableize command and mapping to convert existing content into a table.
## Version 1.0 :
* First stable release, create tables as you type.

View File

@@ -4,20 +4,9 @@ An awesome automatic table creator & formatter allowing one to create neat
tables as you type.
## Change Log
### Version 2.1 :
* VIM loads plugins in alphabetical order and so table-mode would be loaded
before Tabularize which it depends on. Hence Moved plugin into an after
plugin. Checking if Tabularize is available and finish immidiately if it's
not.
### Version 2.0 :
* Moved bulk of code to autoload for vimscript optimisation.
### Version 1.1 :
* Added Tableize command and mapping to convert existing content into a table.
### Version 1.0 :
* First stable release, create tables as you type.
See <a
href="https://github.com/dhruvasagar/vim-table-mode/blob/master/CHANGELOG.md">
CHANGELOG.md </a>
## Getting Started
### Installation
@@ -69,6 +58,10 @@ sure Tabular is installed and loaded into your runtime to ensure this works.
`:line1,line2Tableize`, but this is not that intuitive. You can also use
the mapping `<Leader>T` with a `[count]` to apply it to the next `[count]`
lines in usual vim style.
- Move between cells :
Now you can move between cells using table mode motions. Check `:h
table-mode-motion-prefix` for more details.
### Demo

View File

@@ -4,7 +4,7 @@
" Author: Dhruva Sagar <http://dhruvasagar.com/>
" License: MIT (http://www.opensource.org/licenses/MIT)
" Website: http://github.com/dhruvasagar/vim-table-mode
" Version: 2.1
" Version: 2.4.0
" Note: This plugin was heavily inspired by the 'CucumberTables.vim'
" (https://gist.github.com/tpope/287147) plugin by Tim Pope and
" uses a small amount of code from it.
@@ -33,6 +33,11 @@ if !exists(':Tabularize')
endif
" }}}1
" Avoiding side effects {{{1
let s:save_cpo = &cpo
set cpo&vim
" }}}1
function! s:SetGlobalOptDefault(opt, val) "{{{1
if !exists('g:' . a:opt)
let g:{a:opt} = a:val
@@ -45,25 +50,63 @@ call s:SetGlobalOptDefault('table_mode_border', 1)
call s:SetGlobalOptDefault('table_mode_corner', '+')
call s:SetGlobalOptDefault('table_mode_separator', '|')
call s:SetGlobalOptDefault('table_mode_fillchar', '-')
call s:SetGlobalOptDefault('table_mode_toggle_map', '<Leader>tm')
call s:SetGlobalOptDefault('table_mode_toggle_map', '<LocalLeader>tm')
call s:SetGlobalOptDefault('table_mode_always_active', 0)
call s:SetGlobalOptDefault('table_mode_delimiter', ',')
call s:SetGlobalOptDefault('table_mode_tableize_map', '<Leader>T')
call s:SetGlobalOptDefault('table_mode_tableize_map', '<Leader>tt')
call s:SetGlobalOptDefault('table_mode_tableize_op_map', '<Leader>T')
call s:SetGlobalOptDefault('table_mode_align', 'l1')
call s:SetGlobalOptDefault('table_mode_realign_map', '<Leader>tr')
call s:SetGlobalOptDefault('table_mode_motion_prefix', '<Leader>t')
call s:SetGlobalOptDefault('table_mode_cell_text_object', 'tc')
call s:SetGlobalOptDefault('table_mode_delete_row_map', '<Leader>tdd')
call s:SetGlobalOptDefault('table_mode_delete_column_map', '<Leader>tdc')
"}}}1
function! s:TableMotion() "{{{1
let direction = nr2char(getchar())
for i in range(v:count1)
call tablemode#TableMotion(direction)
endfor
endfunction
" }}}1
" Define Commands & Mappings {{{1
if !g:table_mode_always_active
if !g:table_mode_always_active "{{{2
exec "nnoremap <silent> " . g:table_mode_toggle_map .
\ " <Esc>:call tablemode#TableModeToggle()<CR>"
command! -nargs=0 TableModeToggle call tablemode#TableModeToggle()
command! -nargs=0 TableModeEnable call tablemode#TableModeEnable()
command! -nargs=0 TableModeDisable call tablemode#TableModeDisable()
endif
else
let table_mode_separator_map = g:table_mode_separator
" '|' is a special character, we need to map <Bar> instead
if g:table_mode_separator ==# '|' | let table_mode_separator_map = '<Bar>' | endif
command! -nargs=0 -range Tableize <line1>,<line2>call tablemode#TableizeRange()
exec "xnoremap <silent> " . g:table_mode_tableize_map . " :Tableize<CR>"
exec "nnoremap <silent> " . g:table_mode_tableize_map . " :Tableize<CR>"
execute "inoremap <silent> " . table_mode_separator_map . ' ' .
\ table_mode_separator_map . "<Esc>:call tablemode#TableizeInsertMode()<CR>a"
unlet table_mode_separator_map
endif
" }}}2
command! -nargs=? -range Tableize <line1>,<line2>call tablemode#TableizeRange(<q-args>)
execute "xnoremap <silent> " . g:table_mode_tableize_map . " :Tableize<CR>"
execute "nnoremap <silent> " . g:table_mode_tableize_map . " :Tableize<CR>"
execute "xnoremap <silent> " . g:table_mode_tableize_op_map . " :<C-U>call tablemode#TableizeByDelimiter()<CR>"
execute "nnoremap <silent> " . g:table_mode_realign_map . " :<C-U>call tablemode#TableRealign('.')<CR>"
execute "nnoremap <silent> " . g:table_mode_motion_prefix . " :<C-U>call <SID>TableMotion()<CR>"
execute "onoremap <silent> " . g:table_mode_cell_text_object . " :<C-U>call tablemode#CellTextObject()<CR>"
execute "nnoremap <silent> " . g:table_mode_delete_row_map . " :<C-U>call tablemode#DeleteRow()<CR>"
execute "nnoremap <silent> " . g:table_mode_delete_column_map . " :<C-U>call tablemode#DeleteColumn()<CR>"
"}}}1
" Avoiding side effects {{{1
let &cpo = s:save_cpo
" }}}1
" ModeLine {{{
" vim:fdm=marker
" vim:fdl=0 fdm=marker

View File

@@ -4,7 +4,7 @@
" Author: Dhruva Sagar <http://dhruvasagar.com/>
" License: MIT (http://www.opensource.org/licenses/MIT)
" Website: http://github.com/dhruvasagar/vim-table-mode
" Version: 2.1
" Version: 2.4.0
" Note: This plugin was heavily inspired by the 'CucumberTables.vim'
" (https://gist.github.com/tpope/287147) plugin by Tim Pope and
" uses a small amount of code from it.
@@ -35,54 +35,33 @@ function! s:Strlen(text)
endfunction
" }}}2
function! s:CountSeparator(line, separator) "{{{2
return s:Strlen(substitute(getline(a:line), '[^' . a:separator . ']', '', 'g'))
endfunction
" }}}2
function! s:UpdateLineBorder(line) "{{{2
let cline = a:line
let hf = '^\s*' . g:table_mode_corner . '[' . g:table_mode_corner . ' ' . g:table_mode_fillchar . ']*' . g:table_mode_corner . '\?\s*$'
let curr_line_count = s:CountSeparator(cline, g:table_mode_separator)
if getline(cline-1) =~# hf
let prev_line_count = s:CountSeparator(cline-1, g:table_mode_corner)
if curr_line_count > prev_line_count
exec 'normal! kA' . repeat(g:table_mode_corner, curr_line_count - prev_line_count) . "\<Esc>j"
endif
function! s:GetCommentStart() "{{{2
let cstring = &commentstring
if s:Strlen(cstring) > 0
return substitute(split(substitute(cstring, '%s', ' ', 'g'))[0], '.', '\\\0', 'g')
else
call append(cline-1, repeat(g:table_mode_corner, curr_line_count))
let cline = a:line + 1
endif
if getline(cline+1) =~# hf
let next_line_count = s:CountSeparator(cline+1, g:table_mode_corner)
if curr_line_count > next_line_count
exec 'normal! jA' . repeat(g:table_mode_corner, curr_line_count - next_line_count) . "\<Esc>k"
end
else
call append(cline, repeat(g:table_mode_corner, curr_line_count))
return ''
endif
endfunction
" }}}2
function! s:FillTableBorder() "{{{2
let current_col = col('.')
let current_line = line('.')
execute 'silent! %s/' . g:table_mode_corner . ' \zs\([' . g:table_mode_fillchar . ' ]*\)\ze ' . g:table_mode_corner . '/\=repeat("' . g:table_mode_fillchar . '", s:Strlen(submatch(0)))/g'
call cursor(current_line, current_col)
function! s:StartExpr() "{{{2
let cstart = s:GetCommentStart()
if s:Strlen(cstart) > 0
return '^\s*\(' . cstart . '\)\?\s*'
else
return '^\s*'
endif
endfunction
" }}}2
function! s:Tableizeline(line) "{{{2
call s:ConvertDelimiterToSeparator(a:line)
call s:UpdateLineBorder(a:line)
exec 'Tabularize/[' . g:table_mode_separator . g:table_mode_corner . ']/l1'
endfunction
" }}}2
function! s:ConvertDelimiterToSeparator(line) "{{{2
execute 'silent! ' . a:line . 's/^\s*\zs\ze.\|' . g:table_mode_delimiter . '\|$/' . g:table_mode_separator . '/g'
function! s:StartCommentExpr() "{{{2
let cstartexpr = s:GetCommentStart()
if s:Strlen(cstartexpr) > 0
return '^\s*' . cstartexpr . '\s*'
else
return ''
endif
endfunction
" }}}2
@@ -94,35 +73,16 @@ function! s:IsTableModeActive() "{{{2
endfunction
" }}}2
function! s:Tableize() "{{{2
if s:IsTableModeActive() && getline('.') =~# ('^\s*' . g:table_mode_separator)
let column = s:Strlen(substitute(getline('.')[0:col('.')], '[^' . g:table_mode_separator . ']', '', 'g'))
let position = s:Strlen(matchstr(getline('.')[0:col('.')], '.*' . g:table_mode_separator . '\s*\zs.*'))
if g:table_mode_border | call s:UpdateLineBorder(line('.')) | endif
exec 'Tabularize/[' . g:table_mode_separator . g:table_mode_corner . ']/l1'
if g:table_mode_border | call s:FillTableBorder() | endif
normal! 0
call search(repeat('[^' . g:table_mode_separator . ']*' . g:table_mode_separator, column) . '\s\{-\}' . repeat('.', position), 'ce', line('.'))
endif
endfunction
" }}}2
function! s:TableModeSeparatorMap() "{{{2
if g:table_mode_separator ==# '|'
let table_mode_separator_map = '<Bar>'
else
let table_mode_separator_map = g:table_mode_separator
endif
return table_mode_separator_map
endfunction
" }}}2
function! s:ToggleMapping() "{{{2
if exists('b:table_mode_active') && b:table_mode_active
exec "inoremap <silent> " . s:TableModeSeparatorMap() . ' ' .
\ s:TableModeSeparatorMap() . "<Esc>:call <SID>Tableize()<CR>a"
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
execute "inoremap <silent> <buffer> " . b:table_mode_separator_map . ' ' .
\ b:table_mode_separator_map . "<Esc>:call tablemode#TableizeInsertMode()<CR>a"
else
exec "iunmap <silent> " . s:TableModeSeparatorMap()
execute "iunmap <silent> <buffer> " . b:table_mode_separator_map
endif
endfunction
" }}}2
@@ -133,10 +93,154 @@ function! s:SetActive(bool) "{{{2
endfunction
" }}}2
function! s:Line(line) "{{{2
if type(a:line) == type('')
return line(a:line)
else
return a:line
endif
endfunction
" }}}2
function! s:GenerateBorder(line) "{{{2
let line = s:Line(a:line)
let border = substitute(getline(line)[stridx(getline(line), g:table_mode_separator):-1], 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(line) =~# cstartexpr
let indent = matchstr(getline(line), s:StartCommentExpr())
return indent . border
elseif getline(line) =~# s:StartExpr()
let indent = matchstr(getline(line), s:StartExpr())
return indent . border
else
return border
endif
endfunction
" }}}2
function! s:UpdateLineBorder(line) "{{{2
let line = s:Line(a:line)
let hf = s:StartExpr() . g:table_mode_corner . '[' . g:table_mode_corner .
\ g:table_mode_fillchar . ']*' . g:table_mode_corner . '\?\s*$'
let border = s:GenerateBorder(line)
let [prev_line, next_line] = [getline(line-1), getline(line+1)]
if next_line =~# hf
if s:Strlen(border) > s:Strlen(s:GenerateBorder(line + s:RowGap())) || !tablemode#IsATableRow(line + s:RowGap())
call setline(line+1, border)
endif
else
call append(line, border)
endif
if prev_line =~# hf
if s:Strlen(border) > s:Strlen(s:GenerateBorder(line - s:RowGap())) || !tablemode#IsATableRow(line - s:RowGap())
call setline(line-1, border)
endif
else
call append(line-1, border)
endif
endfunction
" }}}2
function! s:ConvertDelimiterToSeparator(line, ...) "{{{2
let delim = g:table_mode_delimiter
if a:0 | let delim = a:1 | endif
if delim ==# ','
silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs,\\ze[^\'\"]*[\'\"]/__COMMA__/g"
endif
silent! execute a:line . 's/' . s:StartExpr() . '\zs\ze.\|' . delim . '\|$/' .
\ g:table_mode_separator . '/g'
if delim ==# ','
silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs__COMMA__\\ze[^\'\"]*[\'\"]/,/g"
endif
endfunction
" }}}2
function! s:Tableizeline(line, ...) "{{{2
let delim = g:table_mode_delimiter
if a:0 && type(a:1) == type('') && !empty(a:1) | let delim = a:1[1:-1] | endif
call s:ConvertDelimiterToSeparator(a:line, delim)
if g:table_mode_border | call s:UpdateLineBorder(a:line) | endif
endfunction
" }}}2
function! s:IsFirstCell() "{{{2
return tablemode#ColumnNr('.') ==# 1
endfunction
" }}}2
function! s:IsLastCell() "{{{2
return tablemode#ColumnNr('.') ==# tablemode#ColumnCount('.')
endfunction
" }}}2
function! s:MoveToFirstRow() "{{{2
if tablemode#IsATableRow('.')
let line = s:Line('.')
while line > 0
if !tablemode#IsATableRow(line)
break
endif
let line = line - s:RowGap()
endwhile
call cursor(line + s:RowGap(), col('.'))
endif
endfunction
" }}}2
function! s:MoveToLastRow() "{{{2
if tablemode#IsATableRow('.')
let line = s:Line('.')
while line <= line('$')
if !tablemode#IsATableRow(line)
break
endif
let line = line + s:RowGap()
endwhile
call cursor(line - s:RowGap(), col('.'))
endif
endfunction
" }}}2
function! s:MoveToStartOfCell() "{{{2
if getline('.')[col('.')-1] ==# g:table_mode_separator && !s:IsLastCell()
normal! 2l
else
execute 'normal! F' . g:table_mode_separator . '2l'
endif
endfunction
" }}}2
function! s:RowGap() "{{{2
if g:table_mode_border
return 2
else
return 1
endif
endfunction
" }}}2
" }}}1
" Public API {{{1
function! tablemode#TableizeInsertMode() "{{{2
if s:IsTableModeActive() && getline('.') =~# (s:StartExpr() . g:table_mode_separator)
let column = s:Strlen(substitute(getline('.')[0:col('.')], '[^' . g:table_mode_separator . ']', '', 'g'))
let position = s:Strlen(matchstr(getline('.')[0:col('.')], '.*' . g:table_mode_separator . '\s*\zs.*'))
call tablemode#TableRealign('.')
normal! 0
call search(repeat('[^' . g:table_mode_separator . ']*' . g:table_mode_separator, column) . '\s\{-\}' . repeat('.', position), 'ce', line('.'))
endif
endfunction
" }}}2
function! tablemode#TableModeEnable() "{{{2
call s:SetActive(1)
endfunction
@@ -157,22 +261,231 @@ function! tablemode#TableModeToggle() "{{{2
endfunction
" }}}2
function! tablemode#TableizeRange() range "{{{2
call s:Tableizeline(a:firstline)
function! tablemode#TableizeRange(...) range "{{{2
let shift = 1
if g:table_mode_border | let shift = shift + 1 | endif
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+3
while lnum <= (a:firstline + (a:lastline - a:firstline+1)*2)
call s:Tableizeline(lnum)
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)
undojoin
let lnum = lnum + 2
let lnum = lnum + shift
endwhile
call s:FillTableBorder()
if g:table_mode_border | call tablemode#TableRealign(lnum - shift) | endif
endfunction
" }}}2
function! tablemode#TableizeByDelimiter() "{{{2
let delim = input('/')
if delim =~# "\<Esc>" || delim =~# "\<C-C>" | return | endif
let vm = visualmode()
if vm ==? 'line' || vm ==? 'V'
exec line("'<") . ',' . line("'>") . "call tablemode#TableizeRange('/' . delim)"
endif
endfunction
" }}}2
function! tablemode#TableRealign(line) "{{{2
let line = 0
if type(a:line) == type('')
let line = line(a:line)
else
let line = a:line
endif
let [lnums, lines] = [[], []]
let tline = line
while tline > 0
if tablemode#IsATableRow(tline)
call insert(lnums, tline)
call insert(lines, getline(tline))
else
break
endif
let tline = tline - s:RowGap()
endwhile
let tline = line + s:RowGap()
while tline <= line('$')
if tablemode#IsATableRow(tline)
call add(lnums, tline)
call add(lines, getline(tline))
else
break
endif
let tline = tline + s:RowGap()
endwhile
call tabular#TabularizeStrings(lines, g:table_mode_separator)
for lnum in lnums
let index = index(lnums, lnum)
call setline(lnum, lines[index])
undojoin
call s:UpdateLineBorder(lnum)
endfor
endfunction
" }}}2
function! tablemode#IsATableRow(line) "{{{2
return getline(a:line) =~# (s:StartExpr() . g:table_mode_separator)
endfunction
" }}}2
function! tablemode#RowCount(line) "{{{2
let line = s:Line(a:line)
let [tline, totalRowCount] = [line, 0]
while tline > 0
if tablemode#IsATableRow(tline)
let totalRowCount = totalRowCount + 1
else
break
endif
let tline = tline - s:RowGap()
endwhile
let tline = line + s:RowGap()
while tline <= line('$')
if tablemode#IsATableRow(tline)
let totalRowCount = totalRowCount + 1
else
break
endif
let tline = tline + s:RowGap()
endwhile
return totalRowCount
endfunction
" }}}2
function! tablemode#RowNr(line) "{{{2
let line = s:Line(a:line)
let rowNr = 0
while line > 0
if tablemode#IsATableRow(line)
let rowNr = rowNr + 1
else
break
endif
let line = line - s:RowGap()
endwhile
return rowNr
endfunction
" }}}2
function! tablemode#ColumnCount(line) "{{{2
let line = s:Line(a:line)
return s:Strlen(substitute(getline(line), '[^' . g:table_mode_separator . ']', '', 'g'))-1
endfunction
" }}}2
function! tablemode#ColumnNr(pos) "{{{2
let pos = []
if type(a:pos) == type('')
let pos = [line(a:pos), col(a:pos)]
elseif type(a:pos) == type([])
let pos = a:pos
else
return 0
endif
return s:Strlen(substitute(getline(pos[0])[0:pos[1]-2], '[^' . g:table_mode_separator . ']', '', 'g'))
endfunction
" }}}2
function! tablemode#TableMotion(direction) "{{{2
if tablemode#IsATableRow('.')
if a:direction ==# 'l'
if s:IsLastCell()
if !tablemode#IsATableRow(line('.') + s:RowGap()) | return | endif
call tablemode#TableMotion('j')
normal! 0
endif
" If line starts with g:table_mode_separator
if getline('.')[col('.')-1] ==# g:table_mode_separator
normal! 2l
else
execute 'normal! f' . g:table_mode_separator . '2l'
endif
elseif a:direction ==# 'h'
if s:IsFirstCell()
if !tablemode#IsATableRow(line('.') - s:RowGap()) | return | endif
call tablemode#TableMotion('k')
normal! $
endif
" If line ends with g:table_mode_separator
if getline('.')[col('.')-1] ==# g:table_mode_separator
execute 'normal! F' . g:table_mode_separator . '2l'
else
execute 'normal! 2F' . g:table_mode_separator . '2l'
endif
elseif a:direction ==# 'j'
if tablemode#IsATableRow(line('.') + s:RowGap()) | execute 'normal ' . s:RowGap() . 'j' | endif
elseif a:direction ==# 'k'
if tablemode#IsATableRow(line('.') - s:RowGap()) | execute 'normal ' . s:RowGap() . 'k' | endif
endif
endif
endfunction
" }}}2
function! tablemode#CellTextObject() "{{{2
if tablemode#IsATableRow('.')
call s:MoveToStartOfCell()
if v:operator ==# 'y'
normal! v
call search('[^' . g:table_mode_separator . ']\ze\s*' . g:table_mode_separator)
else
execute 'normal! vf' . g:table_mode_separator
endif
endif
endfunction
" }}}2
function! tablemode#DeleteColumn() "{{{2
if tablemode#IsATableRow('.')
for i in range(v:count1)
call s:MoveToFirstRow()
call s:MoveToStartOfCell()
silent! execute "normal! h\<C-V>f" . g:table_mode_separator
call s:MoveToLastRow()
normal! d
endfor
call tablemode#TableRealign('.')
endif
endfunction
" }}}2
function! tablemode#DeleteRow() "{{{2
if tablemode#IsATableRow('.')
for i in range(v:count1)
if tablemode#RowCount('.') ==# 1
normal! kVjjd
else
normal! kVjd
endif
if tablemode#IsATableRow(line('.')+1)
normal! j
else
normal! k
endif
endfor
call tablemode#TableRealign('.')
endif
endfunction
" }}}2
" }}}1
" ModeLine {{{
" vim:fdm=marker

View File

@@ -1,7 +1,7 @@
*table-mode.txt* Table Mode for easy table formatting. v2.1
*table-mode.txt* Table Mode for easy table formatting. v2.4.0
===============================================================================
Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER
VERSION 2.1
VERSION 2.4.0
Author: Dhruva Sagar <http://dhruvasagar.com/>
License: MIT <http://opensource.org/licenses/MIT/>
@@ -34,75 +34,187 @@ make sure it is installed and loaded.
===============================================================================
GETTING STARTED *table-mode-getting-started*
Using Table Mode is dead simple. You simply start typing on a new line with
the table separator - |g:table-mode-separator|, and you just type away! The
plugin does the rest automatically for you as you type. With each additional
separator you add, it aligns the table properly, without having to do
anything else.
Create Table on the fly:
Using Table Mode is dead simple. You simply start typing on a new line
with the table separator - |g:table-mode-separator|, and you just type
away! The plugin does the rest automatically for you as you type. With
each additional separator you add, it aligns the table properly,
without having to do anything else.
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
|g:table-mode-always-active| if you wish.
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 |g:table-mode-always-active| if you wish.
Table Mode allows for creation of tables within comments, it looks at
the 'commentstring' setting to identify whether the current line is
commented.
Tableize content:
Table Mode enables conversion of delimited text into tables. Again
like table creation, this is also applicable within comments.
Manipulation of tables:
Tableize provides 3 easy ways to quickly manipulate tables.
1. Cell Text Object : A text object for table cell
defined by |table-mode-cell-text-object|. You can use it with an
operator (d,c,y) to manipulate it easily. If you delete the cell using
this, it will delete the table separator along with it so if you type
out some new stuff, you will have to re-add it, which triggers a
re-alignment and the table would be formatted again.
2. Delete Column : Delete an entire table column using
|table-mode-delete-column-map| .
3. Delete Row : Delete an entire table row using
|table-mode-delete-row-map|
===============================================================================
OPTIONS *table-mode-options*
Overview:
|table-mode-options-loaded| .......... Disable the plugin
|table-mode-options-border| .......... Enable border
|table-mode-options-corner| .......... Set corner character
|table-mode-options-separator| ....... Set separator character
|table-mode-options-fillchar| ........ Set table fillchar character
|table-mode-options-toggle-map| ...... Set table mode toggle mapping
|table-mode-options-always-active| ... Set table mode to always enabled
|table-mode-options-delimiter| ....... Set the delimiter for Tableize
|table-mode-loaded| ............. Disable the plugin.
|table-mode-border| ............. Enable border.
|table-mode-corner| ............. Set corner character.
|table-mode-separator| .......... Set separator character.
|table-mode-fillchar| ........... Set table fillchar character.
|table-mode-toggle-map| ......... Set table mode toggle mapping.
|table-mode-always-active| ...... Set table mode to always enabled.
|table-mode-delimiter| .......... Set the delimiter for Tableize.
|table-mode-tableize-map| ....... Set mapping for Tableize.
|table-mode-tableize-op-map| .... Set mapping for Tableize with input.
|table-mode-align| .............. Set the text alignment for
Tableize.
|table-mode-no-border-padding| .. Set for no border padding.
|table-mode-realign-map| ........ Set mapping for table realigning.
|table-mode-motion-prefix| ...... Set prefix for table mode motions.
|table-mode-cell-text-object| ... Set mapping for table cell object.
|table-mode-delete-row-map| ..... Set mapping for deleting table row.
|table-mode-delete-column-map| .. Set mapping for deleting table
column.
g:table_mode_loaded *table-mode-options-loaded*
g:table_mode_loaded *table-mode-loaded*
Use this option to disable the plugin: >
let g:table_mode_loaded = 1
<
g:table_mode_border *table-mode-options-border*
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-options-corner*
g:table_mode_corner *table-mode-corner*
Use this option to define the table corner character: >
let g:table_mode_corner = '+'
<
g:table_mode_separator *table-mode-options-separator*
g:table_mode_separator *table-mode-separator*
Use this option to define the table column separator character: >
let g:table_mode_separator = '|'
<
This option also defines the trigger to be used to start creating a
table row in insert mode.
g:table_mode_fillchar *table-mode-options-fillchar*
g:table_mode_fillchar *table-mode-fillchar*
Use this option to define the table border fill character: >
let g:table_mode_fillchar = '-'
<
g:table_mode_toggle_map *table-mode-options-toggle-map*
g:table_mode_toggle_map *table-mode-toggle-map*
Use this option to define the mapping for toggling the table mode: >
let g:table_mode_toggle_map = '<Leader>tm'
<
Read |table-mode-mappings-toggle| for more info.
g:table_mode_always_active *table-mode-options-always-active*
g:table_mode_always_active *table-mode-always-active*
Use this option to permanently enable the table mode: >
let g:table_mode_always_active = 0
<
This will trigger table creation once you type the
|table-mode-options-separator| as long as it's the first character on
|table-mode-separator| as long as it's the first character on
the line, which can be annoying. I recommend you to instead use the
|table-mode-mappings-toggle| or |table-mode-commands-toggle| to toggle
the table mode or |table-mode-commands-enable| to enable and
|table-mode-commands-disable| to disable mode when needed.
g:table_mode_delimiter *table-mode-options-delimiter*
g:table_mode_delimiter *table-mode-delimiter*
Use this option to define the delimiter which used by
|table-mode-commands-tableize|
|table-mode-commands-tableize| >
let g:table_mode_delimiter = ','
<
g:table_mode_tableize_map *table-mode-tableize-map*
Use this option to define the mapping to invoke |:Tableize| with
default delimiter, i.e. |:Tableize| without input. >
let g:table_mode_tableize_map = '<Leader>tt'
<
g:table_mode_tableize_op_map *table-mode-tableize-op-map*
Use this option to define the mapping to invoke |:Tableize| with input
parameter. This option will ask for command-line input {pattern} that
defines the delimiter. >
let g:table_mode_tableize_op_map = '<Leader>T'
<
g:table_mode_align *table-mode-align*
Use this option to define the format for text alignment to be used for
the tables. Go through |tabular-walkthrough| for details on how to set
the format options for alignment. >
let g:table_mode_align = 'l1'
<
g:table_mode_no_border_padding *table-mode-no-border-padding*
Use this option to remove the border padding (extra spaces around the
|table-mode-fillchar|). >
let g:table_mode_no_border_padding = 0
<
NOTE this option changes |table-mode-align| to 'c0', so that
there is no extra padding around the contents.
g:table_mode_realign_map *table-mode-realign-map*
Use this option to define the mapping for realigning table columns.
This is useful in case you make edits to an existing table. >
let g:table_mode_realign_map = '<Leader>tr'
<
g:table_mode_motion_prefix *table-mode-motion-prefix*
Use this option to define the prefix for table mode motion commands. >
let g:table_mode_motion_prefix = '<Leader>t'
<
You can move to the next / previous row / column using the motion
commands. The motions 'hjkl' follow the prefix are in accordance to
standard vim character motions to make them easier to remember. They
may also be preceeded with a [count]. The 'h', 'l' (left and right
motions) wrap around the table row and move to the previous rows last
column, next rows first column respectively if one exists.
g:table_mode_cell_text_object *table-mode-cell-text-object*
Use this option to define the table mode cell text object. >
let g:table_mode_cell_text_object = 'tc'
<
This text object automatically selects different text depending on the
context.
If you delete the cell using either the 'd' or the 'c'
operator, it will delete cell contents along with the table separator.
In case you do it with 'c' while you add new content for the cell, you
will have to re-add the |table-mode-separator|, which will trigger the
re-alignment of the table again and format it correctly.
If you simply want to yank the table content, this text object will
select only the table cell contents, without the padding (extra space
around the text) or the |table-mode-separator|.
g:table_mode_delete_row_map *table-mode-delete-row-map*
Use this option to define the mapping for deletion of the entire table
row. You can delete multiple rows by preceeding this with a [count]. >
let g:table_mode_delete_column_map = '<Leader>tdd'
g:table_mode_delete_column_map *table-mode-delete-column-map*
USe this option to define the mapping for deletion of the entire table
column. You can delete multiple columns to the right by preceeding
this with a [count] >
let g:table_mode_delete_column_map = '<Leader>tdc'
<
===============================================================================
MAPPINGS *table-mode-mappings*
@@ -112,52 +224,82 @@ MAPPINGS *table-mode-mappings*
using the |toggle-mode-options-toggle-map| option.
NOTE This is applicable only if
|table-mode-options-always-active| is not set.
|table-mode-always-active| is not set.
*table-mode-mappings-trigger*
| Trigger table creation in table mode. You can change this
using the |toggle-mode-options-separator| option.
<Leader>T Triggers |table-mode-commands-tableize| on the visually
<Leader>tt Triggers |table-mode-commands-tableize| on the visually
selected content.
*table-mode-mappings-op-trigger*
<Leader>T Triggers |table-mode-commands-tableize| on the visually
selected asking for user to input the delimiter.
*table-mode-mappings-realign*
<Leader>tr Realigns table columns
*table-mode-mappings-motions*
<Leader>t[hjkl] Move to previous | below | above | right cell in the table.
*table-mode-mappings-delete-row*
<Leader>tdd Delete the entire table row you are on or multiple rows using
a [count]. You can change this using |table-mode-delete-row-map|
option.
*table-mode-mappings-delete-column*
<Leader>tdc Delete entire table column you are within. You can preceed it
with a [count] to delete multiple columns to the right. You
can change this using |table-mode-delete-column-map| option.
===============================================================================
COMMANDS *table-mode-commands*
*:TableModeToggle*
*table-mode-commands-toggle*
*table-mode-:TableModeToggle*
:TableModeToggle
Toggles the table mode. Same effect as |toggle-mode-mappings-toggle|.
NOTE this is applicable only if |table-mode-options-always-active| is
NOTE this is applicable only if |table-mode-always-active| is
not set.
*:TableModeEnable*
*table-mode-commands-enable*
*table-mode-:TableModeEnable*
:TableModeEnable
Enables Table Mode.
NOTE this is applicable only if |table-mode-options-always-active| is
NOTE this is applicable only if |table-mode-always-active| is
not set.
*:TableModeDisable*
*table-mode-commands-disable*
*table-mode-:TableModeDisable*
:TableModeDisable
Disables Table Mode.
NOTE this is applicable only if |table-mode-options-always-active| is
NOTE this is applicable only if |table-mode-always-active| is
not set.
*:Tableize*
:Tableize *table-mode-commands-tableize*
*table-mode-:Tableize*
:Tableize
This converts the current line into a table if it consists of
|table-mode-options-delimiter|. This accepts a range, without which it
|table-mode-delimiter|. This accepts a range, without which it
applies on the current line.
This accepts a {pattern} similar to Tabular which defines the
delimiter. eg.) >
:Tableize/;
<
The above command will Tableize using ';' as the delimiter.
NOTE this is optional, by default without the expression it will
tableize the content using |g:table-mode-delimiter| as the delimiter.
===============================================================================
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.git) or get in touch with me
Github (http://github.com/dhruvasagar/table-mode) or get in touch with me
directly via e-mail at dhruva 'dot' sagar 'at' gmail.com.
===============================================================================
@@ -166,4 +308,4 @@ REPORT ISSUES *table-mode-report-issues*
If you discover any issues, please report them at
http://github.com/dhruvasagar/table-mode/issues.
vim:tw=78:ts=8:ft=help:norl:
vim:tw=78:ts=8:ft=help:norl:ai

View File

@@ -1,28 +0,0 @@
:TableModeDisable table-mode.txt /*:TableModeDisable*
:TableModeEnable table-mode.txt /*:TableModeEnable*
:TableModeToggle table-mode.txt /*:TableModeToggle*
:Tableize table-mode.txt /*:Tableize*
table-mode-commands table-mode.txt /*table-mode-commands*
table-mode-commands-disable table-mode.txt /*table-mode-commands-disable*
table-mode-commands-enable table-mode.txt /*table-mode-commands-enable*
table-mode-commands-tableize table-mode.txt /*table-mode-commands-tableize*
table-mode-commands-toggle table-mode.txt /*table-mode-commands-toggle*
table-mode-contents table-mode.txt /*table-mode-contents*
table-mode-contributing table-mode.txt /*table-mode-contributing*
table-mode-getting-started table-mode.txt /*table-mode-getting-started*
table-mode-introduction table-mode.txt /*table-mode-introduction*
table-mode-mappings table-mode.txt /*table-mode-mappings*
table-mode-mappings-toggle table-mode.txt /*table-mode-mappings-toggle*
table-mode-mappings-trigger table-mode.txt /*table-mode-mappings-trigger*
table-mode-options table-mode.txt /*table-mode-options*
table-mode-options-always-active table-mode.txt /*table-mode-options-always-active*
table-mode-options-border table-mode.txt /*table-mode-options-border*
table-mode-options-corner table-mode.txt /*table-mode-options-corner*
table-mode-options-delimiter table-mode.txt /*table-mode-options-delimiter*
table-mode-options-fillchar table-mode.txt /*table-mode-options-fillchar*
table-mode-options-loaded table-mode.txt /*table-mode-options-loaded*
table-mode-options-separator table-mode.txt /*table-mode-options-separator*
table-mode-options-toggle-map table-mode.txt /*table-mode-options-toggle-map*
table-mode-report-issues table-mode.txt /*table-mode-report-issues*
table-mode-requirements table-mode.txt /*table-mode-requirements*
table-mode.txt table-mode.txt /*table-mode.txt*