summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2018-03-01 14:04:52 +1100
committerMaxime Coste <mawww@kakoune.org>2018-03-01 14:04:52 +1100
commit7dfd439263a4f46ba5a0da861d457950cb4965be (patch)
treebdcf6c72ae5c436388f279fedd617d96c02888b9 /src
parent5c247bf1dd66a46b3263f232f353e7949e8aafd0 (diff)
parenta6a1c34288535f71fd20f6ec8b2a46a073bd1ed4 (diff)
Merge remote-tracking branch 'Delapouite/user-mode-lock'
Diffstat (limited to 'src')
-rw-r--r--src/commands.cc46
1 files changed, 31 insertions, 15 deletions
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 <scope> <name>: enable <name> keymap mode for next key",
- ParameterDesc{ {}, ParameterDesc::Flags::None, 2, 2 },
+ "enter-user-mode <switches> <scope> <name>: enable <name> keymap mode for next key",
+ ParameterDesc{
+ { { "lock", { false, "stay in mode until <esc> 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);
}
};