summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2011-10-12 18:52:22 +0000
committerMaxime Coste <frrrwww@gmail.com>2011-10-12 18:52:22 +0000
commit22bd9f90d59b9c784cc5986ca02b891eef93ee3f (patch)
tree25a72292a157317b0b52934426be813c6d540709 /src
parentf802a9f3bea1f3b1bfe2bc13b42706a287bbd8d5 (diff)
Filters: add an expand_tabulation filter
Diffstat (limited to 'src')
-rw-r--r--src/display_buffer.hh1
-rw-r--r--src/filters.cc24
-rw-r--r--src/filters.hh2
-rw-r--r--src/main.cc3
-rw-r--r--src/window.cc1
5 files changed, 30 insertions, 1 deletions
diff --git a/src/display_buffer.hh b/src/display_buffer.hh
index 59468eea..7f022b8c 100644
--- a/src/display_buffer.hh
+++ b/src/display_buffer.hh
@@ -40,6 +40,7 @@ struct DisplayAtom
Color fg_color;
Color bg_color;
Attribute attribute;
+ BufferString replacement_text;
DisplayAtom(BufferIterator begin, BufferIterator end,
Color fg_color = Color::Default,
diff --git a/src/filters.cc b/src/filters.cc
index 56f1a86e..5b306f2f 100644
--- a/src/filters.cc
+++ b/src/filters.cc
@@ -52,4 +52,28 @@ void colorize_cplusplus(DisplayBuffer& display_buffer)
colorize_regex(display_buffer, types_keywords, Color::Green);
}
+void expand_tabulations(DisplayBuffer& display_buffer)
+{
+ const int tabstop = 8;
+ for (auto atom_it = display_buffer.begin();
+ atom_it != display_buffer.end(); ++atom_it)
+ {
+ for (BufferIterator it = atom_it->begin; it != atom_it->end; ++it)
+ {
+ if (*it == '\t')
+ {
+ if (it != atom_it->begin)
+ atom_it = display_buffer.split(atom_it, it) + 1;
+
+ if (it+1 != atom_it->end)
+ atom_it = display_buffer.split(atom_it, it+1);
+
+ BufferCoord pos = it.buffer().line_and_column_at(it);
+ int count = tabstop - (pos.column % tabstop);
+ atom_it->replacement_text = std::string(count, ' ');
+ }
+ }
+ }
+}
+
}
diff --git a/src/filters.hh b/src/filters.hh
index 2dc6370c..5d084eed 100644
--- a/src/filters.hh
+++ b/src/filters.hh
@@ -11,6 +11,8 @@ void colorize_regex(DisplayBuffer& display_buffer,
const boost::regex& ex, Color color);
void colorize_cplusplus(DisplayBuffer& display_buffer);
+void colorize_cplusplus(DisplayBuffer& display_buffer);
+void expand_tabulations(DisplayBuffer& display_buffer);
}
diff --git a/src/main.cc b/src/main.cc
index e7693a8a..04a845a9 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -85,7 +85,8 @@ void draw_window(Window& window)
WindowCoord position;
for (const DisplayAtom& atom : window.display_buffer())
{
- const std::string content = window.buffer().string(atom.begin, atom.end);
+ const std::string content = atom.replacement_text.empty() ?
+ window.buffer().string(atom.begin, atom.end) : atom.replacement_text;
set_attribute(A_UNDERLINE, atom.attribute & Underline);
set_attribute(A_REVERSE, atom.attribute & Reverse);
diff --git a/src/window.cc b/src/window.cc
index ef797247..92b8ef5c 100644
--- a/src/window.cc
+++ b/src/window.cc
@@ -112,6 +112,7 @@ Window::Window(Buffer& buffer)
{
m_selections.push_back(Selection(buffer.begin(), buffer.begin()));
m_filters.push_back(colorize_cplusplus);
+ m_filters.push_back(expand_tabulations);
m_filters.push_back(HighlightSelections(*this));
}