summaryrefslogtreecommitdiff
path: root/src/option_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-01-02 19:20:16 +0000
committerMaxime Coste <frrrwww@gmail.com>2014-01-03 19:00:05 +0000
commite12bf4978c1c4bfe9e6b1d731cb835badf04255d (patch)
tree0c2e37cf8d635862a1b221133003591e1a978751 /src/option_manager.cc
parent608098cddea19bd79940cedd95149f39a36c3f07 (diff)
Try prefix completion and then subsequence completion for option names
fixes #4
Diffstat (limited to 'src/option_manager.cc')
-rw-r--r--src/option_manager.cc20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/option_manager.cc b/src/option_manager.cc
index 4bb8d2da..58589624 100644
--- a/src/option_manager.cc
+++ b/src/option_manager.cc
@@ -63,25 +63,35 @@ const Option& OptionManager::operator[](const String& name) const
throw option_not_found(name);
}
-CandidateList OptionManager::complete_option_name(const String& prefix,
- ByteCount cursor_pos)
+template<typename MatchingFunc>
+CandidateList OptionManager::get_matching_names(MatchingFunc func)
{
- String real_prefix = prefix.substr(0, cursor_pos);
CandidateList result;
if (m_parent)
- result = m_parent->complete_option_name(prefix, cursor_pos);
+ result = m_parent->get_matching_names(func);
for (auto& option : m_options)
{
if (option->flags() & Option::Flags::Hidden)
continue;
const auto& name = option->name();
- if (prefix_match(name, real_prefix) and not contains(result, name))
+ if (func(name) and not contains(result, name))
result.push_back(name);
}
return result;
}
+CandidateList OptionManager::complete_option_name(const String& prefix,
+ ByteCount cursor_pos)
+{
+ using namespace std::placeholders;
+ String real_prefix = prefix.substr(0, cursor_pos);
+ auto result = get_matching_names(std::bind(prefix_match, _1, std::ref(real_prefix)));
+ if (result.empty())
+ result = get_matching_names(std::bind(subsequence_match, _1, std::ref(real_prefix)));
+ return result;
+}
+
OptionManager::OptionList OptionManager::flatten_options() const
{
OptionList res = m_parent ? m_parent->flatten_options() : OptionList{};