summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2025-07-08 10:33:56 +1000
committerMaxime Coste <mawww@kakoune.org>2025-07-08 12:07:33 +1000
commitfea08fc18d268ace4f843ec2b57cc33e36562098 (patch)
tree0573099b42c357f6031191bcf92f0b0f44e67481 /src
parent2823c5e94c1bad72a7a22ea37452d2390d5b1e17 (diff)
Remove uses of Regex in BufferManager by taking a more general filter
Diffstat (limited to 'src')
-rw-r--r--src/buffer_manager.cc11
-rw-r--r--src/buffer_manager.hh5
-rw-r--r--src/commands.cc6
-rw-r--r--src/regex.cc9
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<bool (Buffer&)>& 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<bool (Buffer&)>& 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 <memory>
@@ -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<bool (Buffer&)>& filter);
+ Buffer& get_buffer_matching(const FunctionRef<bool (Buffer&)>& filter);
void make_latest(Buffer& buffer);
void arrange_buffers(ConstArrayView<String> 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<true>)),
[](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)