From 4e280977a2fcd7ca423b5909b435b896b256cdaf Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Wed, 14 May 2014 20:56:27 +0100 Subject: Iterate in reversed order on selections when modifing buffer This way, update only needs to be called once everything is done as we always modify after the next selection to be used. --- src/selection.cc | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/selection.cc') diff --git a/src/selection.cc b/src/selection.cc index 746253f9..1e8356ab 100644 --- a/src/selection.cc +++ b/src/selection.cc @@ -188,5 +188,31 @@ void SelectionList::sort_and_merge_overlapping() std::stable_sort(begin(), end(), compare_selections); merge_overlapping(overlaps); } +namespace +{ + +inline void _avoid_eol(const Buffer& buffer, ByteCoord& coord) +{ + const auto column = coord.column; + const auto& line = buffer[coord.line]; + if (column != 0 and column == line.length() - 1) + coord.column = line.byte_count_to(line.char_length() - 2); +} + + +inline void _avoid_eol(const Buffer& buffer, Selection& sel) +{ + _avoid_eol(buffer, sel.anchor()); + _avoid_eol(buffer, sel.cursor()); +} + +} + +void SelectionList::avoid_eol() +{ + update(); + for (auto& sel : m_selections) + _avoid_eol(buffer(), sel); +} } -- cgit v1.2.3