diff options
author | Vincent Driessen <vincent@datafox.nl> | 2010-08-20 10:27:41 +0200 |
---|---|---|
committer | Vincent Driessen <vincent@datafox.nl> | 2010-08-20 10:27:41 +0200 |
commit | 4422e1fbb74a85fd7167d9506c837cdfd09311ee (patch) | |
tree | 0ad81c6b8c7be28b52116ecfd706134ad72399d7 /ftplugin | |
parent | a53ef0ff2f7c8cc1f4efbabf59ed98ceb5bb2923 (diff) | |
download | vim-rst-tables-4422e1fbb74a85fd7167d9506c837cdfd09311ee.tar.gz vim-rst-tables-4422e1fbb74a85fd7167d9506c837cdfd09311ee.tar.bz2 vim-rst-tables-4422e1fbb74a85fd7167d9506c837cdfd09311ee.zip |
Implemented the "reflow" command.
For example, if you have the following table in your source file:
Type Message
Foo I like bananas very much. Even so much that I adore them.
Position your cursor in it and call ReformatTable(). This makes the
following:
+======+===========================================================+
| Type | Message |
+======+===========================================================+
| Foo | I like bananas very much. Even so much that I adore them. |
+------+-----------------------------------------------------------+
But if you don't like these kinds of long wrappings, you can now simply
remove (or add, for that matter) some of the '='-signs from the top row,
like this:
+======+================================+
| Type | Message |
+======+===========================================================+
| Foo | I like bananas very much. Even so much that I adore them. |
+------+-----------------------------------------------------------+
And then, call ReflowTable():
+======+================================+
| Type | Message |
+======+================================+
| Foo | I like bananas very much. Even |
| | so much that I adore them. |
+------+--------------------------------+
This fixed issue #1.
Diffstat (limited to 'ftplugin')
-rw-r--r-- | ftplugin/rst_tables.vim | 52 |
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 |