From 6e0c762f7099a7708e295d43161bffaeb7d5bc30 Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 23 Dec 2015 15:15:21 +0100 Subject: [PATCH] Now indents left automatically when writing { on a newline after if(...)/else/else if(...) and so on --- src/source_clang.cc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/source_clang.cc b/src/source_clang.cc index ef5073c..d3611f0 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -605,6 +605,35 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { get_source_buffer()->end_user_action(); return true; } + //Indent left when writing { on a new line after for instance if(...)\n... + else if(key->keyval==GDK_KEY_braceleft) { + auto iter=get_buffer()->get_insert()->get_iter(); + auto tabs_end_iter=get_tabs_end_iter(); + auto tabs=get_line_before(tabs_end_iter); + size_t line_nr=get_source_buffer()->get_insert()->get_iter().get_line(); + if(line_nr>0 && tabs.size()>=tab_size && iter==tabs_end_iter) { + std::string previous_line=get_line(line_nr-1); + boost::smatch sm; + if(!boost::regex_match(previous_line, sm, bracket_regex)) { + auto start_iter=iter; + start_iter.backward_chars(tab_size); + if(boost::regex_match(previous_line, sm, no_bracket_statement_regex)) { + get_buffer()->erase(start_iter, iter); + get_buffer()->insert_at_cursor("{"); + scroll_to(get_source_buffer()->get_insert()); + get_buffer()->end_user_action(); + return true; + } + else if(boost::regex_match(previous_line, sm, no_bracket_no_para_statement_regex)) { + get_buffer()->erase(start_iter, iter); + get_buffer()->insert_at_cursor("{"); + scroll_to(get_source_buffer()->get_insert()); + get_buffer()->end_user_action(); + return true; + } + } + } + } get_source_buffer()->end_user_action(); return Source::View::on_key_press_event(key);