summaryrefslogtreecommitdiff
path: root/src/command_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-01-26 16:14:02 +0000
committerMaxime Coste <frrrwww@gmail.com>2014-01-27 19:51:58 +0000
commit37b4eacdc86e04dbca168b430eaedd829dd24ae6 (patch)
treee1aef5914c77a2810541af1f1c7a728f927ec692 /src/command_manager.cc
parent00c1523c6e0d03b5176b5066d44934d3fbe1704d (diff)
Rework command completion to allow partial token completion
Implement hook completion. fixes #44
Diffstat (limited to 'src/command_manager.cc')
-rw-r--r--src/command_manager.cc35
1 files changed, 19 insertions, 16 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc
index 38d37c96..377089e3 100644
--- a/src/command_manager.cc
+++ b/src/command_manager.cc
@@ -376,7 +376,6 @@ Completions CommandManager::complete(const Context& context, CompletionFlags fla
ByteCount start = tok_idx < tokens.size() ?
tokens[tok_idx].begin() : cursor_pos;
- Completions result(start , cursor_pos);
ByteCount cursor_pos_in_token = cursor_pos - start;
const Token::Type token_type = tok_idx < tokens.size() ?
@@ -384,15 +383,17 @@ Completions CommandManager::complete(const Context& context, CompletionFlags fla
switch (token_type)
{
case Token::Type::OptionExpand:
+ {
+ Completions result(start , cursor_pos);
result.candidates = context.options().complete_option_name(tokens[tok_idx].content(), cursor_pos_in_token);
return result;
+ }
case Token::Type::ShellExpand:
{
- Completions shell_completion = shell_complete(context, flags, tokens[tok_idx].content(), cursor_pos_in_token);
- result.start = start + shell_completion.start;
- result.end = start + shell_completion.end;
- result.candidates = std::move(shell_completion.candidates);
- return result;
+ Completions shell_completions = shell_complete(context, flags, tokens[tok_idx].content(), cursor_pos_in_token);
+ shell_completions.start += start;
+ shell_completions.end += start;
+ return shell_completions;
}
case Token::Type::Raw:
{
@@ -410,10 +411,12 @@ Completions CommandManager::complete(const Context& context, CompletionFlags fla
params.push_back(token_it->content());
if (tok_idx == tokens.size())
params.push_back("");
- result.candidates = command_it->second.completer(context, flags, params,
- tok_idx - cmd_idx - 1,
- cursor_pos_in_token);
- return result;
+ Completions completions = command_it->second.completer(context, flags, params,
+ tok_idx - cmd_idx - 1,
+ cursor_pos_in_token);
+ completions.start += start;
+ completions.end += start;
+ return completions;
}
default:
break;
@@ -421,14 +424,14 @@ Completions CommandManager::complete(const Context& context, CompletionFlags fla
return Completions{};
}
-CandidateList PerArgumentCommandCompleter::operator()(const Context& context,
- CompletionFlags flags,
- CommandParameters params,
- size_t token_to_complete,
- ByteCount pos_in_token) const
+Completions PerArgumentCommandCompleter::operator()(const Context& context,
+ CompletionFlags flags,
+ CommandParameters params,
+ size_t token_to_complete,
+ ByteCount pos_in_token) const
{
if (token_to_complete >= m_completers.size())
- return CandidateList();
+ return Completions{};
// it is possible to try to complete a new argument
kak_assert(token_to_complete <= params.size());