diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-06-05 18:47:39 +0200 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-06-06 19:44:07 +0200 |
| commit | 70bf71e51fb8433cbbd3170d698ad3dc28ce8d16 (patch) | |
| tree | c3e1e209ac775793b93511a580fcb272e0465a3b /src/editor.cc | |
| parent | 580749a91da1e293c9dc8c5f3a72aa9c5a5e7666 (diff) | |
remove Buffer:char_{distance,advance} use line access instead
Diffstat (limited to 'src/editor.cc')
| -rw-r--r-- | src/editor.cc | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/editor.cc b/src/editor.cc index fbd2ae58..ae100871 100644 --- a/src/editor.cc +++ b/src/editor.cc @@ -97,7 +97,7 @@ void Editor::insert(const String& str, InsertMode mode) { sel.first() = pos; sel.last() = str.empty() ? - pos : m_buffer->char_advance(pos, str.char_length() - 1); + pos : m_buffer->advance(pos, str.byte_count_to(str.char_length() - 1)); } avoid_eol(*m_buffer, sel); } @@ -120,7 +120,7 @@ void Editor::insert(const memoryview<String>& strings, InsertMode mode) { sel.first() = pos; sel.last() = str.empty() ? - pos : m_buffer->char_advance(pos, str.char_length() - 1); + pos : m_buffer->advance(pos, str.byte_count_to(str.char_length() - 1)); } avoid_eol(*m_buffer, sel); } @@ -185,8 +185,10 @@ void Editor::move_selections(CharCount offset, SelectMode mode) for (auto& sel : m_selections) { auto last = sel.last(); - last = clamp<BufferCoord>(m_buffer->char_advance(last, offset), - last.line, m_buffer->char_prev(last.line+1)); + auto& line = buffer()[last.line]; + auto character = std::max(0_char, std::min(line.char_count_to(last.column) + offset, + line.char_length() - 2)); + last.column = line.byte_count_to(character); sel.first() = mode == SelectMode::Extend ? sel.first() : last; sel.last() = last; avoid_eol(*m_buffer, sel); @@ -199,12 +201,14 @@ void Editor::move_selections(LineCount offset, SelectMode mode) kak_assert(mode == SelectMode::Replace or mode == SelectMode::Extend); for (auto& sel : m_selections) { - CharCount column = m_buffer->char_distance(sel.last().line, sel.last()); + auto character = (*m_buffer)[sel.last().line].char_count_to(sel.last().column); auto line = clamp(sel.last().line + offset, 0_line, m_buffer->line_count()-1); - column = std::min(column, (*m_buffer)[line].char_length()-1); - BufferCoord last = m_buffer->char_advance(line, column); - sel.first() = mode == SelectMode::Extend ? sel.first() : last; - sel.last() = last; + auto& content = (*m_buffer)[line]; + + character = std::max(0_char, std::min(character, content.char_length() - 2)); + BufferCoord pos{line, content.byte_count_to(character)}; + sel.first() = mode == SelectMode::Extend ? sel.first() : pos; + sel.last() = pos; avoid_eol(*m_buffer, sel); } sort_and_merge_overlapping(m_selections, m_main_sel); |
