BufferCompleter refactoring, add support for explicit filename completion with c-f

This commit is contained in:
Maxime Coste 2013-08-04 18:59:31 +02:00
parent 3fe0b8e719
commit 0f4cecfa3e

View File

@ -593,7 +593,24 @@ public:
m_completions = BufferCompletion{};
m_context.ui().menu_hide();
}
private:
template<BufferCompletion (BufferCompleter::*complete_func)(const Buffer&, BufferCoord)>
bool try_complete()
{
auto& buffer = m_context.buffer();
BufferCoord cursor_pos = m_context.editor().main_selection().last();
m_completions = (this->*complete_func)(buffer, cursor_pos);
if (not m_completions.is_valid())
return false;
kak_assert(cursor_pos >= m_completions.begin);
m_matching_candidates = m_completions.candidates;
m_current_candidate = m_matching_candidates.size();
m_context.ui().menu_hide();
menu_show();
m_matching_candidates.push_back(buffer.string(m_completions.begin, m_completions.end));
return true;
}
using StringList = std::vector<String>;
template<bool other_buffers>
@ -706,6 +723,7 @@ private:
return {};
}
private:
void on_option_changed(const Option& opt) override
{
if (opt.name() == "completions")
@ -729,26 +747,17 @@ private:
{
if (not m_completions.is_valid())
{
auto& buffer = m_context.buffer();
auto& completers = options()["completers"].get<StringList>();
BufferCoord cursor_pos = m_context.editor().main_selection().last();
if (contains(completers, "option"))
m_completions = complete_opt(buffer, cursor_pos);
if (not m_completions.is_valid() and contains(completers, "word=buffer"))
m_completions = complete_word<false>(buffer, cursor_pos);
if (not m_completions.is_valid() and contains(completers, "word=all"))
m_completions = complete_word<true>(buffer, cursor_pos);
if (not m_completions.is_valid() and contains(completers, "filename"))
m_completions = complete_filename(buffer, cursor_pos);
if (not m_completions.is_valid())
return false;
if (contains(completers, "option") and try_complete<&BufferCompleter::complete_opt>())
return true;
if (contains(completers, "word=buffer") and try_complete<&BufferCompleter::complete_word<false>>())
return true;
if (contains(completers, "word=all") and try_complete<&BufferCompleter::complete_word<true>>())
return true;
if (contains(completers, "filename") and try_complete<&BufferCompleter::complete_filename>())
return true;
kak_assert(cursor_pos >= m_completions.begin);
m_matching_candidates = m_completions.candidates;
m_current_candidate = m_matching_candidates.size();
menu_show();
m_matching_candidates.push_back(buffer.string(m_completions.begin, m_completions.end));
return false;
}
return true;
}
@ -841,6 +850,11 @@ public:
m_completer.select(-1);
update_completions = false;
}
else if ( key == Key{ Key::Modifiers::Control, 'f' })
{
m_completer.try_complete<&BufferCompleter::complete_filename>();
update_completions = false;
}
if (update_completions)
m_idle_timer.set_next_date(Clock::now() + idle_timeout);