mirror of
https://github.com/dhruvasagar/vim-table-mode.git
synced 2025-11-08 11:03:47 -05:00
Fix the column modifications on escaped separators
If a g:table_mode_separator is escaped by a backslash, the table is aligned ignoring this instance of the g:table_mode_separator, but the column deletion and insertion functions did not consider this behaviour. The g:table_mode_escaped_separator regex is simplified and optimized a little bit. Also more care is taken to prevent unexpected behaviour if special characters are used as g:table_mode_separator.
This commit is contained in:
@@ -132,13 +132,11 @@ function! tablemode#spreadsheet#ColumnNr(pos) "{{{2
|
|||||||
return 0
|
return 0
|
||||||
endif
|
endif
|
||||||
let row_start = stridx(getline(pos[0]), g:table_mode_separator)
|
let row_start = stridx(getline(pos[0]), g:table_mode_separator)
|
||||||
return tablemode#utils#strlen(substitute(getline(pos[0])[(row_start):pos[1]-2], '[^' . g:table_mode_separator . ']', '', 'g'))
|
return tablemode#utils#SeparatorCount(getline(pos[0])[row_start:pos[1]-2])
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! tablemode#spreadsheet#ColumnCount(line) "{{{2
|
function! tablemode#spreadsheet#ColumnCount(line) "{{{2
|
||||||
let line = tablemode#utils#line(a:line)
|
return tablemode#utils#SeparatorCount(getline(tablemode#utils#line(a:line))) - 1
|
||||||
|
|
||||||
return tablemode#utils#strlen(substitute(getline(line), '[^' . g:table_mode_separator . ']', '', 'g'))-1
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! tablemode#spreadsheet#IsFirstCell() "{{{2
|
function! tablemode#spreadsheet#IsFirstCell() "{{{2
|
||||||
@@ -150,11 +148,15 @@ function! tablemode#spreadsheet#IsLastCell() "{{{2
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! tablemode#spreadsheet#MoveToStartOfCell() "{{{2
|
function! tablemode#spreadsheet#MoveToStartOfCell() "{{{2
|
||||||
if getline('.')[col('.')-1] ==# g:table_mode_separator && !tablemode#spreadsheet#IsLastCell()
|
if getline('.')[col('.')-1] !=# g:table_mode_separator || tablemode#spreadsheet#IsLastCell()
|
||||||
normal! 2l
|
call search(g:table_mode_escaped_separator_regex, 'b', line('.'))
|
||||||
else
|
|
||||||
execute 'normal! F' . g:table_mode_separator . '2l'
|
|
||||||
endif
|
endif
|
||||||
|
normal! 2l
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! tablemode#spreadsheet#MoveToEndOfCell() "{{{2
|
||||||
|
call search(g:table_mode_escaped_separator_regex, 'z', line('.'))
|
||||||
|
normal! 2h
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! tablemode#spreadsheet#DeleteColumn() "{{{2
|
function! tablemode#spreadsheet#DeleteColumn() "{{{2
|
||||||
@@ -162,7 +164,9 @@ function! tablemode#spreadsheet#DeleteColumn() "{{{2
|
|||||||
for i in range(v:count1)
|
for i in range(v:count1)
|
||||||
call tablemode#spreadsheet#MoveToStartOfCell()
|
call tablemode#spreadsheet#MoveToStartOfCell()
|
||||||
call tablemode#spreadsheet#MoveToFirstRowOrHeader()
|
call tablemode#spreadsheet#MoveToFirstRowOrHeader()
|
||||||
silent! execute "normal! h\<C-V>f" . g:table_mode_separator
|
silent! execute "normal! h\<C-V>"
|
||||||
|
call tablemode#spreadsheet#MoveToEndOfCell()
|
||||||
|
normal! 2l
|
||||||
call tablemode#spreadsheet#MoveToLastRow()
|
call tablemode#spreadsheet#MoveToLastRow()
|
||||||
normal! d
|
normal! d
|
||||||
endfor
|
endfor
|
||||||
@@ -194,7 +198,8 @@ function! tablemode#spreadsheet#InsertColumn(after) "{{{2
|
|||||||
call tablemode#spreadsheet#MoveToFirstRowOrHeader()
|
call tablemode#spreadsheet#MoveToFirstRowOrHeader()
|
||||||
call tablemode#spreadsheet#MoveToStartOfCell()
|
call tablemode#spreadsheet#MoveToStartOfCell()
|
||||||
if a:after
|
if a:after
|
||||||
execute "normal! f".g:table_mode_separator
|
call tablemode#spreadsheet#MoveToEndOfCell()
|
||||||
|
normal! 3l
|
||||||
endif
|
endif
|
||||||
execute "normal! h\<C-V>"
|
execute "normal! h\<C-V>"
|
||||||
call tablemode#spreadsheet#MoveToLastRow()
|
call tablemode#spreadsheet#MoveToLastRow()
|
||||||
|
|||||||
@@ -60,3 +60,7 @@ function tablemode#utils#MoveToLine(line) "{{{2
|
|||||||
execute "normal! ".(-offset)."k"
|
execute "normal! ".(-offset)."k"
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! tablemode#utils#SeparatorCount(str)
|
||||||
|
return tablemode#utils#strlen(substitute(a:str, '\V\C\(\\' . escape(g:table_mode_separator, '\') . '\|\[^' . escape(g:table_mode_separator, ']^-\') . ']\)', '', 'g'))
|
||||||
|
endfunction
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ endfunction
|
|||||||
call s:SetGlobalOptDefault('table_mode_corner', '+')
|
call s:SetGlobalOptDefault('table_mode_corner', '+')
|
||||||
call s:SetGlobalOptDefault('table_mode_verbose', 1)
|
call s:SetGlobalOptDefault('table_mode_verbose', 1)
|
||||||
call s:SetGlobalOptDefault('table_mode_separator', '|')
|
call s:SetGlobalOptDefault('table_mode_separator', '|')
|
||||||
call s:SetGlobalOptDefault('table_mode_escaped_separator_regex', '\(\\\)\@<!' . g:table_mode_separator)
|
call s:SetGlobalOptDefault('table_mode_escaped_separator_regex', '\V\C\\\@1<!'.escape(g:table_mode_separator, '\'))
|
||||||
call s:SetGlobalOptDefault('table_mode_fillchar', '-')
|
call s:SetGlobalOptDefault('table_mode_fillchar', '-')
|
||||||
call s:SetGlobalOptDefault('table_mode_header_fillchar', '-')
|
call s:SetGlobalOptDefault('table_mode_header_fillchar', '-')
|
||||||
call s:SetGlobalOptDefault('table_mode_map_prefix', '<Leader>t')
|
call s:SetGlobalOptDefault('table_mode_map_prefix', '<Leader>t')
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
let g:table_mode_corner = '+'
|
let g:table_mode_corner = '+'
|
||||||
let g:table_mode_separator = '|'
|
let g:table_mode_separator = '|'
|
||||||
let g:table_mode_escaped_separator_regex = '\(\\\)\@<!|'
|
let g:table_mode_escaped_separator_regex = '\V\C\\\@1<!|'
|
||||||
let g:table_mode_fillchar = '-'
|
let g:table_mode_fillchar = '-'
|
||||||
let g:table_mode_header_fillchar = '-'
|
let g:table_mode_header_fillchar = '-'
|
||||||
let g:table_mode_map_prefix = '<Leader>t'
|
let g:table_mode_map_prefix = '<Leader>t'
|
||||||
|
|||||||
9
t/fixtures/escaped_seperator.txt
Normal file
9
t/fixtures/escaped_seperator.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|-------------------+---------------------------|
|
||||||
|
| The \| works as | It can be escaped by a \. |
|
||||||
|
| a separator. | |
|
||||||
|
| | |
|
||||||
|
| Escaping \ with | This feature would |
|
||||||
|
| a \ doesn't work. | be unnecessary, because |
|
||||||
|
| | a separator must be |
|
||||||
|
| | preceded by a space. |
|
||||||
|
|-------------------+---------------------------|
|
||||||
@@ -226,4 +226,34 @@ describe 'spreadsheet'
|
|||||||
Expect tablemode#spreadsheet#ColumnCount('.') == 4
|
Expect tablemode#spreadsheet#ColumnCount('.') == 4
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'Escaped table separators'
|
||||||
|
before
|
||||||
|
new
|
||||||
|
normal! ggdG
|
||||||
|
read t/fixtures/escaped_seperator.txt
|
||||||
|
call cursor(2, 3)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should not prevent the deletion of rows'
|
||||||
|
Expect tablemode#spreadsheet#RowCount('.') == 7
|
||||||
|
call tablemode#spreadsheet#DeleteRow()
|
||||||
|
Expect tablemode#spreadsheet#RowCount('.') == 6
|
||||||
|
Expect getline('.') == '| a separator. | |'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should not prevent the deletion of columns'
|
||||||
|
Expect tablemode#spreadsheet#ColumnCount('.') == 2
|
||||||
|
call tablemode#spreadsheet#DeleteColumn()
|
||||||
|
Expect tablemode#spreadsheet#ColumnCount('.') == 1
|
||||||
|
Expect getline('.') == '| It can be escaped by a \. |'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should not prevent the insertion of columns'
|
||||||
|
Expect tablemode#spreadsheet#ColumnCount('.') == 2
|
||||||
|
call tablemode#spreadsheet#InsertColumn(1)
|
||||||
|
Expect tablemode#spreadsheet#ColumnCount('.') == 3
|
||||||
|
Expect getline('.') == '| The \| works as | | It can be escaped by a \. |'
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user