summaryrefslogtreecommitdiff
path: root/src/editor.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-06-04 14:05:27 +0200
committerMaxime Coste <frrrwww@gmail.com>2013-06-04 18:53:13 +0200
commitcf1f26ac9111b9cacf2833cb56a2e86cd69c4f18 (patch)
tree4cbf38aa77e96f64c6ff6f39844a3bd6466aef32 /src/editor.cc
parentcc70e3ed708e231e581dfba94ada9fe7d7cad89c (diff)
fix Editor::move_selections(LineCount...) on buffer bounds
Diffstat (limited to 'src/editor.cc')
-rw-r--r--src/editor.cc9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/editor.cc b/src/editor.cc
index 0e4b3cf2..d3fbbe8b 100644
--- a/src/editor.cc
+++ b/src/editor.cc
@@ -199,11 +199,10 @@ void Editor::move_selections(LineCount offset, SelectMode mode)
kak_assert(mode == SelectMode::Replace or mode == SelectMode::Extend);
for (auto& sel : m_selections)
{
- auto pos = sel.last();
- CharCount column = m_buffer->char_distance(pos.line, pos);
- pos.line += offset;
- auto last = std::min(m_buffer->char_advance(pos.line, column),
- m_buffer->char_prev(pos.line+1));
+ CharCount column = m_buffer->char_distance(sel.last().line, sel.last());
+ auto line = clamp(sel.last().line + offset, 0_line, m_buffer->line_count()-1);
+ column = std::min(column, m_buffer->line_content(line).char_length()-1);
+ BufferCoord last = m_buffer->char_advance(line, column);
sel.first() = mode == SelectMode::Extend ? sel.first() : last;
sel.last() = last;
avoid_eol(*m_buffer, sel);