#ifndef command_manager_hh_INCLUDED #define command_manager_hh_INCLUDED #include #include #include #include #include #include "utils.hh" #include "completion.hh" namespace Kakoune { struct Context; struct wrong_argument_count : runtime_error { wrong_argument_count() : runtime_error("wrong argument count") {} }; typedef std::vector CommandParameters; typedef std::function Command; typedef std::function CommandCompleter; class PerArgumentCommandCompleter { public: typedef std::function ArgumentCompleter; typedef std::vector ArgumentCompleterList; PerArgumentCommandCompleter(const ArgumentCompleterList& completers) : m_completers(completers) {} PerArgumentCommandCompleter(ArgumentCompleterList&& completers) : m_completers(completers) {} PerArgumentCommandCompleter(std::initializer_list completers) : m_completers(completers) {} CandidateList operator()(const CommandParameters& params, size_t token_to_complete, size_t pos_in_token) const; private: ArgumentCompleterList m_completers; }; class CommandManager : public Singleton { public: enum Flags { None = 0, IgnoreSemiColons = 1, }; void execute(const std::string& command_line, const Context& context); void execute(const CommandParameters& params, const Context& context); Completions complete(const std::string& command_line, size_t cursor_pos); void register_command(const std::string& command_name, Command command, unsigned flags = None, const CommandCompleter& completer = CommandCompleter()); void register_command(const std::vector& command_names, Command command, unsigned flags = None, const CommandCompleter& completer = CommandCompleter()); private: struct CommandDescriptor { Command command; unsigned flags; CommandCompleter completer; }; std::unordered_map m_commands; }; } #endif // command_manager_hh_INCLUDED