summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2011-10-23 20:26:51 +0000
committerMaxime Coste <frrrwww@gmail.com>2011-10-23 20:26:51 +0000
commit12d933d89651a40de34d1e75ede14cd3dfdb7716 (patch)
treead9c1ffe62ffca79a186508a15f7ac7a22e10ce5 /src
parentfffa405bfd86ec49fd27d7f9a903271409a0ea24 (diff)
Filters: rewrote colorize_regex
Diffstat (limited to 'src')
-rw-r--r--src/filters.cc32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/filters.cc b/src/filters.cc
index 7459c31f..e02e212a 100644
--- a/src/filters.cc
+++ b/src/filters.cc
@@ -6,23 +6,29 @@ namespace Kakoune
void colorize_regex(DisplayBuffer& display_buffer,
const boost::regex& ex, Color color)
{
- for (auto atom_it = display_buffer.begin();
- atom_it != display_buffer.end(); ++atom_it)
+ BufferIterator display_begin = display_buffer.begin()->begin();
+ BufferIterator display_end = display_buffer.back().end();
+
+ boost::regex_iterator<BufferIterator> re_it(display_begin, display_end,
+ ex, boost::match_nosubs);
+ boost::regex_iterator<BufferIterator> re_end;
+ DisplayBuffer::iterator atom_it = display_buffer.begin();
+ for (; re_it != re_end; ++re_it)
{
- boost::match_results<BufferIterator> matches;
- if (boost::regex_search(atom_it->begin(), atom_it->end(),
- matches, ex, boost::match_nosubs))
+ BufferIterator begin = (*re_it)[0].first;
+ BufferIterator end = (*re_it)[0].second;
+ auto begin_atom_it = display_buffer.atom_containing(begin, atom_it);
+ auto end_atom_it = display_buffer.atom_containing(end, atom_it);
+ if (begin_atom_it == end_atom_it)
{
- const BufferIterator& begin = matches.begin()->first;
- if (begin != atom_it->begin())
- atom_it = ++display_buffer.split(atom_it, begin);
-
- const BufferIterator& end = matches.begin()->second;
- if (end != atom_it->end())
- atom_it = display_buffer.split(atom_it, end);
+ if (begin_atom_it->begin() != begin)
+ begin_atom_it = ++display_buffer.split(begin_atom_it, begin);
+ if (begin_atom_it->end() != end)
+ begin_atom_it = display_buffer.split(begin_atom_it, end);
- atom_it->fg_color() = color;
+ begin_atom_it->fg_color() = color;
}
+ atom_it = begin_atom_it;
}
}