From 0696a8e32f2df8fcf4ea8fd37356235ae5e1fa58 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 4 Oct 2015 11:23:26 +0200 Subject: [PATCH] Improved autocomplete insertion rules. --- src/source.cc | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/source.cc b/src/source.cc index abb376a..dc29f72 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1983,21 +1983,32 @@ void Source::ClangViewAutocomplete::autocomplete() { completion_dialog->on_select=[this, rows](const std::string& selected, bool hide_window) { auto row = rows->at(selected); get_buffer()->erase(completion_dialog->start_mark->get_iter(), get_buffer()->get_insert()->get_iter()); + auto iter=get_buffer()->get_insert()->get_iter(); + if(*iter=='<' || *iter=='(') { + auto bracket_pos=row.find(*iter); + if(bracket_pos!=std::string::npos) { + row=row.substr(0, bracket_pos); + } + } get_buffer()->insert(completion_dialog->start_mark->get_iter(), row); if(hide_window) { - char find_char=row.back(); - if(find_char==')' || find_char=='>') { - if(find_char==')') - find_char='('; - else - find_char='<'; - size_t pos=row.find(find_char); - if(pos!=std::string::npos) { - auto start_offset=completion_dialog->start_mark->get_iter().get_offset()+pos+1; - auto end_offset=completion_dialog->start_mark->get_iter().get_offset()+row.size()-1; - if(start_offset!=end_offset) - get_buffer()->select_range(get_buffer()->get_iter_at_offset(start_offset), get_buffer()->get_iter_at_offset(end_offset)); - } + auto para_pos=row.find('('); + auto angle_pos=row.find('<'); + size_t start_pos=std::string::npos; + size_t end_pos=std::string::npos; + if(angle_pos'); + } + else if(para_pos!=std::string::npos) { + start_pos=para_pos; + end_pos=row.size()-1; + } + if(start_pos!=std::string::npos && end_pos!=std::string::npos) { + auto start_offset=completion_dialog->start_mark->get_iter().get_offset()+start_pos+1; + auto end_offset=completion_dialog->start_mark->get_iter().get_offset()+end_pos; + if(start_offset!=end_offset) + get_buffer()->select_range(get_buffer()->get_iter_at_offset(start_offset), get_buffer()->get_iter_at_offset(end_offset)); } } };