summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2016-07-20 20:20:03 +0100
committerMaxime Coste <frrrwww@gmail.com>2016-07-24 21:25:05 +0100
commit03a4b3c73ff8cf7d37387df8bd0fcf9e895b59e0 (patch)
treebdbbc01720925f962a6df5647c9a204175afe424 /src
parent3edd2c127c9d1754a487d76de38ec9b2c690ff7c (diff)
Support counts for undo/redo
Diffstat (limited to 'src')
-rw-r--r--src/buffer.cc27
-rw-r--r--src/buffer.hh4
-rw-r--r--src/normal.cc15
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") });
}