diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc index 14e6f723..d482f28a 100644 --- a/src/buffer_manager.cc +++ b/src/buffer_manager.cc @@ -42,7 +42,7 @@ void BufferManager::unregister_buffer(Buffer& buffer) assert(false); } -Buffer* BufferManager::get_buffer(const String& name) +Buffer* BufferManager::get_buffer_ifp(const String& name) { for (auto& buf : m_buffers) { @@ -52,6 +52,14 @@ Buffer* BufferManager::get_buffer(const String& name) return nullptr; } +Buffer& BufferManager::get_buffer(const String& name) +{ + Buffer* res = get_buffer_ifp(name); + if (not res) + throw runtime_error("no such buffer '" + name + "'"); + return *res; +} + void BufferManager::set_last_used_buffer(Buffer& buffer) { auto it = m_buffers.begin(); diff --git a/src/buffer_manager.hh b/src/buffer_manager.hh index d8065578..3d90c1f8 100644 --- a/src/buffer_manager.hh +++ b/src/buffer_manager.hh @@ -26,7 +26,8 @@ public: iterator end() const { return m_buffers.cend(); } size_t count() const { return m_buffers.size(); } - Buffer* get_buffer(const String& name); + Buffer* get_buffer_ifp(const String& name); + Buffer& get_buffer(const String& name); void set_last_used_buffer(Buffer& buffer); CandidateList complete_buffername(const String& prefix, diff --git a/src/commands.cc b/src/commands.cc index 25be78a4..0d88e597 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -98,7 +98,7 @@ void edit(const CommandParameters& params, Context& context) Buffer* buffer = nullptr; if (not force_reload) - buffer = BufferManager::instance().get_buffer(name); + buffer = BufferManager::instance().get_buffer_ifp(name); if (not buffer) { if (parser.has_option("scratch")) @@ -209,18 +209,14 @@ void show_buffer(const CommandParameters& params, Context& context) if (params.size() != 1) throw wrong_argument_count(); - const String& buffer_name = params[0]; - Buffer* buffer = BufferManager::instance().get_buffer(buffer_name); - if (not buffer) - throw runtime_error("buffer " + buffer_name + " does not exists"); + Buffer& buffer = BufferManager::instance().get_buffer(params[0]); + BufferManager::instance().set_last_used_buffer(buffer); - BufferManager::instance().set_last_used_buffer(*buffer); - - if (buffer != &context.buffer()) + if (&buffer != &context.buffer()) { context.push_jump(); auto& manager = ClientManager::instance(); - context.change_editor(manager.get_unused_window_for_buffer(*buffer)); + context.change_editor(manager.get_unused_window_for_buffer(buffer)); } } @@ -231,24 +227,15 @@ void delete_buffer(const CommandParameters& params, Context& context) throw wrong_argument_count(); BufferManager& manager = BufferManager::instance(); - Buffer* buffer = nullptr; - if (params.empty()) - buffer = &context.buffer(); - else - { - const String& buffer_name = params[0]; - buffer = manager.get_buffer(buffer_name); - if (not buffer) - throw runtime_error("buffer " + buffer_name + " does not exists"); - } - if (not force and (buffer->flags() & Buffer::Flags::File) and buffer->is_modified()) - throw runtime_error("buffer " + buffer->name() + " is modified"); + Buffer& buffer = params.empty() ? context.buffer() : manager.get_buffer(params[0]); + if (not force and (buffer.flags() & Buffer::Flags::File) and buffer.is_modified()) + throw runtime_error("buffer " + buffer.name() + " is modified"); if (manager.count() == 1) - throw runtime_error("buffer " + buffer->name() + " is the last one"); + throw runtime_error("buffer " + buffer.name() + " is the last one"); - ClientManager::instance().ensure_no_client_uses_buffer(*buffer); - delete buffer; + ClientManager::instance().ensure_no_client_uses_buffer(buffer); + delete &buffer; } template diff --git a/src/debug.cc b/src/debug.cc index 5f0fecab..9cfa0cd8 100644 --- a/src/debug.cc +++ b/src/debug.cc @@ -10,7 +10,7 @@ namespace Kakoune static Buffer& get_or_create_debug_buffer() { static const String debug_buffer_name("*debug*"); - Buffer* buffer = BufferManager::instance().get_buffer(debug_buffer_name); + Buffer* buffer = BufferManager::instance().get_buffer_ifp(debug_buffer_name); if (not buffer) buffer = new Buffer(debug_buffer_name, Buffer::Flags::NoUndo); diff --git a/src/file.cc b/src/file.cc index bc8ce4a8..e6f08996 100644 --- a/src/file.cc +++ b/src/file.cc @@ -91,7 +91,7 @@ Buffer* create_buffer_from_file(const 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); }); - if (Buffer* buffer = BufferManager::instance().get_buffer(filename)) + if (Buffer* buffer = BufferManager::instance().get_buffer_ifp(filename)) delete buffer; const char* pos = data;