Add Buffer::reload for reloading buffers without loosing options and hooks
This commit is contained in:
parent
9e9b503f5d
commit
60dbec4949
|
@ -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)
|
||||
|
|
|
@ -163,6 +163,8 @@ public:
|
|||
|
||||
std::unordered_set<BufferChangeListener*>& change_listeners() const { return m_change_listeners; }
|
||||
|
||||
void reload(std::vector<String> lines, time_t fs_timestamp = InvalidTime);
|
||||
|
||||
void check_invariant() const;
|
||||
private:
|
||||
struct Line
|
||||
|
|
10
src/file.cc
10
src/file.cc
|
@ -135,8 +135,6 @@ Buffer* create_buffer_from_file(String filename)
|
|||
const char* data = (const char*)mmap(nullptr, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
auto cleanup = on_scope_end([&]{ munmap((void*)data, st.st_size); close(fd); });
|
||||
|
||||
BufferManager::instance().delete_buffer_if_exists(filename);
|
||||
|
||||
const char* pos = data;
|
||||
bool crlf = false;
|
||||
bool bom = false;
|
||||
|
@ -175,8 +173,12 @@ Buffer* create_buffer_from_file(String filename)
|
|||
else
|
||||
pos = line_end + 1;
|
||||
}
|
||||
Buffer* buffer = new Buffer{filename, Buffer::Flags::File,
|
||||
std::move(lines), st.st_mtime};
|
||||
Buffer* buffer = BufferManager::instance().get_buffer_ifp(filename);
|
||||
if (buffer)
|
||||
buffer->reload(std::move(lines), st.st_mtime);
|
||||
else
|
||||
buffer = new Buffer{filename, Buffer::Flags::File,
|
||||
std::move(lines), st.st_mtime};
|
||||
|
||||
OptionManager& options = buffer->options();
|
||||
options.get_local_option("eolformat").set<String>(crlf ? "crlf" : "lf");
|
||||
|
|
Loading…
Reference in New Issue
Block a user