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 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 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 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(); diff --git a/src/command_manager.hh b/src/command_manager.hh index 92bbd7f2..72a4a7f8 100644 --- a/src/command_manager.hh +++ b/src/command_manager.hh @@ -79,13 +79,18 @@ public: private: void execute_single_command(CommandParameters params, Context& context) const; + struct CommandDescriptor { Command command; CommandFlags flags; CommandCompleter completer; }; - std::unordered_map m_commands; + using CommandMap = std::unordered_map; + CommandMap m_commands; + std::unordered_map m_aliases; + + CommandMap::const_iterator find_command(const String& name) const; }; } diff --git a/src/commands.cc b/src/commands.cc index d538ebf8..697bee68 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -819,12 +819,12 @@ void register_commands() [](const Context& context, CompletionFlags flags, const String& prefix, ByteCount cursor_pos) { return complete_filename(prefix, context.options()["ignored_files"].get(), cursor_pos); } }); - cm.register_commands({ "e", "edit" }, edit, CommandFlags::None, filename_completer); - cm.register_commands({ "e!", "edit!" }, edit, CommandFlags::None, filename_completer); - cm.register_commands({ "w", "write" }, write_buffer, CommandFlags::None, filename_completer); - cm.register_commands({ "wa", "writeall" }, write_all_buffers); - cm.register_commands({ "q", "quit" }, quit); - cm.register_commands({ "q!", "quit!" }, quit); + cm.register_commands({ "edit", "e" }, edit, CommandFlags::None, filename_completer); + cm.register_commands({ "edit!", "e!" }, edit, CommandFlags::None, filename_completer); + cm.register_commands({ "write", "w" }, write_buffer, CommandFlags::None, filename_completer); + cm.register_commands({ "writeall", "wa" }, write_all_buffers); + cm.register_commands({ "quit", "q" }, quit); + cm.register_commands({ "quit!", "q!" }, quit); cm.register_command("wq", write_and_quit); cm.register_command("wq!", write_and_quit); @@ -832,15 +832,15 @@ void register_commands() [](const Context& context, CompletionFlags flags, const String& prefix, ByteCount cursor_pos) { return BufferManager::instance().complete_buffername(prefix, cursor_pos); } }); - cm.register_commands({ "b", "buffer" }, show_buffer, CommandFlags::None, buffer_completer); - cm.register_commands({ "db", "delbuf" }, delete_buffer, CommandFlags::None, buffer_completer); - cm.register_commands({ "db!", "delbuf!" }, delete_buffer, CommandFlags::None, buffer_completer); - cm.register_commands({"nb", "namebuf"}, set_buffer_name); + cm.register_commands({ "buffer", "b" }, show_buffer, CommandFlags::None, buffer_completer); + cm.register_commands({ "delbuf", "db" }, delete_buffer, CommandFlags::None, buffer_completer); + cm.register_commands({ "delbuf!", "db!" }, delete_buffer, CommandFlags::None, buffer_completer); + cm.register_commands({ "namebuf", "nb" }, set_buffer_name); auto get_highlighters = [](const Context& c) -> HighlighterGroup& { return c.window().highlighters(); }; - cm.register_commands({ "ah", "addhl" }, add_highlighter, CommandFlags::None, group_add_completer(get_highlighters)); - cm.register_commands({ "rh", "rmhl" }, rm_highlighter, CommandFlags::None, group_rm_completer(get_highlighters)); - cm.register_commands({ "dh", "defhl" }, define_highlighter); + cm.register_commands({ "addhl", "ah" }, add_highlighter, CommandFlags::None, group_add_completer(get_highlighters)); + cm.register_commands({ "rmhl", "rh" }, rm_highlighter, CommandFlags::None, group_rm_completer(get_highlighters)); + cm.register_commands({ "defhl", "dh" }, define_highlighter); cm.register_command("hook", add_hook); cm.register_command("rmhooks", rm_hooks); @@ -881,8 +881,8 @@ void register_commands() return CandidateList{}; } ); - cm.register_commands({"ca", "colalias"}, define_color_alias); - cm.register_commands({"nc", "nameclient"}, set_client_name); + cm.register_commands({ "colalias", "ca" }, define_color_alias); + cm.register_commands({ "nameclient", "nc" }, set_client_name); cm.register_command("cd", change_working_directory, CommandFlags::None, filename_completer); cm.register_command("map", map_key);