summaryrefslogtreecommitdiff
path: root/src/display_buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/display_buffer.cc')
-rw-r--r--src/display_buffer.cc21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/display_buffer.cc b/src/display_buffer.cc
index e6ae2a34..3a1449d7 100644
--- a/src/display_buffer.cc
+++ b/src/display_buffer.cc
@@ -92,15 +92,22 @@ DisplayLine::iterator DisplayLine::split(iterator it, BufferCoord pos)
return m_atoms.insert(it, std::move(atom));
}
-DisplayLine::iterator DisplayLine::split(iterator it, ColumnCount pos)
+DisplayLine::iterator DisplayLine::split(iterator it, ColumnCount count)
{
- kak_assert(it->type() == DisplayAtom::Text);
- kak_assert(pos > 0);
- kak_assert(pos < it->length());
+ kak_assert(count > 0);
+ kak_assert(count < it->length());
- DisplayAtom atom(it->m_text.substr(0, pos).str());
- it->m_text = it->m_text.substr(pos).str();
- return m_atoms.insert(it, std::move(atom));
+ if (it->type() == DisplayAtom::Text or it->type() == DisplayAtom::ReplacedRange)
+ {
+ DisplayAtom atom = *it;
+ atom.m_text = atom.m_text.substr(0, count).str();
+ it->m_text = it->m_text.substr(count).str();
+ return m_atoms.insert(it, std::move(atom));
+ }
+ auto pos = utf8::advance(get_iterator(it->buffer(), it->begin()),
+ get_iterator(it->buffer(), it->end()),
+ count).coord();
+ return split(it, pos);
}
DisplayLine::iterator DisplayLine::insert(iterator it, DisplayAtom atom)