Consolidate constext disablable feature in a 'Disableable' helper
This commit is contained in:
parent
423030c9bd
commit
1c5975835e
|
@ -111,7 +111,7 @@ DisplayLine Client::generate_mode_line() const
|
||||||
status.push_back({ "[recording ("_str + m_input_handler.recording_reg() + ")]", info_face });
|
status.push_back({ "[recording ("_str + m_input_handler.recording_reg() + ")]", info_face });
|
||||||
if (context().buffer().flags() & Buffer::Flags::New)
|
if (context().buffer().flags() & Buffer::Flags::New)
|
||||||
status.push_back({ "[new file]", info_face });
|
status.push_back({ "[new file]", info_face });
|
||||||
if (context().are_user_hooks_disabled())
|
if (context().user_hooks_support().is_disabled())
|
||||||
status.push_back({ "[no-hooks]", info_face });
|
status.push_back({ "[no-hooks]", info_face });
|
||||||
if (context().buffer().flags() & Buffer::Flags::Fifo)
|
if (context().buffer().flags() & Buffer::Flags::Fifo)
|
||||||
status.push_back({ "[fifo]", info_face });
|
status.push_back({ "[fifo]", info_face });
|
||||||
|
|
|
@ -548,7 +548,7 @@ const CommandDesc add_hook_cmd = {
|
||||||
Regex regex(parser[2].begin(), parser[2].end());
|
Regex regex(parser[2].begin(), parser[2].end());
|
||||||
String command = parser[3];
|
String command = parser[3];
|
||||||
auto hook_func = [=](StringView param, Context& context) {
|
auto hook_func = [=](StringView param, Context& context) {
|
||||||
if (context.are_user_hooks_disabled())
|
if (context.user_hooks_support().is_disabled())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (regex_match(param.begin(), param.end(), regex))
|
if (regex_match(param.begin(), param.end(), regex))
|
||||||
|
@ -1016,7 +1016,8 @@ void context_wrap(const ParametersParser& parser, Context& context, Func func)
|
||||||
DisableOption<bool> disable_autoshowcompl(context, "autoshowcompl");
|
DisableOption<bool> disable_autoshowcompl(context, "autoshowcompl");
|
||||||
DisableOption<bool> disable_incsearch(context, "incsearch");
|
DisableOption<bool> disable_incsearch(context, "incsearch");
|
||||||
|
|
||||||
const bool disable_hooks = parser.has_option("no-hooks") or context.are_user_hooks_disabled();
|
const bool disable_hooks = parser.has_option("no-hooks") or
|
||||||
|
context.user_hooks_support().is_disabled();
|
||||||
const bool disable_keymaps = not parser.has_option("with-maps");
|
const bool disable_keymaps = not parser.has_option("with-maps");
|
||||||
|
|
||||||
ClientManager& cm = ClientManager::instance();
|
ClientManager& cm = ClientManager::instance();
|
||||||
|
@ -1029,9 +1030,9 @@ void context_wrap(const ParametersParser& parser, Context& context, Func func)
|
||||||
InputHandler input_handler{{ buffer, Selection{} }};
|
InputHandler input_handler{{ buffer, Selection{} }};
|
||||||
// Propagate user hooks disabled status to the temporary context
|
// Propagate user hooks disabled status to the temporary context
|
||||||
if (disable_hooks)
|
if (disable_hooks)
|
||||||
input_handler.context().disable_user_hooks();
|
input_handler.context().user_hooks_support().disable();
|
||||||
if (disable_keymaps)
|
if (disable_keymaps)
|
||||||
input_handler.context().disable_keymaps();
|
input_handler.context().keymaps_support().disable();
|
||||||
func(parser, input_handler.context());
|
func(parser, input_handler.context());
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -1058,9 +1059,9 @@ void context_wrap(const ParametersParser& parser, Context& context, Func func)
|
||||||
|
|
||||||
// Propagate user hooks disabled status to the temporary context
|
// Propagate user hooks disabled status to the temporary context
|
||||||
if (disable_hooks)
|
if (disable_hooks)
|
||||||
input_handler.context().disable_user_hooks();
|
input_handler.context().user_hooks_support().disable();
|
||||||
if (disable_keymaps)
|
if (disable_keymaps)
|
||||||
input_handler.context().disable_keymaps();
|
input_handler.context().keymaps_support().disable();
|
||||||
|
|
||||||
if (parser.has_option("itersel"))
|
if (parser.has_option("itersel"))
|
||||||
{
|
{
|
||||||
|
@ -1086,15 +1087,15 @@ void context_wrap(const ParametersParser& parser, Context& context, Func func)
|
||||||
throw runtime_error("-itersel makes no sense without -draft");
|
throw runtime_error("-itersel makes no sense without -draft");
|
||||||
|
|
||||||
if (disable_hooks)
|
if (disable_hooks)
|
||||||
real_context->disable_user_hooks();
|
real_context->user_hooks_support().disable();
|
||||||
if (disable_keymaps)
|
if (disable_keymaps)
|
||||||
real_context->disable_keymaps();
|
real_context->keymaps_support().disable();
|
||||||
|
|
||||||
auto restore = on_scope_end([&](){
|
auto restore = on_scope_end([&](){
|
||||||
if (disable_hooks)
|
if (disable_hooks)
|
||||||
real_context->enable_user_hooks();
|
real_context->user_hooks_support().enable();
|
||||||
if (disable_keymaps)
|
if (disable_keymaps)
|
||||||
real_context->enable_keymaps();
|
real_context->keymaps_support().enable();
|
||||||
});
|
});
|
||||||
|
|
||||||
func(parser, *real_context);
|
func(parser, *real_context);
|
||||||
|
|
|
@ -17,6 +17,16 @@ class DisplayLine;
|
||||||
class KeymapManager;
|
class KeymapManager;
|
||||||
class AliasRegistry;
|
class AliasRegistry;
|
||||||
|
|
||||||
|
struct Disableable
|
||||||
|
{
|
||||||
|
void disable() { m_disable_count++; }
|
||||||
|
void enable() { kak_assert(m_disable_count > 0); m_disable_count--; }
|
||||||
|
bool is_disabled() const { return m_disable_count > 0; }
|
||||||
|
bool is_enabled() const { return m_disable_count == 0; }
|
||||||
|
private:
|
||||||
|
int m_disable_count = 0;
|
||||||
|
};
|
||||||
|
|
||||||
// A Context is used to access non singleton objects for various services
|
// A Context is used to access non singleton objects for various services
|
||||||
// in commands.
|
// in commands.
|
||||||
//
|
//
|
||||||
|
@ -81,15 +91,11 @@ public:
|
||||||
bool is_editing() const { return m_edition_level!= 0; }
|
bool is_editing() const { return m_edition_level!= 0; }
|
||||||
void disable_undo_handling() { m_edition_level = -1; }
|
void disable_undo_handling() { m_edition_level = -1; }
|
||||||
|
|
||||||
bool are_user_hooks_disabled() const { return m_user_hooks_disabled; }
|
Disableable& user_hooks_support() { return m_user_hooks_support; }
|
||||||
|
const Disableable& user_hooks_support() const { return m_user_hooks_support; }
|
||||||
|
|
||||||
void disable_user_hooks() { ++m_user_hooks_disabled; }
|
Disableable& keymaps_support() { return m_keymaps_support; }
|
||||||
void enable_user_hooks() { --m_user_hooks_disabled; }
|
const Disableable& keymaps_support() const { return m_keymaps_support; }
|
||||||
|
|
||||||
bool are_keymaps_disabled() const { return m_keymaps_disabled; }
|
|
||||||
|
|
||||||
void disable_keymaps() { ++m_keymaps_disabled; }
|
|
||||||
void enable_keymaps() { --m_keymaps_disabled; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void begin_edition();
|
void begin_edition();
|
||||||
|
@ -111,8 +117,8 @@ private:
|
||||||
JumpList m_jump_list;
|
JumpList m_jump_list;
|
||||||
JumpList::iterator m_current_jump = m_jump_list.begin();
|
JumpList::iterator m_current_jump = m_jump_list.begin();
|
||||||
|
|
||||||
int m_user_hooks_disabled = 0;
|
Disableable m_user_hooks_support;
|
||||||
int m_keymaps_disabled = 0;
|
Disableable m_keymaps_support;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ScopedEdition
|
struct ScopedEdition
|
||||||
|
|
|
@ -95,7 +95,7 @@ public:
|
||||||
auto restore_hooks = on_scope_end([&, this]{
|
auto restore_hooks = on_scope_end([&, this]{
|
||||||
if (do_restore_hooks)
|
if (do_restore_hooks)
|
||||||
{
|
{
|
||||||
context().enable_user_hooks();
|
context().user_hooks_support().enable();
|
||||||
m_hooks_disabled = false;
|
m_hooks_disabled = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -113,7 +113,7 @@ public:
|
||||||
if (not m_hooks_disabled)
|
if (not m_hooks_disabled)
|
||||||
{
|
{
|
||||||
m_hooks_disabled = true;
|
m_hooks_disabled = true;
|
||||||
context().disable_user_hooks();
|
context().user_hooks_support().disable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (key == '"')
|
else if (key == '"')
|
||||||
|
@ -778,11 +778,11 @@ public:
|
||||||
if (m_autoshowcompl)
|
if (m_autoshowcompl)
|
||||||
m_completer.update();
|
m_completer.update();
|
||||||
}},
|
}},
|
||||||
m_disable_hooks{context().are_user_hooks_disabled()}
|
m_disable_hooks{context().user_hooks_support().is_disabled()}
|
||||||
{
|
{
|
||||||
// Prolongate hook disabling for the whole insert session
|
// Prolongate hook disabling for the whole insert session
|
||||||
if (m_disable_hooks)
|
if (m_disable_hooks)
|
||||||
context().disable_user_hooks();
|
context().user_hooks_support().disable();
|
||||||
|
|
||||||
last_insert().first = mode;
|
last_insert().first = mode;
|
||||||
last_insert().second.clear();
|
last_insert().second.clear();
|
||||||
|
@ -1014,7 +1014,7 @@ private:
|
||||||
selections.avoid_eol();
|
selections.avoid_eol();
|
||||||
|
|
||||||
if (m_disable_hooks)
|
if (m_disable_hooks)
|
||||||
context().enable_user_hooks();
|
context().user_hooks_support().enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class Mode { Default, Complete, InsertReg };
|
enum class Mode { Default, Complete, InsertReg };
|
||||||
|
@ -1114,7 +1114,7 @@ void InputHandler::handle_key(Key key)
|
||||||
auto keymap_mode = m_mode->keymap_mode();
|
auto keymap_mode = m_mode->keymap_mode();
|
||||||
KeymapManager& keymaps = m_context.keymaps();
|
KeymapManager& keymaps = m_context.keymaps();
|
||||||
if (keymaps.is_mapped(key, keymap_mode) and
|
if (keymaps.is_mapped(key, keymap_mode) and
|
||||||
not m_context.are_keymaps_disabled())
|
m_context.keymaps_support().is_enabled())
|
||||||
{
|
{
|
||||||
for (auto& k : keymaps.get_mapping(key, keymap_mode))
|
for (auto& k : keymaps.get_mapping(key, keymap_mode))
|
||||||
m_mode->on_key(k);
|
m_mode->on_key(k);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user