diff --git a/src/hook_manager.hh b/src/hook_manager.hh index fa72cdc3f0..723dad3256 100644 --- a/src/hook_manager.hh +++ b/src/hook_manager.hh @@ -50,6 +50,8 @@ enum class Hook NormalIdle, NormalKey, ModeChange, + ModePop, + ModePush, RawKey, WinClose, WinCreate, @@ -60,7 +62,7 @@ enum class Hook constexpr auto enum_desc(Meta::Type) { - return make_array, 39>({ + return make_array, 41>({ {Hook::BufCreate, "BufCreate"}, {Hook::BufNewFile, "BufNewFile"}, {Hook::BufOpenFile, "BufOpenFile"}, @@ -94,6 +96,8 @@ constexpr auto enum_desc(Meta::Type) {Hook::NormalIdle, "NormalIdle"}, {Hook::NormalKey, "NormalKey"}, {Hook::ModeChange, "ModeChange"}, + {Hook::ModePop, "ModePop"}, + {Hook::ModePush, "ModePush"}, {Hook::RawKey, "RawKey"}, {Hook::WinClose, "WinClose"}, {Hook::WinCreate, "WinCreate"}, diff --git a/src/input_handler.cc b/src/input_handler.cc index 783632411e..721cea452c 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -1516,6 +1516,7 @@ void InputHandler::push_mode(InputMode* new_mode) new_mode->on_enabled(); context().hooks().run_hook(Hook::ModeChange, format("{}:{}", prev_name, new_mode->name()), context()); + context().hooks().run_hook(Hook::ModePush, format("{}:{}", prev_name, new_mode->name()), context()); } void InputHandler::pop_mode(InputMode* mode) @@ -1530,6 +1531,7 @@ void InputHandler::pop_mode(InputMode* mode) current_mode().on_enabled(); context().hooks().run_hook(Hook::ModeChange, format("{}:{}", prev_name, current_mode().name()), context()); + context().hooks().run_hook(Hook::ModePop, format("{}:{}", prev_name, current_mode().name()), context()); } void InputHandler::reset_normal_mode() @@ -1538,12 +1540,19 @@ void InputHandler::reset_normal_mode() if (m_mode_stack.size() == 1) return; - StringView prev_name = current_mode().name(); - current_mode().on_disabled(false); - m_mode_stack.resize(1); - current_mode().on_enabled(); + StringView initial_name = current_mode().name(); - context().hooks().run_hook(Hook::ModeChange, format("{}:{}", prev_name, current_mode().name()), context()); + while (m_mode_stack.size() > 1) + { + StringView prev_name = current_mode().name(); + current_mode().on_disabled(false); + m_mode_stack.pop_back(); + current_mode().on_enabled(); + + context().hooks().run_hook(Hook::ModePop, format("{}:{}", prev_name, current_mode().name()), context()); + } + + context().hooks().run_hook(Hook::ModeChange, format("{}:{}", initial_name, current_mode().name()), context()); } void InputHandler::insert(InsertMode mode, int count)