Use the ranked word completion logic for buffer name completion

This commit is contained in:
Maxime Coste 2016-02-09 20:04:23 +00:00
parent 3d24badc1a
commit c8dedf458d

View File

@ -17,6 +17,7 @@
#include "option_manager.hh" #include "option_manager.hh"
#include "option_types.hh" #include "option_types.hh"
#include "parameters_parser.hh" #include "parameters_parser.hh"
#include "ranked_match.hh"
#include "register_manager.hh" #include "register_manager.hh"
#include "remote.hh" #include "remote.hh"
#include "shell_manager.hh" #include "shell_manager.hh"
@ -60,24 +61,17 @@ const PerArgumentCommandCompleter filename_completer({
static CandidateList complete_buffer_name(StringView prefix, ByteCount cursor_pos) static CandidateList complete_buffer_name(StringView prefix, ByteCount cursor_pos)
{ {
prefix = prefix.substr(0, cursor_pos); prefix = prefix.substr(0, cursor_pos);
const bool include_dirs = contains(prefix, '/'); Vector<RankedMatch> matches;
CandidateList prefix_result, subsequence_result;
for (auto& buffer : BufferManager::instance()) for (auto& buffer : BufferManager::instance())
{ {
String name = buffer->display_name(); if (RankedMatch match{buffer->display_name(), prefix})
StringView match_name = name; matches.push_back(match);
if (not include_dirs and buffer->flags() & Buffer::Flags::File)
{
auto it = find(reversed(name), '/');
if (it != name.rend())
match_name = StringView{it.base() + 2, name.end()};
} }
if (prefix_match(match_name, prefix)) std::sort(matches.begin(), matches.end());
prefix_result.push_back(name); CandidateList res;
if (subsequence_match(name, prefix)) for (auto& m : matches)
subsequence_result.push_back(name); res.push_back(m.candidate().str());
} return res;
return prefix_result.empty() ? subsequence_result : prefix_result;
} }
const PerArgumentCommandCompleter buffer_completer({ const PerArgumentCommandCompleter buffer_completer({