diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2011-12-03 20:25:05 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2011-12-03 20:25:05 +0000 |
| commit | d1cc5da8a6e6438248d8b1be2b587d482d1f9daf (patch) | |
| tree | ce82f44b25f708d5368e6a45ea63ccd652e28506 /src | |
| parent | 9a6cef5230314fc7700fa1ba713ca027f5f7b794 (diff) | |
Filters: add expand_tabulations to insert spaces instead of tabs
Diffstat (limited to 'src')
| -rw-r--r-- | src/filters.cc | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/filters.cc b/src/filters.cc index 73ae91cb..9420fef9 100644 --- a/src/filters.cc +++ b/src/filters.cc @@ -20,6 +20,29 @@ void preserve_indent(Buffer& buffer, BufferModification& modification) } } +void expand_tabulations(Buffer& buffer, BufferModification& modification) +{ + const int tabstop = 8; + if (modification.type == BufferModification::Insert and + modification.content == "\t") + { + int column = 0; + BufferCoord pos = buffer.line_and_column_at(modification.position); + for (auto line_it = buffer.iterator_at({pos.line, 0}); + line_it != modification.position; ++line_it) + { + assert(*line_it != '\n'); + if (*line_it == '\t') + column += tabstop - (column % tabstop); + else + ++column; + } + + int count = tabstop - (column % tabstop); + modification.content = std::string(count, ' '); + } +} + template<void (*filter_func)(Buffer&, BufferModification&)> class SimpleFilterFactory { @@ -40,6 +63,7 @@ void register_filters() FilterRegistry& registry = FilterRegistry::instance(); registry.register_factory("preserve_indent", SimpleFilterFactory<preserve_indent>("preserve_indent")); + registry.register_factory("expand_tabulations", SimpleFilterFactory<expand_tabulations>("expand_tabulations")); } } |
