Browse Source

Improved autocomplete insertion rules.

merge-requests/365/head
eidheim 10 years ago
parent
commit
0696a8e32f
  1. 37
      src/source.cc

37
src/source.cc

@ -1983,21 +1983,32 @@ void Source::ClangViewAutocomplete::autocomplete() {
completion_dialog->on_select=[this, rows](const std::string& selected, bool hide_window) { completion_dialog->on_select=[this, rows](const std::string& selected, bool hide_window) {
auto row = rows->at(selected); auto row = rows->at(selected);
get_buffer()->erase(completion_dialog->start_mark->get_iter(), get_buffer()->get_insert()->get_iter()); 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); get_buffer()->insert(completion_dialog->start_mark->get_iter(), row);
if(hide_window) { if(hide_window) {
char find_char=row.back(); auto para_pos=row.find('(');
if(find_char==')' || find_char=='>') { auto angle_pos=row.find('<');
if(find_char==')') size_t start_pos=std::string::npos;
find_char='('; size_t end_pos=std::string::npos;
else if(angle_pos<para_pos) {
find_char='<'; start_pos=angle_pos;
size_t pos=row.find(find_char); end_pos=row.find('>');
if(pos!=std::string::npos) { }
auto start_offset=completion_dialog->start_mark->get_iter().get_offset()+pos+1; else if(para_pos!=std::string::npos) {
auto end_offset=completion_dialog->start_mark->get_iter().get_offset()+row.size()-1; start_pos=para_pos;
if(start_offset!=end_offset) end_pos=row.size()-1;
get_buffer()->select_range(get_buffer()->get_iter_at_offset(start_offset), get_buffer()->get_iter_at_offset(end_offset)); }
} 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));
} }
} }
}; };

Loading…
Cancel
Save