aboutsummaryrefslogtreecommitdiffstats
path: root/ftplugin/rst_tables.vim
diff options
context:
space:
mode:
Diffstat (limited to 'ftplugin/rst_tables.vim')
-rw-r--r--ftplugin/rst_tables.vim52
1 files changed, 49 insertions, 3 deletions
diff --git a/ftplugin/rst_tables.vim b/ftplugin/rst_tables.vim
index 1077557..ae0979a 100644
--- a/ftplugin/rst_tables.vim
+++ b/ftplugin/rst_tables.vim
@@ -19,6 +19,7 @@ let loaded_rst_tables_ftplugin = 1
python << endpython
import vim
import re
+import textwrap
from vim_bridge import bridged
@@ -191,6 +192,24 @@ def get_column_widths(table):
return widths
+def get_column_widths_from_border_spec(slice):
+ border = None
+ for row in slice:
+ if line_is_separator(row):
+ border = row.strip()
+ break
+
+ if border is None:
+ raise RuntimeError('Cannot reflow this table. Top table border not found.')
+
+ left = right = None
+ if border[0] == '+':
+ left = 1
+ if border[-1] == '+':
+ right = -1
+ return map(lambda drawing: max(0, len(drawing) - 2), border[left:right].split('+'))
+
+
def pad_fields(row, widths):
"""Pads fields of the given row, so each field lines up nicely with the
others.
@@ -207,11 +226,22 @@ def pad_fields(row, widths):
return new_row
-def draw_table(table):
+def reflow_row_contents(row, widths):
+ new_row = []
+ for i, field in enumerate(row):
+ wrapped_lines = textwrap.wrap(field.replace('\n', ' '), widths[i])
+ new_row.append("\n".join(wrapped_lines))
+ return new_row
+
+
+def draw_table(table, manual_widths=None):
if table == []:
return []
- col_widths = get_column_widths(table)
+ if manual_widths is None:
+ col_widths = get_column_widths(table)
+ else:
+ col_widths = manual_widths
# Reserve room for the spaces
sep_col_widths = map(lambda x: x + 2, col_widths)
@@ -222,6 +252,9 @@ def draw_table(table):
first = True
for row in table:
+ if manual_widths:
+ row = reflow_row_contents(row, manual_widths)
+
row_lines = split_row_into_lines(row)
# draw the lines (num_lines) for this row
@@ -247,12 +280,25 @@ def reformat_table():
slice = draw_table(table)
vim.current.buffer[upper - 1:lower] = slice
+
+@bridged
+def reflow_table():
+ upper, lower = get_table_bounds()
+ slice = vim.current.buffer[upper - 1:lower]
+ widths = get_column_widths_from_border_spec(slice)
+ table = parse_table(slice)
+ slice = draw_table(table, widths)
+ vim.current.buffer[upper - 1:lower] = slice
+
endpython
" Add mappings, unless the user didn't want this.
" The default mapping is registered, unless the user remapped it already.
if !exists("no_plugin_maps") && !exists("no_rst_table_maps")
if !hasmapto('ReformatTable(')
- noremap <silent> <leader><leader>f :call ReformatTable()<CR>
+ noremap <silent> <leader><leader>c :call ReformatTable()<CR>
+ endif
+ if !hasmapto('ReflowTable(')
+ noremap <silent> <leader><leader>f :call ReflowTable()<CR>
endif
endif