summaryrefslogtreecommitdiff
path: root/src/command_manager.cc
diff options
context:
space:
mode:
authorJohannes Altmanninger <aclopte@gmail.com>2023-02-12 20:12:52 +0100
committerJohannes Altmanninger <aclopte@gmail.com>2023-02-17 20:50:58 +0100
commit64d4d29d43c78a403cff81d52ad0dabe06518f51 (patch)
treee2fd2c840166e4f319df69a588b899cf86182cc7 /src/command_manager.cc
parentafaa47e93fb937fbedb60bcdbc768bb937108f86 (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.cc31
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);