summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-04-03 18:25:27 +0000
committerMaxime Coste <frrrwww@gmail.com>2012-04-03 18:25:27 +0000
commit46c65fea103a93d14e53652ba0a29bdeee6f56f4 (patch)
treee53a9f01c10a5d0a30c28d436a9ec730025823ba /src
parent1d106fd31e777efb2af425674b7bc4b27f3eaf60 (diff)
Option name completion support
Diffstat (limited to 'src')
-rw-r--r--src/main.cc18
-rw-r--r--src/option_manager.cc38
-rw-r--r--src/option_manager.hh27
3 files changed, 59 insertions, 24 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 <unordered_map>
@@ -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];
- }
-
- 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);
- }
+ Option& operator[] (const std::string& name);
+ const Option& operator[] (const std::string& name) const;
+
+ CandidateList complete_option_name(const std::string& prefix,
+ size_t cursor_pos);
private:
OptionManager()