summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-03-20 08:29:41 +0000
committerMaxime Coste <frrrwww@gmail.com>2014-03-20 08:29:41 +0000
commitc48bdbe4f1b7d085f63ac3e133b2d9c53951cbfd (patch)
treebffd86df094cf6aa762bf89e2f219d891c0b9b1b /src
parentbe417d361602af9871944070c00eca4fc4549775 (diff)
exec and eval support the -no-hooks option
Hooks gets disabled during the execution of the commands
Diffstat (limited to 'src')
-rw-r--r--src/commands.cc9
-rw-r--r--src/hook_manager.cc10
-rw-r--r--src/hook_manager.hh7
3 files changed, 26 insertions, 0 deletions
diff --git a/src/commands.cc b/src/commands.cc
index 8207d7df..693706e8 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -885,6 +885,7 @@ const ParameterDesc context_wrap_params = {
{ "try-client", { true, "run in given client context if it exists, or else in the current one" } },
{ "buffer", { true, "run in a disposable context for each given buffer in the comma separated list argument" } },
{ "draft", { false, "run in a disposable context" } },
+ { "no-hooks", { false, "disable hooks" } },
{ "itersel", { false, "run once for each selection with that selection as the only one" } } },
ParameterDesc::Flags::SwitchesOnlyAtStart, 1
};
@@ -892,6 +893,14 @@ const ParameterDesc context_wrap_params = {
template<typename Func>
void context_wrap(const ParametersParser& parser, Context& context, Func func)
{
+ const bool disable_hooks = parser.has_option("no-hooks");
+ if (disable_hooks)
+ GlobalHooks::instance().disable_hooks();
+ auto restore_hooks = on_scope_end([&](){
+ if (disable_hooks)
+ GlobalHooks::instance().enable_hooks();
+ });
+
ClientManager& cm = ClientManager::instance();
if (parser.has_option("buffer"))
{
diff --git a/src/hook_manager.cc b/src/hook_manager.cc
index 344b6ce0..47b52e00 100644
--- a/src/hook_manager.cc
+++ b/src/hook_manager.cc
@@ -23,6 +23,9 @@ void HookManager::run_hook(const String& hook_name,
const String& param,
Context& context) const
{
+ if (GlobalHooks::instance().are_hooks_disabled())
+ return;
+
if (m_parent)
m_parent->run_hook(hook_name, param, context);
@@ -44,4 +47,11 @@ void HookManager::run_hook(const String& hook_name,
}
}
+bool GlobalHooks::are_hooks_disabled() const
+{
+ kak_assert(m_disabled >= 0);
+ return m_disabled > 0;
+}
+
+
}
diff --git a/src/hook_manager.hh b/src/hook_manager.hh
index 1c86bfb1..794f8077 100644
--- a/src/hook_manager.hh
+++ b/src/hook_manager.hh
@@ -35,6 +35,13 @@ private:
class GlobalHooks : public HookManager,
public Singleton<GlobalHooks>
{
+public:
+ bool are_hooks_disabled() const;
+
+ void disable_hooks() { ++m_disabled; }
+ void enable_hooks() { --m_disabled; }
+private:
+ int m_disabled = 0;
};
}