summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2011-12-03 20:25:05 +0000
committerMaxime Coste <frrrwww@gmail.com>2011-12-03 20:25:05 +0000
commitd1cc5da8a6e6438248d8b1be2b587d482d1f9daf (patch)
treece82f44b25f708d5368e6a45ea63ccd652e28506 /src
parent9a6cef5230314fc7700fa1ba713ca027f5f7b794 (diff)
Filters: add expand_tabulations to insert spaces instead of tabs
Diffstat (limited to 'src')
-rw-r--r--src/filters.cc24
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"));
}
}