diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-08-04 18:59:31 +0200 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-08-04 18:59:31 +0200 |
| commit | 0f4cecfa3ee5323557d08d0834b508eff20a8764 (patch) | |
| tree | 1df5578dee9de9b42e96f69064a2b4e75c764fc5 /src/input_handler.cc | |
| parent | 3fe0b8e719e70055b25c16f8089b2a747f2d8058 (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.cc | 54 |
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); |
