From 03a4b3c73ff8cf7d37387df8bd0fcf9e895b59e0 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Wed, 20 Jul 2016 20:20:03 +0100 Subject: [PATCH] Support counts for undo/redo --- src/buffer.cc | 27 +++++++++++++++++---------- src/buffer.hh | 4 ++-- src/normal.cc | 15 ++++++--------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/buffer.cc b/src/buffer.cc index 08b857ce..028f9516 100644 --- a/src/buffer.cc +++ b/src/buffer.cc @@ -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; - for (const Modification& modification : m_history_cursor->undo_group | reverse()) - apply_modification(modification.inverse()); + 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; + } - 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()); - m_history_cursor = m_history_cursor->redo_child.get(); + 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); + 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(); diff --git a/src/buffer.hh b/src/buffer.hh index be510a79..4cd99c8d 100644 --- a/src/buffer.hh +++ b/src/buffer.hh @@ -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; diff --git a/src/normal.cc b/src/normal.cc index 940e11d8..316fc5e2 100644 --- a/src/normal.cc +++ b/src/normal.cc @@ -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") }); }