summaryrefslogtreecommitdiff
path: root/src/buffer_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2020-03-15 12:18:04 +1100
committerMaxime Coste <mawww@kakoune.org>2020-03-15 12:18:04 +1100
commit09375edf546dc2845960adb718db28bdcb220df1 (patch)
treeee5897bd04b118d11647ebaa8abb52f6ab143c11 /src/buffer_manager.cc
parente5aaf8c9fa309b74c3ec8207cd6d62b81770a22d (diff)
parent0cfc398a1ae604e1961b27e2cda6b8f68add68ae (diff)
Merge remote-tracking branch 'occivink/arrange-buffers'
Diffstat (limited to 'src/buffer_manager.cc')
-rw-r--r--src/buffer_manager.cc25
1 files changed, 25 insertions, 0 deletions
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<String> first_ones)
+{
+ Vector<size_t> 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);
+}
+
}