summaryrefslogtreecommitdiff
path: root/src/command_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-12-24 02:06:22 +0000
committerMaxime Coste <frrrwww@gmail.com>2013-12-24 02:06:22 +0000
commitfd17ea00ddbb50118bcca0b3d5c431888e30105b (patch)
tree460956366bd0a598d67e8afc1d08255120ce0dca /src/command_manager.cc
parent01e1169e2c9ca9d7e3956e593a47e1e2d7e7d30c (diff)
CommandManager: use aliases for commands rather than duplicating data
Completion now only proposes full command names
Diffstat (limited to 'src/command_manager.cc')
-rw-r--r--src/command_manager.cc22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc
index 4338e11e..3fe0f477 100644
--- a/src/command_manager.cc
+++ b/src/command_manager.cc
@@ -13,7 +13,7 @@ namespace Kakoune
bool CommandManager::command_defined(const String& command_name) const
{
- return m_commands.find(command_name) != m_commands.end();
+ return find_command(command_name) != m_commands.end();
}
void CommandManager::register_command(String command_name,
@@ -29,8 +29,10 @@ void CommandManager::register_commands(memoryview<String> command_names,
CommandFlags flags,
CommandCompleter completer)
{
- for (auto command_name : command_names)
- m_commands[command_name] = { command, flags, completer };
+ kak_assert(not command_names.empty());
+ m_commands[command_names[0]] = { std::move(command), flags, completer };
+ for (size_t i = 1; i < command_names.size(); ++i)
+ m_aliases[command_names[i]] = command_names[0];
}
struct parse_error : runtime_error
@@ -246,16 +248,24 @@ struct command_not_found : runtime_error
: runtime_error(command + " : no such command") {}
};
+CommandManager::CommandMap::const_iterator CommandManager::find_command(const String& name) const
+{
+ auto it = m_aliases.find(name);
+ const String& cmd_name = it == m_aliases.end() ? name : it->second;
+
+ return m_commands.find(cmd_name);
+}
+
void CommandManager::execute_single_command(CommandParameters params,
Context& context) const
{
if (params.empty())
return;
- auto command_it = m_commands.find(params[0]);
+ memoryview<String> param_view(params.begin()+1, params.end());
+ auto command_it = find_command(params[0]);
if (command_it == m_commands.end())
throw command_not_found(params[0]);
- memoryview<String> param_view(params.begin()+1, params.end());
command_it->second.command(param_view, context);
}
@@ -350,7 +360,7 @@ Completions CommandManager::complete(const Context& context, CompletionFlags fla
const String& command_name = tokens[0].content();
- auto command_it = m_commands.find(command_name);
+ auto command_it = find_command(command_name);
if (command_it == m_commands.end() or not command_it->second.completer)
return Completions();