From a93c159c698b35020d87bfb90681117498254c58 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 19 Sep 2015 11:11:14 +0200 Subject: [PATCH] Smart indenting after enter when line ends with ':'. --- src/source.cc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/source.cc b/src/source.cc index 1f6c21f..4a8b729 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1534,6 +1534,35 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { } } } + //Indenting after ':' + else if(*iter==':') { + auto previous_sentence_iter=get_buffer()->get_iter_at_line(iter.get_line()); + while(previous_sentence_iter && (*previous_sentence_iter==tab_char || previous_sentence_iter.ends_line())) { + previous_sentence_iter.backward_char(); + } + if(!previous_sentence_iter.ends_line()) + previous_sentence_iter.forward_char(); + Gtk::TextIter start_of_previous_sentence_iter; + if(find_start_of_closed_expression(previous_sentence_iter, start_of_previous_sentence_iter)) { + std::smatch sm; + auto start_previous_sentence=get_line_before(start_of_previous_sentence_iter); + if(std::regex_match(start_previous_sentence, sm, tabs_regex)) { + if(tabs.size()==(sm[1].str().size()+tab_size)) { + auto start_line_iter=get_buffer()->get_iter_at_line(iter.get_line()); + auto start_line_plus_tab_size=start_line_iter; + for(size_t c=0;cerase(start_line_iter, start_line_plus_tab_size); + } + else { + get_source_buffer()->insert_at_cursor("\n"+tabs+tab); + scroll_to(get_source_buffer()->get_insert()); + get_source_buffer()->end_user_action(); + return true; + } + } + } + } get_source_buffer()->insert_at_cursor("\n"+tabs); scroll_to(get_source_buffer()->get_insert()); get_source_buffer()->end_user_action();