Compare commits

...

1 Commits

Author SHA1 Message Date
Dhruva Sagar
2e909c0668 Releasing Table Mode v3.1
* Removed table border and related options. You can now optionally have
  a header instead, simply add a table header and add a border to it
  triggered by the vim iabbrev '+-' on the line immidiately after the
  header and it will expand to the correct border. It will auto update
  as the table realigns with changes. Similar approach as followed by
  tables in org-mode.
* Fixed bug of incorrect indentation of a newly added formula line.
* Fixed bug in ConvertDelimiterToSeparator causing incorrect
  tableization of commented blocks of delimited content.
2013-09-19 02:06:22 +05:30
3 changed files with 80 additions and 78 deletions

View File

@@ -1,10 +1,10 @@
" ============================== Header ==================================={{{ " ============================== Header ======================================
" File: autoload/tablemode.vim " File: autoload/tablemode.vim
" Description: Table mode for vim for creating neat tables. " Description: Table mode for vim for creating neat tables.
" Author: Dhruva Sagar <http://dhruvasagar.com/> " Author: Dhruva Sagar <http://dhruvasagar.com/>
" License: MIT (http://www.opensource.org/licenses/MIT) " License: MIT (http://www.opensource.org/licenses/MIT)
" Website: http://github.com/dhruvasagar/vim-table-mode " Website: http://github.com/dhruvasagar/vim-table-mode
" Version: 3.0 " Version: 3.1
" Note: This plugin was heavily inspired by the 'CucumberTables.vim' " Note: This plugin was heavily inspired by the 'CucumberTables.vim'
" (https://gist.github.com/tpope/287147) plugin by Tim Pope and " (https://gist.github.com/tpope/287147) plugin by Tim Pope and
" uses a small amount of code from it. " uses a small amount of code from it.
@@ -113,6 +113,10 @@ function! s:StartExpr() "{{{2
endif endif
endfunction endfunction
function! s:HeaderBorderExpr() "{{{2
return '^\s*' . g:table_mode_corner . '[' . g:table_mode_fillchar . g:table_mode_corner . ']*' . g:table_mode_corner . '$'
endfunction
function! s:EndExpr() "{{{2 function! s:EndExpr() "{{{2
let cend = s:GetCommentEnd() let cend = s:GetCommentEnd()
if s:Strlen(cend) > 0 if s:Strlen(cend) > 0
@@ -148,7 +152,8 @@ function! s:IsTableModeActive() "{{{2
endfunction endfunction
function! s:RowGap() "{{{2 function! s:RowGap() "{{{2
return g:table_mode_border ? 2 : 1 " Getting rid of borders, so the row gap is now just 1
return 1
endfunction endfunction
function! s:ToggleMapping() "{{{2 function! s:ToggleMapping() "{{{2
@@ -159,8 +164,13 @@ function! s:ToggleMapping() "{{{2
execute "inoremap <silent> <buffer> " . b:table_mode_separator_map . ' ' . execute "inoremap <silent> <buffer> " . b:table_mode_separator_map . ' ' .
\ b:table_mode_separator_map . "<Esc>:call tablemode#TableizeInsertMode()<CR>a" \ b:table_mode_separator_map . "<Esc>:call tablemode#TableizeInsertMode()<CR>a"
execute "inoreabbrev <silent> <buffer> " . g:table_mode_corner .
\ g:table_mode_fillchar . "<Esc>:call tablemode#AddHeaderBorder('.')<CR>A"
else else
execute "iunmap <silent> <buffer> " . b:table_mode_separator_map execute "iunmap <silent> <buffer> " . b:table_mode_separator_map
execute "iunabbrev <silent> <buffer> " . g:table_mode_corner . g:table_mode_fillchar
endif endif
endfunction endfunction
@@ -169,48 +179,24 @@ function! s:SetActive(bool) "{{{2
call s:ToggleMapping() call s:ToggleMapping()
endfunction endfunction
function! s:GenerateBorder(line) "{{{2 function! s:GenerateHeaderBorder(line) "{{{2
let line_val = getline(a:line)
let border = substitute(line_val[stridx(line_val, g:table_mode_separator):strridx(line_val, g:table_mode_separator)], g:table_mode_separator, g:table_mode_corner, 'g')
let border = substitute(border, '[^' . g:table_mode_corner . ']', g:table_mode_fillchar, 'g')
let cstartexpr = s:StartCommentExpr()
if s:Strlen(cstartexpr) > 0 && getline(a:line) =~# cstartexpr
let sce = matchstr(line_val, s:StartCommentExpr())
let ece = matchstr(line_val, s:EndCommentExpr())
return sce . border . ece
elseif getline(a:line) =~# s:StartExpr()
let indent = matchstr(line_val, s:StartExpr())
return indent . border
else
return border
endif
endfunction
function! s:UpdateLineBorder(line) "{{{2
let line = s:Line(a:line) let line = s:Line(a:line)
if tablemode#IsATableRow(line - s:RowGap())
let line_val = getline(line - s:RowGap())
let border = substitute(line_val[stridx(line_val, g:table_mode_separator):strridx(line_val, g:table_mode_separator)], g:table_mode_separator, g:table_mode_corner, 'g')
let border = substitute(border, '[^' . g:table_mode_corner . ']', g:table_mode_fillchar, 'g')
let hf = s:StartExpr() . g:table_mode_corner . '[' . g:table_mode_corner . let cstartexpr = s:StartCommentExpr()
\ g:table_mode_fillchar . ']*' . g:table_mode_corner . '\?' . s:EndExpr() if s:Strlen(cstartexpr) > 0 && getline(line) =~# cstartexpr
let sce = matchstr(line_val, s:StartCommentExpr())
let rowgap = s:RowGap() let ece = matchstr(line_val, s:EndCommentExpr())
let border = s:GenerateBorder(line) return sce . border . ece
elseif getline(line) =~# s:StartExpr()
let [prev_line, next_line] = [getline(line-1), getline(line+1)] let indent = matchstr(line_val, s:StartExpr())
if next_line =~# hf return indent . border
if s:Strlen(border) > s:Strlen(s:GenerateBorder(line + rowgap)) || !tablemode#IsATableRow(line + rowgap) else
call setline(line+1, border) return border
endif endif
else
call append(line, border)
endif
if prev_line =~# hf
if s:Strlen(border) > s:Strlen(s:GenerateBorder(line - rowgap)) || !tablemode#IsATableRow(line - rowgap)
call setline(line-1, border)
endif
else
call append(line-1, border)
endif endif
endfunction endfunction
@@ -220,8 +206,16 @@ function! s:ConvertDelimiterToSeparator(line, ...) "{{{2
if delim ==# ',' if delim ==# ','
silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs,\\ze[^\'\"]*[\'\"]/__COMMA__/g" silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs,\\ze[^\'\"]*[\'\"]/__COMMA__/g"
endif endif
silent! execute a:line . 's/' . s:StartExpr() . '\zs\ze.\|' . delim . '\|.\zs\ze' . s:EndExpr() . '/' .
let [cstart, cend] = [s:GetCommentStart(), s:GetCommentEnd()]
let [match_char_start, match_char_end] = ['.', '.']
if s:Strlen(cend) > 0 | let match_char_end = '[^' . cend . ']' | endif
if s:Strlen(cstart) > 0 | let match_char_start = '[^' . cstart . ']' | endif
silent! execute a:line . 's/' . s:StartExpr() . '\zs\ze' . match_char_start .
\ '\|' . delim . '\|' . match_char_end . '\zs\ze' . s:EndExpr() . '/' .
\ g:table_mode_separator . '/g' \ g:table_mode_separator . '/g'
if delim ==# ',' if delim ==# ','
silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs__COMMA__\\ze[^\'\"]*[\'\"]/,/g" silent! execute a:line . 's/' . "[\'\"][^\'\"]*\\zs__COMMA__\\ze[^\'\"]*[\'\"]/,/g"
endif endif
@@ -231,7 +225,6 @@ function! s:Tableizeline(line, ...) "{{{2
let delim = g:table_mode_delimiter let delim = g:table_mode_delimiter
if a:0 && type(a:1) == type('') && !empty(a:1) | let delim = a:1[1:-1] | endif if a:0 && type(a:1) == type('') && !empty(a:1) | let delim = a:1[1:-1] | endif
call s:ConvertDelimiterToSeparator(a:line, delim) call s:ConvertDelimiterToSeparator(a:line, delim)
if g:table_mode_border | call s:UpdateLineBorder(a:line) | endif
endfunction endfunction
function! s:IsFirstCell() "{{{2 function! s:IsFirstCell() "{{{2
@@ -614,20 +607,14 @@ function! tablemode#TableModeToggle() "{{{2
endfunction endfunction
function! tablemode#TableizeRange(...) range "{{{2 function! tablemode#TableizeRange(...) range "{{{2
let shift = 1 let lnum = a:firstline
if g:table_mode_border | let shift += 1 | endif while lnum < (a:firstline + (a:lastline - a:firstline + 1)*s:RowGap())
call s:Tableizeline(a:firstline, a:1)
undojoin
" The first one causes 2 extra lines for top & bottom border while the
" following lines cause only 1 for the bottom border.
let lnum = a:firstline + shift + (g:table_mode_border > 0)
while lnum < (a:firstline + (a:lastline - a:firstline + 1)*shift)
call s:Tableizeline(lnum, a:1) call s:Tableizeline(lnum, a:1)
undojoin undojoin
let lnum = lnum + shift let lnum = lnum + s:RowGap()
endwhile endwhile
if g:table_mode_border | call tablemode#TableRealign(lnum - shift) | endif call tablemode#TableRealign(lnum - s:RowGap())
endfunction endfunction
function! tablemode#TableizeByDelimiter() "{{{2 function! tablemode#TableizeByDelimiter() "{{{2
@@ -639,18 +626,38 @@ function! tablemode#TableizeByDelimiter() "{{{2
endif endif
endfunction endfunction
function! tablemode#AddHeaderBorder(line) "{{{2
call setline(a:line, s:GenerateHeaderBorder(a:line))
endfunction
function! tablemode#TableRealign(line) "{{{2 function! tablemode#TableRealign(line) "{{{2
let line = s:Line(a:line) let line = s:Line(a:line)
let [lnums, lines] = [[], []] let [lnums, lines] = [[], []]
let tline = line let [bline, tline] = [0, line]
while tablemode#IsATableRow(tline) while tablemode#IsATableRow(tline)
call insert(lnums, tline) call insert(lnums, tline)
call insert(lines, getline(tline)) call insert(lines, getline(tline))
let tline = tline - s:RowGap() let tline = tline - s:RowGap()
endwhile endwhile
" If we reached header walking upwards
if getline(tline) =~# s:HeaderBorderExpr() && tablemode#IsATableRow(tline - s:RowGap())
let bline = tline
let tline = tline - s:RowGap()
" Insert the header line
call insert(lnums, tline)
call insert(lines, getline(tline))
endif
let tline = line + s:RowGap() let tline = line + s:RowGap()
" If we start at header
if !bline && getline(tline) =~# s:HeaderBorderExpr()
let bline = tline
let tline = tline + s:RowGap()
endif
while tablemode#IsATableRow(tline) while tablemode#IsATableRow(tline)
call add(lnums, tline) call add(lnums, tline)
call add(lines, getline(tline)) call add(lines, getline(tline))
@@ -662,9 +669,11 @@ function! tablemode#TableRealign(line) "{{{2
for lnum in lnums for lnum in lnums
let index = index(lnums, lnum) let index = index(lnums, lnum)
call setline(lnum, lines[index]) call setline(lnum, lines[index])
undojoin
call s:UpdateLineBorder(lnum)
endfor endfor
if bline
call tablemode#AddHeaderBorder(bline)
endif
endfunction endfunction
function! tablemode#IsATableRow(line) "{{{2 function! tablemode#IsATableRow(line) "{{{2
@@ -837,6 +846,8 @@ function! tablemode#AddFormula() "{{{2
let fr = input('f=') let fr = input('f=')
let row = tablemode#RowNr('.') let row = tablemode#RowNr('.')
let colm = tablemode#ColumnNr('.') let colm = tablemode#ColumnNr('.')
let indent = indent('.')
let indent_str = repeat(' ', indent)
if fr !=# '' if fr !=# ''
let fr = '$' . row . ',' . colm . '=' . fr let fr = '$' . row . ',' . colm . '=' . fr
@@ -860,7 +871,7 @@ function! tablemode#AddFormula() "{{{2
let [cmss, cmse] = [cms[0], ''] let [cmss, cmse] = [cms[0], '']
endif endif
endif endif
let fr = cmss . ' tmf: ' . fr . ' ' . cmse let fr = indent_str . cmss . ' tmf: ' . fr . ' ' . cmse
call append(fline-1, fr) call append(fline-1, fr)
call cursor(cursor_pos) call cursor(cursor_pos)
endif endif

View File

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

View File

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