From 5bf92430064a5136dba51402bd852398cee7e994 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Tue, 22 Mar 2016 22:54:29 +0000 Subject: User mappings and :exec are always executed in normal mode Fix #551 --- src/input_handler.cc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/input_handler.cc') diff --git a/src/input_handler.cc b/src/input_handler.cc index 0dbd5ddc..874601c2 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -1325,6 +1325,35 @@ void InputHandler::on_next_key(KeymapMode keymap_mode, KeyCallback callback) push_mode(new InputModes::NextKey(*this, keymap_mode, callback)); } +InputHandler::ScopedForceNormal::ScopedForceNormal(InputHandler& handler) + : m_handler(handler), m_mode(nullptr) +{ + if (handler.m_mode_stack.size() == 1) + return; + + handler.push_mode(new InputModes::Normal(handler)); + m_mode = handler.m_mode_stack.back().get(); +} + +InputHandler::ScopedForceNormal::~ScopedForceNormal() +{ + if (not m_mode) + return; + + kak_assert(m_handler.m_mode_stack.size() > 1); + + if (m_mode == m_handler.m_mode_stack.back().get()) + m_handler.pop_mode(m_mode); + else + { + auto it = find_if(m_handler.m_mode_stack, + [this](const RefPtr& m) + { return m.get() == m_mode; }); + kak_assert(it != m_handler.m_mode_stack.end()); + m_handler.m_mode_stack.erase(it); + } +} + static bool is_valid(Key key) { return key != Key::Invalid and -- cgit v1.2.3