diff options
| author | Johannes Altmanninger <aclopte@gmail.com> | 2023-02-12 20:12:52 +0100 |
|---|---|---|
| committer | Johannes Altmanninger <aclopte@gmail.com> | 2023-02-17 20:50:58 +0100 |
| commit | 64d4d29d43c78a403cff81d52ad0dabe06518f51 (patch) | |
| tree | e2fd2c840166e4f319df69a588b899cf86182cc7 /src/command_manager.cc | |
| parent | afaa47e93fb937fbedb60bcdbc768bb937108f86 (diff) | |
Use parameter parser to skip switch args in completion
The command line "hook -group xyz " should get scope completions but
it actually gets hook completions because "xyz" is wrongly interpreted
as positional argument.
Fix this by using the parameters parser to compute positional
arguments.
Fixes #4840
Diffstat (limited to 'src/command_manager.cc')
| -rw-r--r-- | src/command_manager.cc | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc index 13d79b2d..a2f1aad5 100644 --- a/src/command_manager.cc +++ b/src/command_manager.cc @@ -812,24 +812,31 @@ Completions CommandManager::complete(const Context& context, auto& command = command_it->value; - const bool has_switches = not command.param_desc.switches.empty(); - auto is_switch = [=](StringView s) { return has_switches and s.substr(0_byte, 1_byte) == "-"; }; + auto raw_params = tokens | skip(1) | transform(&Token::content) | gather<Vector<String>>(); + ParametersParser parser{raw_params, command.param_desc, true}; - if (is_switch(token.content) - and not contains(tokens | drop(1) | transform(&Token::content), "--")) + switch (parser.state()) { - auto switches = Kakoune::complete(token.content.substr(1_byte), pos_in_token, - concatenated(command.param_desc.switches - | transform(&SwitchMap::Item::key), - ConstArrayView<String>{"-"})); - return switches.empty() - ? Completions{} - : Completions{start+1, cursor_pos, std::move(switches), Completions::Flags::Menu}; + case ParametersParser::State::Switch: + { + auto switches = Kakoune::complete(token.content.substr(1_byte), pos_in_token, + concatenated(command.param_desc.switches + | transform(&SwitchMap::Item::key), + ConstArrayView<String>{"-"})); + return switches.empty() + ? Completions{} + : Completions{start+1, cursor_pos, std::move(switches), Completions::Flags::Menu}; + } + case ParametersParser::State::SwitchArgument: + return Completions{}; + case ParametersParser::State::Positional: + break; } + if (not command.completer) return Completions{}; - auto params = tokens | skip(1) | transform(&Token::content) | filter(std::not_fn(is_switch)) | gather<Vector>(); + Vector<String> params{parser.begin(), parser.end()}; auto index = params.size() - 1; return offset_pos(requote(command.completer(context, flags, params, index, pos_in_token), token.type), start); |
