summaryrefslogtreecommitdiff
path: root/src/highlighters.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2017-01-13 13:45:46 +0000
committerMaxime Coste <mawww@kakoune.org>2017-01-13 13:52:55 +0000
commite7e72747edfcba76f7fc36e2e345577ffeb47eab (patch)
treec3fff0f3d12dd95ca1a5e34406c5b9924493714f /src/highlighters.cc
parent5ad44995036274989f82f62b9ff2135687b00394 (diff)
Update ranges highlighter options according to buffer changes
Diffstat (limited to 'src/highlighters.cc')
-rw-r--r--src/highlighters.cc25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/highlighters.cc b/src/highlighters.cc
index fdb85c69..00f47297 100644
--- a/src/highlighters.cc
+++ b/src/highlighters.cc
@@ -2,6 +2,7 @@
#include "assert.hh"
#include "buffer_utils.hh"
+#include "changes.hh"
#include "context.hh"
#include "containers.hh"
#include "command_manager.hh"
@@ -992,6 +993,9 @@ HighlighterAndId create_flag_lines_highlighter(HighlighterParameters params)
return {"hlflags_" + params[1], make_simple_highlighter(func) };
}
+BufferCoord& get_first(RangeAndFace& r) { return std::get<0>(r).begin; }
+BufferCoord& get_last(RangeAndFace& r) { return std::get<0>(r).end; }
+
HighlighterAndId create_ranges_highlighter(HighlighterParameters params)
{
if (params.size() != 1)
@@ -1011,8 +1015,25 @@ HighlighterAndId create_ranges_highlighter(HighlighterParameters params)
auto& buffer = context.buffer();
if (range_and_faces.prefix != buffer.timestamp())
{
- // TODO: update ranges to current timestamp
- return;
+ auto changes = buffer.changes_since(range_and_faces.prefix);
+ auto change_it = changes.begin();
+ while (change_it != changes.end())
+ {
+ auto forward_end = forward_sorted_until(change_it, changes.end());
+ auto backward_end = backward_sorted_until(change_it, changes.end());
+
+ if (forward_end >= backward_end)
+ {
+ update_forward({ change_it, forward_end }, ranges);
+ change_it = forward_end;
+ }
+ else
+ {
+ update_backward({ change_it, backward_end }, ranges);
+ change_it = backward_end;
+ }
+ }
+ range_and_faces.prefix = buffer.timestamp();
}
for (auto& range : ranges)