summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2018-09-12 21:24:38 +1000
committerMaxime Coste <mawww@kakoune.org>2018-09-12 21:26:21 +1000
commit0c3d9ccd20e9833abbec6f003f3fab27da27b869 (patch)
tree07485285268f31a3771879ce95b12b6faa770a9d /src
parentb8d312cfe039721cb996cf83100630e64cd15c43 (diff)
Change remove-hooks to take a regular expression
All hooks whose group match this regex will be removed. Fixes #2380.
Diffstat (limited to 'src')
-rw-r--r--src/commands.cc4
-rw-r--r--src/hook_manager.cc6
-rw-r--r--src/hook_manager.hh2
3 files changed, 5 insertions, 7 deletions
diff --git a/src/commands.cc b/src/commands.cc
index 19c02cf6..e94fe090 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -867,7 +867,7 @@ const CommandDesc add_hook_cmd = {
const CommandDesc remove_hook_cmd = {
"remove-hooks",
"rmhooks",
- "remove-hooks <scope> <group>: remove all hooks whose group is <group>",
+ "remove-hooks <scope> <group>: remove all hooks whose group matches the regex <group>",
ParameterDesc{ {}, ParameterDesc::Flags::None, 2, 2 },
CommandFlags::None,
CommandHelper{},
@@ -888,7 +888,7 @@ const CommandDesc remove_hook_cmd = {
},
[](const ParametersParser& parser, Context& context, const ShellContext&)
{
- get_scope(parser[0], context).hooks().remove_hooks(parser[1]);
+ get_scope(parser[0], context).hooks().remove_hooks(Regex{parser[1]});
}
};
diff --git a/src/hook_manager.cc b/src/hook_manager.cc
index 46d38fb0..93a4fc1e 100644
--- a/src/hook_manager.cc
+++ b/src/hook_manager.cc
@@ -32,15 +32,13 @@ void HookManager::add_hook(StringView hook_name, String group, HookFlags flags,
hooks.emplace_back(new Hook{std::move(group), flags, std::move(filter), std::move(commands)});
}
-void HookManager::remove_hooks(StringView group)
+void HookManager::remove_hooks(const Regex& regex)
{
- if (group.empty())
- throw runtime_error("invalid id");
for (auto& list : m_hooks)
{
auto it = std::remove_if(list.value.begin(), list.value.end(),
[&](const std::unique_ptr<Hook>& h)
- { return h->group == group; });
+ { return regex_match(h->group.begin(), h->group.end(), regex); });
if (not m_running_hooks.empty()) // we are running some hooks, defer deletion
m_hooks_trash.insert(m_hooks_trash.end(), std::make_move_iterator(it),
std::make_move_iterator(list.value.end()));
diff --git a/src/hook_manager.hh b/src/hook_manager.hh
index 9e75c086..6da5fe30 100644
--- a/src/hook_manager.hh
+++ b/src/hook_manager.hh
@@ -27,7 +27,7 @@ public:
void add_hook(StringView hook_name, String group, HookFlags flags,
Regex filter, String commands);
- void remove_hooks(StringView group);
+ void remove_hooks(const Regex& regex);
CandidateList complete_hook_group(StringView prefix, ByteCount pos_in_token);
void run_hook(StringView hook_name, StringView param,
Context& context);