diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-10-21 18:57:19 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-10-21 18:57:19 +0100 |
| commit | 60dbec49490981e4c7c8d2c2a4da98dc954a610c (patch) | |
| tree | 341126db458bc017489aa06e788b798e4ac6ef05 /src/buffer.cc | |
| parent | 9e9b503f5d9bd5989e0b5b700bdf72661e821bde (diff) | |
Add Buffer::reload for reloading buffers without loosing options and hooks
Diffstat (limited to 'src/buffer.cc')
| -rw-r--r-- | src/buffer.cc | 29 |
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) |
