diff --git a/src/line_modification.cc b/src/line_modification.cc index 1943350f..4e24e9c8 100644 --- a/src/line_modification.cc +++ b/src/line_modification.cc @@ -7,31 +7,29 @@ namespace Kakoune static LineModification make_line_modif(const Buffer::Change& change) { - LineModification res = {}; - res.old_line = change.begin.line; - res.new_line = change.begin.line; + LineCount num_added = 0, num_removed = 0; if (change.type == Buffer::Change::Insert) { - res.num_added = change.end.line - change.begin.line; + num_added = change.end.line - change.begin.line; // inserted a new line at buffer end but end coord is on same line if (change.at_end and change.end.column != 0) - ++res.num_added; + ++num_added; } else { - res.num_removed = change.end.line - change.begin.line; + num_removed = change.end.line - change.begin.line; // removed last line, but end coord is on same line if (change.at_end and change.end.column != 0) - ++res.num_removed; + ++num_removed; } // modified a line if (not change.at_end and (change.begin.column != 0 or change.end.column != 0)) { - ++res.num_removed; - ++res.num_added; + ++num_removed; + ++num_added; } - return res; + return { change.begin.line, change.begin.line, num_removed, num_added }; } Vector compute_line_modifications(const Buffer& buffer, size_t timestamp) @@ -51,7 +49,10 @@ Vector compute_line_modifications(const Buffer& buffer, size_t if (change.new_line <= prev.new_line + prev.num_added) { --pos; - LineCount removed_from_previously_added_by_pos = clamp(pos->new_line + pos->num_added - change.new_line, 0_line, std::min(pos->num_added, change.num_removed)); + const LineCount removed_from_previously_added_by_pos = + clamp(pos->new_line + pos->num_added - change.new_line, + 0_line, std::min(pos->num_added, change.num_removed)); + pos->num_removed += change.num_removed - removed_from_previously_added_by_pos; pos->num_added += change.num_added - removed_from_previously_added_by_pos; } @@ -64,8 +65,8 @@ Vector compute_line_modifications(const Buffer& buffer, size_t else pos = res.insert(pos, change); - auto& modif = *pos; auto next = pos + 1; + auto diff = buf_change.end.line - buf_change.begin.line; if (buf_change.type == Buffer::Change::Erase) { auto delend = std::upper_bound(next, res.end(), change.new_line + change.num_removed, @@ -74,16 +75,22 @@ Vector compute_line_modifications(const Buffer& buffer, size_t for (auto it = next; it != delend; ++it) { - LineCount removed_from_previously_added_by_it = std::min(it->num_added, change.new_line + change.num_removed - it->new_line); - modif.num_removed += it->num_removed - removed_from_previously_added_by_it; - modif.num_added += it->num_added - removed_from_previously_added_by_it; + const LineCount removed_from_previously_added_by_it = + std::min(it->num_added, change.new_line + change.num_removed - it->new_line); + + pos->num_removed += it->num_removed - removed_from_previously_added_by_it; + pos->num_added += it->num_added - removed_from_previously_added_by_it; } next = res.erase(next, delend); - } - auto diff = buf_change.end.line - buf_change.begin.line; - for (auto it = next; it != res.end(); ++it) - it->new_line += diff; + for (auto it = next; it != res.end(); ++it) + it->new_line -= diff; + } + else + { + for (auto it = next; it != res.end(); ++it) + it->new_line += diff; + } } return res; }