diff options
| author | Maxime Coste <mawww@kakoune.org> | 2018-03-01 14:04:52 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2018-03-01 14:04:52 +1100 |
| commit | 7dfd439263a4f46ba5a0da861d457950cb4965be (patch) | |
| tree | bdcf6c72ae5c436388f279fedd617d96c02888b9 | |
| parent | 5c247bf1dd66a46b3263f232f353e7949e8aafd0 (diff) | |
| parent | a6a1c34288535f71fd20f6ec8b2a46a073bd1ed4 (diff) | |
Merge remote-tracking branch 'Delapouite/user-mode-lock'
| -rw-r--r-- | doc/pages/commands.asciidoc | 3 | ||||
| -rw-r--r-- | src/commands.cc | 46 | ||||
| -rw-r--r-- | test/normal/user-modes/cmd | 4 | ||||
| -rw-r--r-- | test/normal/user-modes/lock/cmd | 1 | ||||
| -rw-r--r-- | test/normal/user-modes/lock/in | 1 | ||||
| -rw-r--r-- | test/normal/user-modes/lock/out | 1 | ||||
| -rw-r--r-- | test/normal/user-modes/lock/rc | 3 | ||||
| -rw-r--r-- | test/normal/user-modes/once/cmd | 1 | ||||
| -rw-r--r-- | test/normal/user-modes/once/in (renamed from test/normal/user-modes/in) | 0 | ||||
| -rw-r--r-- | test/normal/user-modes/once/out (renamed from test/normal/user-modes/out) | 0 | ||||
| -rw-r--r-- | test/normal/user-modes/once/rc | 3 | ||||
| -rwxr-xr-x | test/run | 2 |
12 files changed, 45 insertions, 20 deletions
diff --git a/doc/pages/commands.asciidoc b/doc/pages/commands.asciidoc index 3be1ce1c..73930999 100644 --- a/doc/pages/commands.asciidoc +++ b/doc/pages/commands.asciidoc @@ -135,6 +135,9 @@ command *q!* has to be used). Aliases are mentionned below each commands. *enter-user-mode* <scope> <name>:: enable <name> keymap mode for next key + *-lock*::: + stay in mode until `<esc>` is pressed + == Hooks *hook* [-group <group>] <scope> <hook_name> <filtering_regex> <command>:: 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); } }; diff --git a/test/normal/user-modes/cmd b/test/normal/user-modes/cmd deleted file mode 100644 index 455c6ded..00000000 --- a/test/normal/user-modes/cmd +++ /dev/null @@ -1,4 +0,0 @@ -:declare-user-mode global foo<ret> -:map global foo f '<esc>wchello from foo<esc>' -:enter-user-mode global foo -f diff --git a/test/normal/user-modes/lock/cmd b/test/normal/user-modes/lock/cmd new file mode 100644 index 00000000..8c169dd5 --- /dev/null +++ b/test/normal/user-modes/lock/cmd @@ -0,0 +1 @@ +<a-,>fff<esc>f diff --git a/test/normal/user-modes/lock/in b/test/normal/user-modes/lock/in new file mode 100644 index 00000000..28076c78 --- /dev/null +++ b/test/normal/user-modes/lock/in @@ -0,0 +1 @@ +123delete diff --git a/test/normal/user-modes/lock/out b/test/normal/user-modes/lock/out new file mode 100644 index 00000000..c8b1b423 --- /dev/null +++ b/test/normal/user-modes/lock/out @@ -0,0 +1 @@ +delete diff --git a/test/normal/user-modes/lock/rc b/test/normal/user-modes/lock/rc new file mode 100644 index 00000000..b3114fef --- /dev/null +++ b/test/normal/user-modes/lock/rc @@ -0,0 +1,3 @@ +declare-user-mode global foo +map global foo f d +map global normal <a-,> ':enter-user-mode -lock global foo<ret>' diff --git a/test/normal/user-modes/once/cmd b/test/normal/user-modes/once/cmd new file mode 100644 index 00000000..c86211cb --- /dev/null +++ b/test/normal/user-modes/once/cmd @@ -0,0 +1 @@ +<a-,>ff diff --git a/test/normal/user-modes/in b/test/normal/user-modes/once/in index 5716ca59..5716ca59 100644 --- a/test/normal/user-modes/in +++ b/test/normal/user-modes/once/in diff --git a/test/normal/user-modes/out b/test/normal/user-modes/once/out index 196f02f0..196f02f0 100644 --- a/test/normal/user-modes/out +++ b/test/normal/user-modes/once/out diff --git a/test/normal/user-modes/once/rc b/test/normal/user-modes/once/rc new file mode 100644 index 00000000..102a6163 --- /dev/null +++ b/test/normal/user-modes/once/rc @@ -0,0 +1,3 @@ +declare-user-mode global foo +map global foo f 'wchello from foo<esc>' +map global normal <a-,> ':enter-user-mode global foo<ret>' @@ -19,7 +19,7 @@ main() { eval -buffer *debug* write debug quit! } - try %{ exec "%sh{cat cmd}" } + try %{ exec -with-maps "%sh{cat cmd}" } exec <c-l> eval -buffer *debug* write debug nop %sh{ |
