From 241d0ccba002c7eb77511e05875d7eca36a58d54 Mon Sep 17 00:00:00 2001 From: Dhruva Sagar Date: Wed, 1 May 2013 01:53:09 +0530 Subject: [PATCH] Finished #6 - Updated doc. - Bumped version. - Added a mapping for realigning table columns. - Added mapping for moving to next / prev row / column. --- after/plugin/table-mode.vim | 15 ++++- autoload/tablemode.vim | 108 ++++++++++++++++++++++++++++++++++-- doc/table-mode.txt | 23 +++++++- 3 files changed, 137 insertions(+), 9 deletions(-) diff --git a/after/plugin/table-mode.vim b/after/plugin/table-mode.vim index 3d19ec1..ff0dad1 100644 --- a/after/plugin/table-mode.vim +++ b/after/plugin/table-mode.vim @@ -4,7 +4,7 @@ " Author: Dhruva Sagar " License: MIT (http://www.opensource.org/licenses/MIT) " Website: http://github.com/dhruvasagar/vim-table-mode -" Version: 2.2.1 +" Version: 2.2.2 " 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. @@ -57,8 +57,18 @@ call s:SetGlobalOptDefault('table_mode_tableize_map', 'tt') call s:SetGlobalOptDefault('table_mode_tableize_op_map', 'T') call s:SetGlobalOptDefault('table_mode_align', 'l1') call s:SetGlobalOptDefault('table_mode_no_border_padding', '0') +call s:SetGlobalOptDefault('table_mode_realign_map', 'tr') +call s:SetGlobalOptDefault('table_mode_motion_prefix', 't') "}}}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 exec "nnoremap " . g:table_mode_toggle_map . @@ -80,6 +90,9 @@ command! -nargs=? -range Tableize ,call tablemode#TableizeRange( " . g:table_mode_tableize_map . " :Tableize" execute "nnoremap " . g:table_mode_tableize_map . " :Tableize" execute "xnoremap " . g:table_mode_tableize_op_map . " :call tablemode#TableizeByDelimiter()" + +execute "nnoremap " . g:table_mode_realign_map . " :call tablemode#TableRealign()" +execute "nnoremap " . g:table_mode_motion_prefix . " :call TableMotion()" "}}}1 " Avoiding side effects {{{1 diff --git a/autoload/tablemode.vim b/autoload/tablemode.vim index 1a53c36..edd9783 100644 --- a/autoload/tablemode.vim +++ b/autoload/tablemode.vim @@ -4,7 +4,7 @@ " Author: Dhruva Sagar " License: MIT (http://www.opensource.org/licenses/MIT) " Website: http://github.com/dhruvasagar/vim-table-mode -" Version: 2.2.1 +" Version: 2.2.2 " 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. @@ -171,7 +171,22 @@ function! s:Tableizeline(line, ...) "{{{2 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 - execute 'Tabularize/[' . g:table_mode_separator . g:table_mode_corner . ']/' . g:table_mode_align + call tablemode#TableRealign() +endfunction +" }}}2 + +function! s:ColumnCount(line) "{{{2 + return s:Strlen(substitute(getline(a:line), '[^' . g:table_mode_separator . ']', '', 'g'))-1 +endfunction +" }}}2 + +function! s:IsFirstCell() "{{{2 + return tablemode#TableColumnNr('.') ==# 1 +endfunction +" }}}2 + +function! s:IsLastCell() "{{{2 + return tablemode#TableColumnNr('.') ==# s:ColumnCount('.') endfunction " }}}2 @@ -185,7 +200,7 @@ function! tablemode#TableizeInsertMode() "{{{2 let position = s:Strlen(matchstr(getline('.')[0:col('.')], '.*' . g:table_mode_separator . '\s*\zs.*')) if g:table_mode_border | call s:UpdateLineBorder(line('.')) | endif if g:table_mode_no_border_padding && g:table_mode_align !=# 'c0' | let g:table_mode_align = 'c0' | endif - execute 'Tabularize/[' . g:table_mode_separator . g:table_mode_corner . ']/' . g:table_mode_align + call tablemode#TableRealign() 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('.')) @@ -240,7 +255,88 @@ function! tablemode#TableizeByDelimiter() "{{{2 endfunction " }}}2 -" }}}1 +function! tablemode#TableRealign() "{{{2 + execute 'Tabularize/[' . g:table_mode_separator . g:table_mode_corner . ']/' . g:table_mode_align +endfunction +" }}}2 -" ModeLine {{{ -" vim:fdm=marker +function! tablemode#IsATableRow(line) "{{{2 + return getline(a:line) =~# (s:StartExpr() . g:table_mode_separator) +endfunction +" }}}2 + +function! tablemode#TableRowNr(pos) "{{{2 + let line = 0 + if type(a:pos) == type('') + let line = line(a:pos) + elseif type(a:pos) == type(1) + let line = a:pos + endif + + let rowNr = 0 + while line > 0 + if tablemode#IsATableRow(line) + let rowNr = rowNr + 1 + else + break + endif + let line = line - 2 + endwhile + return rowNr +endfunction +" }}}2 + +function! tablemode#TableColumnNr(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('.') + let rowCount = 1 + if g:table_mode_border | let rowCount = 2 | endif + + if a:direction ==# 'l' + if s:IsLastCell() + if !tablemode#IsATableRow(line('.') + rowCount) | 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 + execute 'normal! 2l' + else + execute 'normal! f' . g:table_mode_separator . '2l' + endif + elseif a:direction ==# 'h' + if s:IsFirstCell() + if !tablemode#IsATableRow(line('.') - rowCount) | 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('.') + rowCount) | execute 'normal ' . rowCount . 'j' | endif + elseif a:direction ==# 'k' + if tablemode#IsATableRow(line('.') - rowCount) | execute 'normal ' . rowCount . 'k' | endif + endif + endif +endfunction +" }}}2 + +" }}}1 diff --git a/doc/table-mode.txt b/doc/table-mode.txt index 227ad35..f87c78c 100644 --- a/doc/table-mode.txt +++ b/doc/table-mode.txt @@ -1,7 +1,7 @@ -*table-mode.txt* Table Mode for easy table formatting. v2.2.1 +*table-mode.txt* Table Mode for easy table formatting. v2.2.2 =============================================================================== Table Mode, THE AWESOME AUTOMATIC TABLE CREATOR & FORMATTER - VERSION 2.2.1 + VERSION 2.2.2 Author: Dhruva Sagar License: MIT @@ -61,6 +61,8 @@ Overview: |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. g:table_mode_loaded *table-mode-loaded* Use this option to disable the plugin: > @@ -138,6 +140,21 @@ g:table_mode_no_border_padding *table-mode-no-border-padding* < 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 = '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 = '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]. =============================================================================== MAPPINGS *table-mode-mappings* @@ -159,6 +176,8 @@ MAPPINGS *table-mode-mappings* T Triggers |table-mode-commands-tableize| on the visually selected asking for user to input the delimiter. + *table-mode-mappings-realign* +tr Realigns table columns =============================================================================== COMMANDS *table-mode-commands*