diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc index d8d4da26..8d17cc76 100644 --- a/src/buffer_manager.cc +++ b/src/buffer_manager.cc @@ -105,4 +105,29 @@ void BufferManager::clear_buffer_trash() m_buffer_trash.clear(); } +void BufferManager::arrange_buffers(ConstArrayView first_ones) +{ + Vector indices; + for (const auto& name : first_ones) + { + auto it = find_if(m_buffers, [&](auto& buf) { return buf->name() == name or buf->display_name() == name; }); + if (it == m_buffers.end()) + throw runtime_error{format("no such buffer '{}'", name)}; + size_t index = it - m_buffers.begin(); + if (contains(indices, index)) + throw runtime_error{format("buffer '{}' appears more than once", name)}; + indices.push_back(index); + } + + BufferList res; + for (size_t index : indices) + res.push_back(std::move(m_buffers[index])); + for (auto& buf : m_buffers) + { + if (buf) + res.push_back(std::move(buf)); + } + m_buffers = std::move(res); +} + } diff --git a/src/buffer_manager.hh b/src/buffer_manager.hh index 0abb6415..e89fa183 100644 --- a/src/buffer_manager.hh +++ b/src/buffer_manager.hh @@ -30,6 +30,8 @@ public: Buffer* get_buffer_ifp(StringView name); Buffer& get_buffer(StringView name); + void arrange_buffers(ConstArrayView first_ones); + Buffer& get_first_buffer(); void backup_modified_buffers(); diff --git a/src/commands.cc b/src/commands.cc index ee45bcde..980b3ec8 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -923,6 +923,25 @@ static void redraw_relevant_clients(Context& context, StringView highlighter_pat } } +const CommandDesc arrange_buffers_cmd = { + "arrange-buffers", + nullptr, + "arrange-buffers ...: reorder the buffers in the buffers list\n" + " the named buffers will be moved to the front of the buffer list, in the order given\n" + " buffers that do not appear in the parameters will remain at the end of the list, keeping their current order", + ParameterDesc{{}, ParameterDesc::Flags::None, 1}, + CommandFlags::None, + CommandHelper{}, + [](const Context& context, CompletionFlags flags, CommandParameters params, size_t, ByteCount cursor_pos) + { + return complete_buffer_name(context, flags, params.back(), cursor_pos); + }, + [](const ParametersParser& parser, Context&, const ShellContext&) + { + BufferManager::instance().arrange_buffers(parser.positionals_from(0)); + } +}; + const CommandDesc add_highlighter_cmd = { "add-highlighter", "addhl", @@ -2606,6 +2625,7 @@ void register_commands() register_command(delete_buffer_cmd); register_command(force_delete_buffer_cmd); register_command(rename_buffer_cmd); + register_command(arrange_buffers_cmd); register_command(add_highlighter_cmd); register_command(remove_highlighter_cmd); register_command(add_hook_cmd);