summaryrefslogtreecommitdiff
path: root/src/input_handler.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-08-04 18:59:31 +0200
committerMaxime Coste <frrrwww@gmail.com>2013-08-04 18:59:31 +0200
commit0f4cecfa3ee5323557d08d0834b508eff20a8764 (patch)
tree1df5578dee9de9b42e96f69064a2b4e75c764fc5 /src/input_handler.cc
parent3fe0b8e719e70055b25c16f8089b2a747f2d8058 (diff)
BufferCompleter refactoring, add support for explicit filename completion with c-f
Diffstat (limited to 'src/input_handler.cc')
-rw-r--r--src/input_handler.cc54
1 files changed, 34 insertions, 20 deletions
diff --git a/src/input_handler.cc b/src/input_handler.cc
index 83579f02..bf0cd368 100644
--- a/src/input_handler.cc
+++ b/src/input_handler.cc
@@ -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;
-
- 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));
+ 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;
+
+ 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);