diff --git a/src/input_handler.cc b/src/input_handler.cc index 9b1857a8..d2fb8275 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -1345,7 +1345,10 @@ public: selections.sort_and_merge_overlapping(); } else if (auto cp = key.codepoint()) + { + m_completer.try_accept(); insert(*cp); + } else if (key == ctrl('r')) { on_next_key_with_autoinfo(context(), "register", KeymapMode::None, @@ -1353,6 +1356,7 @@ public: auto cp = key.codepoint(); if (not cp or key == Key::Escape) return; + m_completer.try_accept(); insert(RegisterManager::instance()[*cp].get(context())); }, "enter register name", register_doc.str()); update_completions = false; @@ -1415,6 +1419,7 @@ public: [this, transient](Key key, Context&) { if (auto cp = get_raw_codepoint(key)) { + m_completer.try_accept(); insert(*cp); context().hooks().run_hook(Hook::InsertKey, key_to_str(key), context()); if (enabled() and not transient) diff --git a/src/insert_completer.cc b/src/insert_completer.cc index ddc96cbd..d06df6f0 100644 --- a/src/insert_completer.cc +++ b/src/insert_completer.cc @@ -474,6 +474,15 @@ void InsertCompleter::update(bool allow_implicit) auto& get_first(BufferRange& range) { return range.begin; } auto& get_last(BufferRange& range) { return range.end; } +void InsertCompleter::try_accept() +{ + if (m_completions.is_valid() and m_context.has_client() + and m_current_candidate >= 0 and m_current_candidate < m_completions.candidates.size() - 1) + { + reset(); + } +} + void InsertCompleter::reset() { if (m_explicit_completer or m_completions.is_valid()) diff --git a/src/insert_completer.hh b/src/insert_completer.hh index 1d68be86..c8c266a9 100644 --- a/src/insert_completer.hh +++ b/src/insert_completer.hh @@ -84,6 +84,7 @@ public: void select(int index, bool relative, Vector& keystrokes); void update(bool allow_implicit); + void try_accept(); void reset(); void explicit_file_complete(); diff --git a/test/hooks/completion-hide/cmd b/test/hooks/completion-hide/cmd new file mode 100644 index 00000000..b49cd0f9 --- /dev/null +++ b/test/hooks/completion-hide/cmd @@ -0,0 +1,4 @@ +:update-completions +ia +:update-completions +ib diff --git a/test/hooks/completion-hide/in b/test/hooks/completion-hide/in new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/test/hooks/completion-hide/in @@ -0,0 +1 @@ + diff --git a/test/hooks/completion-hide/out b/test/hooks/completion-hide/out new file mode 100644 index 00000000..3ad7ab16 --- /dev/null +++ b/test/hooks/completion-hide/out @@ -0,0 +1,2 @@ +accepted completion: a +rejected completion b diff --git a/test/hooks/completion-hide/rc b/test/hooks/completion-hide/rc new file mode 100644 index 00000000..565a8e6b --- /dev/null +++ b/test/hooks/completion-hide/rc @@ -0,0 +1,23 @@ +declare-option completions line1 +declare-option completions line2 +set-option global completers \ + option=line1 \ + option=line2 \ + +define-command update-completions %{ + set-option global line1 "1.1@%val{timestamp}" foo()|| + set-option global line2 "2.1@%val{timestamp}" foo()|| +} + +hook global InsertCompletionHide .+ %{ + evaluate-commands -draft %{ + select %val{hook_param} + execute-keys ia + execute-keys i "accepted completion: " + } +} +hook global InsertCompletionHide '' %{ + evaluate-commands -draft %{ + execute-keys i "rejected completion " + } +}