summaryrefslogtreecommitdiff
path: root/src/buffer.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-10-21 18:57:19 +0100
committerMaxime Coste <frrrwww@gmail.com>2013-10-21 18:57:19 +0100
commit60dbec49490981e4c7c8d2c2a4da98dc954a610c (patch)
tree341126db458bc017489aa06e788b798e4ac6ef05 /src/buffer.cc
parent9e9b503f5d9bd5989e0b5b700bdf72661e821bde (diff)
Add Buffer::reload for reloading buffers without loosing options and hooks
Diffstat (limited to 'src/buffer.cc')
-rw-r--r--src/buffer.cc29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/buffer.cc b/src/buffer.cc
index 9106d595..368d530e 100644
--- a/src/buffer.cc
+++ b/src/buffer.cc
@@ -70,6 +70,35 @@ Buffer::~Buffer()
kak_assert(m_change_listeners.empty());
}
+void Buffer::reload(std::vector<String> lines, time_t fs_timestamp)
+{
+ for (auto listener : m_change_listeners)
+ listener->on_erase(*this, {0,0}, end_coord());
+
+ m_history.clear();
+ m_current_undo_group.clear();
+ m_history_cursor = m_history.begin();
+ m_last_save_undo_index = 0;
+ m_lines.clear();
+ ++m_timestamp;
+
+ if (lines.empty())
+ lines.emplace_back("\n");
+
+ ByteCount pos = 0;
+ m_lines.reserve(lines.size());
+ for (auto& line : lines)
+ {
+ kak_assert(not line.empty() and line.back() == '\n');
+ m_lines.emplace_back(Line{ pos, std::move(line) });
+ pos += m_lines.back().length();
+ }
+ m_fs_timestamp = fs_timestamp;
+
+ for (auto listener : m_change_listeners)
+ listener->on_insert(*this, {0,0}, end_coord());
+}
+
String Buffer::display_name() const
{
if (m_flags & Flags::File)