From 46c65fea103a93d14e53652ba0a29bdeee6f56f4 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Tue, 3 Apr 2012 18:25:27 +0000 Subject: [PATCH] Option name completion support --- src/main.cc | 18 +++++++++++++++--- src/option_manager.cc | 38 ++++++++++++++++++++++++++++++++++++++ src/option_manager.hh | 25 +++++-------------------- 3 files changed, 58 insertions(+), 23 deletions(-) diff --git a/src/main.cc b/src/main.cc index d35b51ef..b001f648 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1004,15 +1004,27 @@ int main(int argc, char* argv[]) command_manager.register_commands({ "setg", "setglobal" }, [&](const CommandParameters& params, const Context&) { set_option(option_manager, params); }, - CommandManager::None); + CommandManager::None, + PerArgumentCommandCompleter({ + [&](const std::string& prefix, size_t cursor_pos) + { return option_manager.complete_option_name(prefix, cursor_pos); } + })); command_manager.register_commands({ "setb", "setbuffer" }, [&](const CommandParameters& params, const Context& context) { set_option(context.buffer().option_manager(), params); }, - CommandManager::None); + CommandManager::None, + PerArgumentCommandCompleter({ + [&](const std::string& prefix, size_t cursor_pos) + { return main_context.buffer().option_manager().complete_option_name(prefix, cursor_pos); } + })); command_manager.register_commands({ "setw", "setwindow" }, [&](const CommandParameters& params, const Context& context) { set_option(context.window().option_manager(), params); }, - CommandManager::None); + CommandManager::None, + PerArgumentCommandCompleter({ + [&](const std::string& prefix, size_t cursor_pos) + { return main_context.window().option_manager().complete_option_name(prefix, cursor_pos); } + })); register_highlighters(); register_filters(); diff --git a/src/option_manager.cc b/src/option_manager.cc index 0e326fc2..45ebdfc8 100644 --- a/src/option_manager.cc +++ b/src/option_manager.cc @@ -12,6 +12,44 @@ std::string int_to_str(int value) return oss.str(); } +Option& OptionManager::operator[] (const std::string& name) +{ + auto it = m_options.find(name); + if (it != m_options.end()) + return it->second; + else if (m_parent) + return (*m_parent)[name]; + else + return m_options[name]; +} + +const Option& OptionManager::operator[] (const std::string& name) const +{ + auto it = m_options.find(name); + if (it != m_options.end()) + return it->second; + else if (m_parent) + return (*m_parent)[name]; + else + throw option_not_found(name); +} + +CandidateList OptionManager::complete_option_name(const std::string& prefix, + size_t cursor_pos) +{ + std::string real_prefix = prefix.substr(0, cursor_pos); + CandidateList result; + if (m_parent) + result = m_parent->complete_option_name(prefix, cursor_pos); + for (auto& option : m_options) + { + if (option.first.substr(0, real_prefix.length()) == real_prefix and + not contains(result, option.first)) + result.push_back(option.first); + } + return result; +} + GlobalOptionManager::GlobalOptionManager() : OptionManager() { diff --git a/src/option_manager.hh b/src/option_manager.hh index b88ac73e..ca1bcd66 100644 --- a/src/option_manager.hh +++ b/src/option_manager.hh @@ -3,6 +3,7 @@ #include "utils.hh" #include "exception.hh" +#include "completion.hh" #include @@ -39,27 +40,11 @@ public: OptionManager(OptionManager& parent) : m_parent(&parent) {} - Option& operator[] (const std::string& name) - { - auto it = m_options.find(name); - if (it != m_options.end()) - return it->second; - else if (m_parent) - return (*m_parent)[name]; - else - return m_options[name]; - } + Option& operator[] (const std::string& name); + const Option& operator[] (const std::string& name) const; - const Option& operator[] (const std::string& name) const - { - auto it = m_options.find(name); - if (it != m_options.end()) - return it->second; - else if (m_parent) - return (*m_parent)[name]; - else - throw option_not_found(name); - } + CandidateList complete_option_name(const std::string& prefix, + size_t cursor_pos); private: OptionManager()