diff --git a/src/display_buffer.cc b/src/display_buffer.cc index 303f1b26..3926e227 100644 --- a/src/display_buffer.cc +++ b/src/display_buffer.cc @@ -8,10 +8,15 @@ namespace Kakoune String DisplayAtom::content() const { - if (m_replacement_text.empty()) + switch (m_content_mode) + { + case BufferText: return m_begin.buffer().string(m_begin, m_end); - else + case ReplacementText: return m_replacement_text; + } + assert(false); + return ""; } static DisplayCoord advance_coord(const DisplayCoord& pos, @@ -40,17 +45,23 @@ static DisplayCoord advance_coord(const DisplayCoord& pos, } return res; } + DisplayCoord DisplayAtom::end_coord() const { - if (m_replacement_text.empty()) + switch (m_content_mode) + { + case BufferText: return advance_coord(m_coord, m_begin, m_end); - else + case ReplacementText: return advance_coord(m_coord, m_replacement_text); + } + assert(false); + return { 0, 0 }; } BufferIterator DisplayAtom::iterator_at(const DisplayCoord& coord) const { - if (not m_replacement_text.empty() or coord <= m_coord) + if (m_content_mode != BufferText or coord <= m_coord) return m_begin; DisplayCoord pos = m_coord; @@ -74,7 +85,7 @@ DisplayCoord DisplayAtom::line_and_column_at(const BufferIterator& iterator) con { assert(iterator >= m_begin and iterator < m_end); - if (not m_replacement_text.empty()) + if (m_content_mode != BufferText) return m_coord; return advance_coord(m_coord, m_begin, iterator); @@ -140,6 +151,7 @@ void DisplayBuffer::check_invariant() const void DisplayBuffer::replace_atom_content(iterator atom, const String& replacement) { + atom->m_content_mode = DisplayAtom::ReplacementText; atom->m_replacement_text = replacement; // update coordinates of subsequents atoms diff --git a/src/display_buffer.hh b/src/display_buffer.hh index 36b4803e..89561bde 100644 --- a/src/display_buffer.hh +++ b/src/display_buffer.hh @@ -57,7 +57,8 @@ struct DisplayAtom Color fg_color = Color::Default, Color bg_color = Color::Default, Attribute attribute = Attributes::Normal) - : m_coord(coord), + : m_content_mode(BufferText), + m_coord(coord), m_begin(begin), m_end(end), m_fg_color(fg_color), m_bg_color(bg_color), @@ -86,6 +87,13 @@ struct DisplayAtom private: friend class DisplayBuffer; + enum ContentMode + { + BufferText, + ReplacementText + }; + ContentMode m_content_mode; + DisplayCoord m_coord; BufferIterator m_begin; BufferIterator m_end;