From a6a1c34288535f71fd20f6ec8b2a46a073bd1ed4 Mon Sep 17 00:00:00 2001 From: Delapouite Date: Sun, 25 Feb 2018 16:16:25 +0100 Subject: Add -lock switch to enter-user-mode command --- src/commands.cc | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/commands.cc b/src/commands.cc index a0b75ef2..818002d4 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -2135,11 +2135,38 @@ const CommandDesc declare_user_mode_cmd = { } }; +void enter_user_mode(Context& context, const String mode_name, KeymapMode mode, bool lock) +{ + on_next_key_with_autoinfo(context, KeymapMode::None, + [mode_name, mode, lock](Key key, Context& context) mutable { + if (key == Key::Escape) + return; + if (not context.keymaps().is_mapped(key, mode)) + return; + + auto& mapping = context.keymaps().get_mapping(key, mode); + ScopedSetBool disable_keymaps(context.keymaps_disabled()); + + InputHandler::ScopedForceNormal force_normal{context.input_handler(), {}}; + + ScopedEdition edition(context); + for (auto& key : mapping.keys) + context.input_handler().handle_key(key); + + if (lock) + enter_user_mode(context, std::move(mode_name), mode, true); + }, lock ? format("{} (lock)", mode_name) : mode_name, + build_autoinfo_for_mapping(context, mode, {})); +} + const CommandDesc enter_user_mode_cmd = { "enter-user-mode", nullptr, - "enter-user-mode : enable keymap mode for next key", - ParameterDesc{ {}, ParameterDesc::Flags::None, 2, 2 }, + "enter-user-mode : enable keymap mode for next key", + ParameterDesc{ + { { "lock", { false, "stay in mode until is pressed" } } }, + ParameterDesc::Flags::SwitchesOnlyAtStart, 2, 2 + }, CommandFlags::None, CommandHelper{}, [](const Context& context, CompletionFlags flags, @@ -2159,22 +2186,11 @@ const CommandDesc enter_user_mode_cmd = { }, [](const ParametersParser& parser, Context& context, const ShellContext&) { + auto lock = (bool)parser.get_switch("lock"); KeymapManager& keymaps = get_scope(parser[0], context).keymaps(); KeymapMode mode = parse_keymap_mode(parser[1], keymaps.user_modes()); - on_next_key_with_autoinfo(context, KeymapMode::None, - [mode](Key key, Context& context) mutable { - if (not context.keymaps().is_mapped(key, mode)) - return; - auto& mapping = context.keymaps().get_mapping(key, mode); - ScopedSetBool disable_keymaps(context.keymaps_disabled()); - - InputHandler::ScopedForceNormal force_normal{context.input_handler(), {}}; - - ScopedEdition edition(context); - for (auto& key : mapping.keys) - context.input_handler().handle_key(key); - }, parser[1], build_autoinfo_for_mapping(context, mode, {})); + enter_user_mode(context, std::move(parser[1]), mode, lock); } }; -- cgit v1.2.3