From fea08fc18d268ace4f843ec2b57cc33e36562098 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Tue, 8 Jul 2025 10:33:56 +1000 Subject: Remove uses of Regex in BufferManager by taking a more general filter --- src/buffer_manager.cc | 11 +++++------ src/buffer_manager.hh | 5 +++-- src/commands.cc | 6 +++++- src/regex.cc | 9 ++++++--- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc index ea86beb9..539f160b 100644 --- a/src/buffer_manager.cc +++ b/src/buffer_manager.cc @@ -7,7 +7,6 @@ #include "buffer_utils.hh" #include "ranges.hh" #include "string.hh" -#include "regex.hh" namespace Kakoune { @@ -83,21 +82,21 @@ Buffer& BufferManager::get_buffer(StringView name) return *res; } -Buffer* BufferManager::get_buffer_matching_ifp(const Regex& regex) +Buffer* BufferManager::get_buffer_matching_ifp(const FunctionRef& filter) { for (auto& buf : m_buffers | reverse()) { - if (StringView name = buf->name(); regex_match(name.begin(), name.end(), regex)) + if (filter(*buf)) return buf.get(); } return nullptr; } -Buffer& BufferManager::get_buffer_matching(const Regex& regex) +Buffer& BufferManager::get_buffer_matching(const FunctionRef& filter) { - Buffer* res = get_buffer_matching_ifp(regex); + Buffer* res = get_buffer_matching_ifp(filter); if (not res) - throw runtime_error{format("no buffer matching '{}'", regex.str())}; + throw runtime_error{format("no buffer found")}; return *res; } diff --git a/src/buffer_manager.hh b/src/buffer_manager.hh index 5b687a7f..2b4c0b31 100644 --- a/src/buffer_manager.hh +++ b/src/buffer_manager.hh @@ -3,6 +3,7 @@ #include "buffer.hh" #include "vector.hh" +#include "utils.hh" #include @@ -28,8 +29,8 @@ public: Buffer* get_buffer_ifp(StringView name); Buffer& get_buffer(StringView name); - Buffer* get_buffer_matching_ifp(const Regex& regex); - Buffer& get_buffer_matching(const Regex& regex); + Buffer* get_buffer_matching_ifp(const FunctionRef& filter); + Buffer& get_buffer_matching(const FunctionRef& filter); void make_latest(Buffer& buffer); void arrange_buffers(ConstArrayView first_ones); diff --git a/src/commands.cc b/src/commands.cc index 9a50fdf5..e7faf5ec 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -880,7 +880,11 @@ const CommandDesc buffer_cmd = { make_completer(menu(complete_buffer_name)), [](const ParametersParser& parser, Context& context, const ShellContext&) { - Buffer& buffer = parser.get_switch("matching") ? BufferManager::instance().get_buffer_matching(Regex{parser[0]}) + Buffer& buffer = parser.get_switch("matching") ? BufferManager::instance().get_buffer_matching( + [re=Regex{parser[0]}](Buffer& buffer) { + auto name = buffer.name(); + return regex_match(name.begin(), name.end(), re); + }) : BufferManager::instance().get_buffer(parser[0]); if (&buffer != &context.buffer()) { diff --git a/src/regex.cc b/src/regex.cc index b62bdddf..e9d24be7 100644 --- a/src/regex.cc +++ b/src/regex.cc @@ -1,5 +1,4 @@ #include "regex.hh" -#include "ranges.hh" #include "string_utils.hh" namespace Kakoune @@ -14,8 +13,12 @@ Regex::Regex(StringView re, RegexCompileFlags flags) int Regex::named_capture_index(StringView name) const { - auto it = find_if(m_impl->named_captures, [&](auto& c) { return c.name == name; }); - return it != m_impl->named_captures.end() ? it->index : -1; + for (auto capture : m_impl->named_captures) + { + if (capture.name == name) + return capture.index; + } + return -1; } String option_to_string(const Regex& re, Quoting quoting) -- cgit v1.2.3