Add <a-;> in insert mode to execute a single normal mode command

This commit is contained in:
Maxime Coste 2015-06-12 13:56:11 +01:00
parent 84d8447a58
commit 3fb783f7f9

View File

@ -45,6 +45,11 @@ protected:
virtual void on_key(Key key, KeepAlive keep_alive) = 0; virtual void on_key(Key key, KeepAlive keep_alive) = 0;
void push_mode(InputMode* new_mode)
{
m_input_handler.push_mode(new_mode);
}
void pop_mode(KeepAlive& keep_alive) void pop_mode(KeepAlive& keep_alive)
{ {
kak_assert(not keep_alive.ptr); kak_assert(not keep_alive.ptr);
@ -139,7 +144,7 @@ private:
class Normal : public InputMode class Normal : public InputMode
{ {
public: public:
Normal(InputHandler& input_handler) Normal(InputHandler& input_handler, bool single_command = false)
: InputMode(input_handler), : InputMode(input_handler),
m_idle_timer{TimePoint::max(), m_idle_timer{TimePoint::max(),
context().flags() & Context::Flags::Transient ? context().flags() & Context::Flags::Transient ?
@ -153,7 +158,8 @@ public:
return; return;
context().client().check_if_buffer_needs_reloading(); context().client().check_if_buffer_needs_reloading();
timer.set_next_date(Clock::now() + fs_check_timeout); timer.set_next_date(Clock::now() + fs_check_timeout);
})} })},
m_single_command(single_command)
{} {}
void on_enabled() override void on_enabled() override
@ -220,6 +226,9 @@ public:
} }
else else
{ {
if (m_single_command)
pop_mode(keep_alive);
if (m_hooks_disabled) if (m_hooks_disabled)
do_restore_hooks = true; do_restore_hooks = true;
auto it = std::lower_bound(keymap.begin(), keymap.end(), key, auto it = std::lower_bound(keymap.begin(), keymap.end(), key,
@ -264,6 +273,7 @@ private:
Timer m_idle_timer; Timer m_idle_timer;
Timer m_fs_check_timer; Timer m_fs_check_timer;
MouseHandler m_mouse_handler; MouseHandler m_mouse_handler;
const bool m_single_command;
}; };
template<WordType word_type> template<WordType word_type>
@ -1037,6 +1047,11 @@ public:
} }
else if (key == ctrl('u')) else if (key == ctrl('u'))
context().buffer().commit_undo_group(); context().buffer().commit_undo_group();
else if (key == alt(';'))
{
push_mode(new Normal(context().input_handler(), true));
return;
}
context().hooks().run_hook("InsertKey", key_to_str(key), context()); context().hooks().run_hook("InsertKey", key_to_str(key), context());
@ -1239,8 +1254,7 @@ void InputHandler::set_prompt_face(Face prompt_face)
prompt->set_prompt_face(prompt_face); prompt->set_prompt_face(prompt_face);
} }
void InputHandler::menu(ConstArrayView<String> choices, void InputHandler::menu(ConstArrayView<String> choices, MenuCallback callback)
MenuCallback callback)
{ {
push_mode(new InputModes::Menu(*this, choices, callback)); push_mode(new InputModes::Menu(*this, choices, callback));
} }