diff --git a/doc/pages/keys.asciidoc b/doc/pages/keys.asciidoc index 74b5da17..e54cfa1a 100644 --- a/doc/pages/keys.asciidoc +++ b/doc/pages/keys.asciidoc @@ -739,3 +739,6 @@ The following keys are recognized by this mode to help with editing (See <*:: expand the typed expansions in currently entered text (See <>) + +**:: + escape to normal mode for a single command diff --git a/src/input_handler.cc b/src/input_handler.cc index 0d0d2feb..d5e299ff 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -175,11 +175,14 @@ public: context().client().check_if_buffer_needs_reloading(); timer.set_next_date(Clock::now() + get_fs_check_timeout(context())); }}}, - m_single_command(single_command) + m_state(single_command ? State::SingleCommand : State::Normal) {} void on_enabled() override { + if (m_state == State::PopOnEnabled) + return pop_mode(); + if (not (context().flags() & Context::Flags::Draft)) { if (context().has_client()) @@ -214,6 +217,7 @@ public: void on_key(Key key) override { + kak_assert(m_state != State::PopOnEnabled); ScopedSetBool set_in_on_key{m_in_on_key}; // Hack to parse keys sent by terminals using the 8th bit to mark the @@ -283,11 +287,12 @@ public: } else { - // Preserve hooks disabled for the whole execution prior to pop_mode - ScopedSetBool disable_hooks{context().hooks_disabled(), - m_single_command and m_hooks_disabled}; - if (m_single_command) - pop_mode(); + auto pop_if_single_command = on_scope_end([this] { + if (m_state == State::SingleCommand and enabled()) + pop_mode(); + else if (m_state == State::SingleCommand) + m_state = State::PopOnEnabled; + }); context().print_status({}); if (context().has_client()) @@ -350,7 +355,9 @@ private: Timer m_idle_timer; Timer m_fs_check_timer; MouseHandler m_mouse_handler; - const bool m_single_command; + + enum class State { Normal, SingleCommand, PopOnEnabled }; + State m_state; }; template @@ -897,6 +904,11 @@ public: return; } } + else if (key == alt(';')) + { + push_mode(new Normal(context().input_handler(), true)); + return; + } else { m_line_editor.handle_key(key); @@ -999,9 +1011,11 @@ private: m_idle_timer.set_next_date(Clock::now() + get_idle_timeout(context())); } - void on_disabled(bool) override + void on_disabled(bool temporary) override { - context().print_status({}); + if (not temporary) + context().print_status({}); + m_idle_timer.set_next_date(TimePoint::max()); if (context().has_client()) context().client().menu_hide(); diff --git a/test/regression/1435-misplaced-cursor-with-show_matching-hl/ui-out b/test/regression/1435-misplaced-cursor-with-show_matching-hl/ui-out index 828495b6..56262fcc 100644 --- a/test/regression/1435-misplaced-cursor-with-show_matching-hl/ui-out +++ b/test/regression/1435-misplaced-cursor-with-show_matching-hl/ui-out @@ -2,7 +2,7 @@ { "jsonrpc": "2.0", "method": "draw", "params": [[[{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "·" }, { "face": { "fg": "black", "bg": "cyan", "attributes": [] }, "contents": "¬" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "¬" }]], { "fg": "default", "bg": "default", "attributes": [] }, { "fg": "blue", "bg": "default", "attributes": [] }] } { "jsonrpc": "2.0", "method": "menu_hide", "params": [] } { "jsonrpc": "2.0", "method": "info_hide", "params": [] } -{ "jsonrpc": "2.0", "method": "draw_status", "params": [[], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "out 1:2 " }, { "face": { "fg": "black", "bg": "yellow", "attributes": [] }, "contents": "[+]" }, { "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " " }, { "face": { "fg": "yellow", "bg": "default", "attributes": [] }, "contents": "insert" }, { "face": { "fg": "cyan", "bg": "default", "attributes": [] }, "contents": " " }, { "face": { "fg": "blue", "bg": "default", "attributes": [] }, "contents": "1 sels (1)" }, { "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " - client0@[kak-tests]" }], { "fg": "cyan", "bg": "default", "attributes": [] }] } +{ "jsonrpc": "2.0", "method": "draw_status", "params": [[], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "out 1:2 " }, { "face": { "fg": "black", "bg": "yellow", "attributes": [] }, "contents": "[+]" }, { "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " " }, { "face": { "fg": "blue", "bg": "default", "attributes": [] }, "contents": "1 sel" }, { "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " - client0@[kak-tests]" }], { "fg": "cyan", "bg": "default", "attributes": [] }] } { "jsonrpc": "2.0", "method": "set_cursor", "params": ["buffer", { "line": 0, "column": 1 }] } { "jsonrpc": "2.0", "method": "refresh", "params": [true] } { "jsonrpc": "2.0", "method": "draw", "params": [[[{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "·" }, { "face": { "fg": "black", "bg": "cyan", "attributes": [] }, "contents": "¬" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "¬" }]], { "fg": "default", "bg": "default", "attributes": [] }, { "fg": "blue", "bg": "default", "attributes": [] }] }