Merge remote-tracking branch 'krobelus/fix-cd-after-backspace'

This commit is contained in:
Maxime Coste 2022-12-22 09:51:58 +11:00
commit c31e53e8a4
4 changed files with 17 additions and 4 deletions

View File

@ -241,7 +241,8 @@ struct ShellScriptCompleter
ShellManager::Flags::WaitForStdout,
shell_context).first;
CandidateList candidates;
for (auto&& candidate : output | split<StringView>('\n'))
for (auto&& candidate : output | split<StringView>('\n')
| filter([](auto s) { return not s.empty(); }))
candidates.push_back(candidate.str());
return {0_byte, pos_in_token, std::move(candidates), m_flags};
@ -274,7 +275,8 @@ struct ShellCandidatesCompleter
ShellManager::Flags::WaitForStdout,
shell_context).first;
m_candidates.clear();
for (auto c : output | split<StringView>('\n'))
for (auto c : output | split<StringView>('\n')
| filter([](auto s) { return not s.empty(); }))
m_candidates.emplace_back(c.str(), used_letters(c));
m_token = token_to_complete;
}

View File

@ -518,6 +518,14 @@ CandidateList complete_filename(StringView prefix, const Regex& ignored_regex,
if (RankedMatch match{file, fileprefix})
matches.push_back(match);
}
// Hack: when completing directories, also echo back the query if it
// is a valid directory. This enables menu completion to select the
// directory instead of a child.
if (only_dirs and not dirname.empty() and dirname.back() == '/' and fileprefix.empty()
and /* exists on disk */ not files.empty())
{
matches.push_back(RankedMatch{fileprefix, fileprefix});
}
std::sort(matches.begin(), matches.end());
const bool expand = (flags & FilenameFlags::Expand);
return candidates(matches, expand ? parsed_dirname : dirname);

View File

@ -112,12 +112,13 @@ static Optional<SubseqRes> subsequence_match_smart_case(StringView str, StringVi
template<typename TestFunc>
RankedMatch::RankedMatch(StringView candidate, StringView query, TestFunc func)
{
if (candidate.empty() or query.length() > candidate.length())
if (query.length() > candidate.length())
return;
if (query.empty())
{
m_candidate = candidate;
m_matches = true;
return;
}
@ -129,6 +130,7 @@ RankedMatch::RankedMatch(StringView candidate, StringView query, TestFunc func)
return;
m_candidate = candidate;
m_matches = true;
m_max_index = res->max_index;
if (res->single_word)

View File

@ -27,7 +27,7 @@ struct RankedMatch
bool operator<(const RankedMatch& other) const;
bool operator==(const RankedMatch& other) const { return m_candidate == other.m_candidate; }
explicit operator bool() const { return not m_candidate.empty(); }
explicit operator bool() const { return m_matches; }
private:
template<typename TestFunc>
@ -48,6 +48,7 @@ private:
friend constexpr bool with_bit_ops(Meta::Type<Flags>) { return true; }
StringView m_candidate{};
bool m_matches = false;
Flags m_flags = Flags::None;
int m_word_boundary_match_count = 0;
int m_max_index = 0;