Support counts for undo/redo
This commit is contained in:
parent
3edd2c127c
commit
03a4b3c73f
|
@ -310,31 +310,38 @@ void Buffer::commit_undo_group()
|
|||
m_history_cursor = node;
|
||||
}
|
||||
|
||||
bool Buffer::undo() noexcept
|
||||
bool Buffer::undo(size_t count) noexcept
|
||||
{
|
||||
commit_undo_group();
|
||||
|
||||
if (not m_history_cursor->parent)
|
||||
return false;
|
||||
|
||||
while (count-- and m_history_cursor->parent)
|
||||
{
|
||||
for (const Modification& modification : m_history_cursor->undo_group | reverse())
|
||||
apply_modification(modification.inverse());
|
||||
|
||||
m_history_cursor = m_history_cursor->parent;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Buffer::redo() noexcept
|
||||
bool Buffer::redo(size_t count) noexcept
|
||||
{
|
||||
if (not m_history_cursor->redo_child)
|
||||
return false;
|
||||
|
||||
kak_assert(m_current_undo_group.empty());
|
||||
|
||||
while (count-- and m_history_cursor->redo_child)
|
||||
{
|
||||
m_history_cursor = m_history_cursor->redo_child.get();
|
||||
|
||||
for (const Modification& modification : m_history_cursor->undo_group)
|
||||
apply_modification(modification);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -826,8 +833,8 @@ UnitTest test_undo{[]()
|
|||
buffer.commit_undo_group();
|
||||
buffer.erase({2, 1}, {2, 5}); // change 5
|
||||
buffer.commit_undo_group();
|
||||
buffer.undo();
|
||||
buffer.redo();
|
||||
buffer.undo(2);
|
||||
buffer.redo(2);
|
||||
buffer.undo();
|
||||
buffer.replace(2_line, buffer.end_coord(), "foo"); // change 6
|
||||
buffer.commit_undo_group();
|
||||
|
|
|
@ -132,8 +132,8 @@ public:
|
|||
void set_fs_timestamp(timespec ts);
|
||||
|
||||
void commit_undo_group();
|
||||
bool undo() noexcept;
|
||||
bool redo() noexcept;
|
||||
bool undo(size_t count = 1) noexcept;
|
||||
bool redo(size_t count = 1) noexcept;
|
||||
bool move_to(size_t history_id) noexcept;
|
||||
|
||||
String string(ByteCoord begin, ByteCoord end) const;
|
||||
|
|
|
@ -1414,37 +1414,34 @@ void restore_selections(Context& context, NormalParams params)
|
|||
context.print_status({format("Restored selections from register '{}'", reg), get_face("Information")});
|
||||
}
|
||||
|
||||
void undo(Context& context, NormalParams)
|
||||
void undo(Context& context, NormalParams params)
|
||||
{
|
||||
Buffer& buffer = context.buffer();
|
||||
size_t timestamp = buffer.timestamp();
|
||||
bool res = buffer.undo();
|
||||
if (res)
|
||||
if (buffer.undo(std::max(1, params.count)))
|
||||
{
|
||||
auto ranges = compute_modified_ranges(buffer, timestamp);
|
||||
if (not ranges.empty())
|
||||
context.selections_write_only() = std::move(ranges);
|
||||
context.selections().avoid_eol();
|
||||
}
|
||||
else if (not res)
|
||||
else
|
||||
context.print_status({ "nothing left to undo", get_face("Information") });
|
||||
}
|
||||
|
||||
void redo(Context& context, NormalParams)
|
||||
void redo(Context& context, NormalParams params)
|
||||
{
|
||||
using namespace std::placeholders;
|
||||
Buffer& buffer = context.buffer();
|
||||
size_t timestamp = buffer.timestamp();
|
||||
bool res = buffer.redo();
|
||||
if (res)
|
||||
if (buffer.redo(std::max(1, params.count)))
|
||||
{
|
||||
auto ranges = compute_modified_ranges(buffer, timestamp);
|
||||
if (not ranges.empty())
|
||||
context.selections_write_only() = std::move(ranges);
|
||||
context.selections().avoid_eol();
|
||||
}
|
||||
|
||||
else if (not res)
|
||||
else
|
||||
context.print_status({ "nothing left to redo", get_face("Information") });
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user