diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 1e7caef..741516f 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -162,22 +162,29 @@ void Buffer::exit_insert_mode() m_insert_mode = false; } -void Buffer::insert_code_point(uint32_t code_point) +void Buffer::insert_code_point(uint32_t code_point, bool adjust_iterators) { if (m_insert_mode) { + if ((code_point != '\n') && (size() == 0u)) + { + insert_code_point('\n', false); + } uint8_t encoded[Encoding::MAX_CODE_POINT_SIZE]; uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded); m_gap_buffer->insert(m_insert_position, encoded, bytes); ssize_t lines = (code_point == '\n') ? 1 : 0; - for (auto iterator : m_iterators) + if (adjust_iterators) { - if (iterator->offset() >= m_insert_position) + for (auto iterator : m_iterators) { - iterator->warp(bytes, lines); + if (iterator->offset() >= m_insert_position) + { + iterator->warp(bytes, lines); + } } + m_insert_position += bytes; } - m_insert_position += bytes; } } diff --git a/src/core/Buffer.h b/src/core/Buffer.h index e37ef74..6dfdee6 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -105,7 +105,7 @@ public: void enter_insert_mode(const Buffer::Iterator & position); void exit_insert_mode(); bool insert_mode() const { return m_insert_mode; } - void insert_code_point(uint32_t code_point); + void insert_code_point(uint32_t code_point, bool adjust_iterators = true); void erase_code_point(const Buffer::Iterator & position); protected: