From a95cb94b79c235f1b82bab647f5410fe0acc535b Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 17 Jun 2021 17:53:27 +0200 Subject: [PATCH] Language client: move cursor forward if no arguments in completed function and if cursor is still inside () --- src/source_language_protocol.cpp | 13 +++++++++++++ src/source_language_protocol.hpp | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/source_language_protocol.cpp b/src/source_language_protocol.cpp index 22b36d5..0a1b192 100644 --- a/src/source_language_protocol.cpp +++ b/src/source_language_protocol.cpp @@ -1197,6 +1197,7 @@ void Source::LanguageProtocolView::setup_autocomplete() { // Activate argument completions get_buffer()->signal_changed().connect( [this] { + autocompete_possibly_no_arguments = false; if(!interactive_completion) return; if(CompletionDialog::get() && CompletionDialog::get()->is_visible()) @@ -1434,6 +1435,17 @@ void Source::LanguageProtocolView::setup_autocomplete() { parameter_position++; } } + if(autocomplete_rows.empty()) { + dispatcher.post([this] { + // Move cursor forward if no arguments in completed function and if cursor is still inside () + if(autocompete_possibly_no_arguments) { + auto iter = get_buffer()->get_insert()->get_iter(); + auto prev = iter; + if(prev.backward_char() && *prev == '(' && *iter == ')' && iter.forward_char()) + get_buffer()->place_cursor(iter); + } + }); + } } result_processed.set_value(); }); @@ -1558,6 +1570,7 @@ void Source::LanguageProtocolView::setup_autocomplete() { auto iter = get_buffer()->get_insert()->get_iter(); if(*iter == ')' && iter.backward_char() && *iter == '(') { // If no arguments, try signatureHelp last_keyval = '('; + autocompete_possibly_no_arguments = true; autocomplete->run(); } } diff --git a/src/source_language_protocol.hpp b/src/source_language_protocol.hpp index 7088c3b..cc3514f 100644 --- a/src/source_language_protocol.hpp +++ b/src/source_language_protocol.hpp @@ -251,6 +251,8 @@ namespace Source { std::atomic autocomplete_enable_snippets = {false}; bool autocomplete_show_arguments = false; sigc::connection autocomplete_delayed_show_arguments_connection; + /// Used to move cursor forward if no arguments in completed function and if cursor is still inside () + bool autocompete_possibly_no_arguments = false; /// If language supports named parameters, returns the symbol separating the named parameter and value, /// for instance '=' for Python