summaryrefslogtreecommitdiff
path: root/src/buffer_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer_manager.cc')
-rw-r--r--src/buffer_manager.cc32
1 files changed, 29 insertions, 3 deletions
diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc
index 32d03fc1..35f0fcde 100644
--- a/src/buffer_manager.cc
+++ b/src/buffer_manager.cc
@@ -7,6 +7,7 @@
#include "file.hh"
#include "ranges.hh"
#include "string.hh"
+#include "regex.hh"
namespace Kakoune
{
@@ -34,7 +35,7 @@ Buffer* BufferManager::create_buffer(String name, Buffer::Flags flags, BufferLin
throw runtime_error{"buffer name is already in use"};
}
- m_buffers.push_back(std::make_unique<Buffer>(std::move(name), flags, lines, bom, eolformat, fs_status));
+ m_buffers.push_back(std::make_unique<Buffer>(std::move(name), flags, std::move(lines), bom, eolformat, fs_status));
auto* buffer = m_buffers.back().get();
buffer->on_registered();
@@ -79,12 +80,30 @@ Buffer& BufferManager::get_buffer(StringView name)
return *res;
}
+Buffer* BufferManager::get_buffer_matching_ifp(const Regex& regex)
+{
+ for (auto& buf : m_buffers | reverse())
+ {
+ if (StringView name = buf->name(); regex_match(name.begin(), name.end(), regex))
+ return buf.get();
+ }
+ return nullptr;
+}
+
+Buffer& BufferManager::get_buffer_matching(const Regex& regex)
+{
+ Buffer* res = get_buffer_matching_ifp(regex);
+ if (not res)
+ throw runtime_error{format("no buffer matching '{}'", regex.str())};
+ return *res;
+}
+
Buffer& BufferManager::get_first_buffer()
{
if (all_of(m_buffers, [](auto& b) { return (b->flags() & Buffer::Flags::Debug); }))
create_buffer("*scratch*", Buffer::Flags::None,
- {StringData::create({"*** this is a *scratch* buffer which won't be automatically saved ***\n"}),
- StringData::create({"*** use it for notes or open a file buffer with the :edit command ***\n"})},
+ {StringData::create("*** this is a *scratch* buffer which won't be automatically saved ***\n"),
+ StringData::create("*** use it for notes or open a file buffer with the :edit command ***\n")},
ByteOrderMark::None, EolFormat::Lf, {InvalidTime, {}, {}});
return *m_buffers.back();
@@ -130,4 +149,11 @@ void BufferManager::arrange_buffers(ConstArrayView<String> first_ones)
m_buffers = std::move(res);
}
+void BufferManager::make_latest(Buffer& buffer)
+{
+ auto it = find(m_buffers, &buffer);
+ kak_assert(it != m_buffers.end());
+ std::rotate(it, it+1, m_buffers.end());
+}
+
}