From 6e226501e9c40a5e0ef228355474c15895d0119a Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 21 May 2016 10:07:58 +0200 Subject: [PATCH] Now adds ; after } when creating struct or class --- src/source.cc | 36 +++++++++++++++++++++++++++++++++--- src/source.h | 2 ++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/source.cc b/src/source.cc index ff07519..19faf5c 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1131,6 +1131,23 @@ bool Source::View::find_left_bracket_backward(Gtk::TextIter iter, Gtk::TextIter return false; } +std::string Source::View::get_token(Gtk::TextIter iter) { + auto start=iter; + auto end=iter; + + while((*iter>='A' && *iter<='Z') || (*iter>='a' && *iter<='z') || (*iter>='0' && *iter<='9') || *iter=='_') { + start=iter; + if(!iter.backward_char()) + break; + } + while((*end>='A' && *end<='Z') || (*end>='a' && *end<='z') || (*end>='0' && *end<='9') || *end=='_') { + if(!end.forward_char()) + break; + } + + return get_buffer()->get_text(start, end); +} + bool Source::View::on_key_press_event(GdkEventKey* key) { if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->shown) { if(spellcheck_suggestions_dialog->on_key_press(key)) @@ -1448,9 +1465,22 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { } else if(!has_bracket) { //Insert new lines with bracket end - get_source_buffer()->insert_at_cursor("\n"+tabs+tab+"\n"+tabs+"}"); + bool add_semicolon=false; + if(language && (language->get_id()=="chdr" || language->get_id()=="cpphdr" || + language->get_id()=="c" || language->get_id()=="cpp")) { + auto token=get_token(start_of_sentence_iter); + if(token.empty()) { + auto iter=start_of_sentence_iter; + while(!iter.starts_line() && iter.backward_char()) {} + if(iter.backward_char() && find_start_of_closed_expression(iter, iter)) + token=get_token(iter); + } + if(token=="class" || token=="struct") + add_semicolon=true; + } + get_source_buffer()->insert_at_cursor("\n"+tabs+tab+"\n"+tabs+(add_semicolon?"};":"}")); auto insert_it = get_source_buffer()->get_insert()->get_iter(); - if(insert_it.backward_chars(tabs.size()+2)) { + if(insert_it.backward_chars(tabs.size()+(add_semicolon?3:2))) { scroll_to(get_source_buffer()->get_insert()); get_source_buffer()->place_cursor(insert_it); } @@ -1777,7 +1807,7 @@ std::pair Source::View::find_tab_char_and_size() { } bool Source::View::is_word_iter(const Gtk::TextIter& iter) { - return ((*iter>=65 && *iter<=90) || (*iter>=97 && *iter<=122) || *iter==39 || *iter>=128); + return ((*iter>='A' && *iter<='Z') || (*iter>='a' && *iter<='z') || *iter=='\'' || *iter>=128); } std::pair Source::View::spellcheck_get_word(Gtk::TextIter iter) { diff --git a/src/source.h b/src/source.h index 925280a..f7ad28d 100644 --- a/src/source.h +++ b/src/source.h @@ -138,6 +138,8 @@ namespace Source { bool find_right_bracket_forward(Gtk::TextIter iter, Gtk::TextIter &found_iter); bool find_left_bracket_backward(Gtk::TextIter iter, Gtk::TextIter &found_iter); + std::string get_token(Gtk::TextIter iter); + const static REGEX_NS::regex bracket_regex; const static REGEX_NS::regex no_bracket_statement_regex; const static REGEX_NS::regex no_bracket_no_para_statement_regex;