Editor: fix replace at end of buffer

This commit is contained in:
Maxime Coste 2013-03-13 14:26:20 +01:00
parent c1db67e31a
commit 0f957b3743
2 changed files with 16 additions and 9 deletions

View File

@ -83,7 +83,7 @@ void Editor::insert(const String& str, InsertMode mode)
{ {
BufferIterator pos = prepare_insert(*m_buffer, sel, mode); BufferIterator pos = prepare_insert(*m_buffer, sel, mode);
m_buffer->insert(pos, str); m_buffer->insert(pos, str);
if (mode == InsertMode::Replace) if (mode == InsertMode::Replace and not pos.is_end())
{ {
sel.first() = pos; sel.first() = pos;
sel.last() = str.empty() ? pos : utf8::character_start(pos + str.length() - 1); sel.last() = str.empty() ? pos : utf8::character_start(pos + str.length() - 1);
@ -105,7 +105,7 @@ void Editor::insert(const memoryview<String>& strings, InsertMode mode)
BufferIterator pos = prepare_insert(*m_buffer, sel, mode); BufferIterator pos = prepare_insert(*m_buffer, sel, mode);
const String& str = strings[std::min(i, strings.size()-1)]; const String& str = strings[std::min(i, strings.size()-1)];
m_buffer->insert(pos, str); m_buffer->insert(pos, str);
if (mode == InsertMode::Replace) if (mode == InsertMode::Replace and not pos.is_end())
{ {
sel.first() = pos; sel.first() = pos;
sel.last() = str.empty() ? pos : utf8::character_start(pos + str.length() - 1); sel.last() = str.empty() ? pos : utf8::character_start(pos + str.length() - 1);

View File

@ -55,16 +55,23 @@ void test_editor()
Buffer buffer("test", Buffer::Flags::None, { "test\n", "\n", "youpi\n" }); Buffer buffer("test", Buffer::Flags::None, { "test\n", "\n", "youpi\n" });
Editor editor(buffer); Editor editor(buffer);
using namespace std::placeholders; {
scoped_edition edition{editor};
editor.select(select_whole_buffer); editor.select(select_whole_buffer);
editor.multi_select(std::bind(select_all_matches, _1, "\\n\\h*")); editor.multi_select(std::bind(select_all_matches, std::placeholders::_1, "\\n\\h*"));
for (auto& sel : editor.selections()) for (auto& sel : editor.selections())
{ {
assert(*sel.begin() == '\n'); assert(*sel.begin() == '\n');
editor.buffer().erase(sel.begin(), sel.end()); editor.buffer().erase(sel.begin(), sel.end());
} }
} }
editor.undo();
Selection sel{ buffer.iterator_at_line_begin(2_line), buffer.end() };
editor.select(sel, SelectMode::Replace);
editor.insert("",InsertMode::Replace);
assert(not editor.selections().back().first().is_end());
}
void test_incremental_inserter() void test_incremental_inserter()
{ {