From 30d34eb7a38ebd1b474e3b52a0f94cbe2d46da12 Mon Sep 17 00:00:00 2001 From: eidheim Date: Mon, 12 Oct 2015 20:24:46 +0200 Subject: [PATCH] Improved indentation. --- src/source.cc | 56 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/src/source.cc b/src/source.cc index 42d4ea9..677b298 100644 --- a/src/source.cc +++ b/src/source.cc @@ -929,16 +929,32 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { last_keyval_is_return=false; get_source_buffer()->begin_user_action(); + auto iter=get_buffer()->get_insert()->get_iter(); //Indent as in next or previous line - if(key->keyval==GDK_KEY_Return && !get_buffer()->get_has_selection()) { - auto insert_it=get_buffer()->get_insert()->get_iter(); - int line_nr=insert_it.get_line(); + if(key->keyval==GDK_KEY_Return && !get_buffer()->get_has_selection() && !iter.starts_line()) { + //First remove spaces or tabs around cursor + auto start_blank_iter=iter; + auto end_blank_iter=iter; + while((*end_blank_iter==' ' || *end_blank_iter=='\t') && + !end_blank_iter.ends_line() && end_blank_iter.forward_char()) {} + start_blank_iter.backward_char(); + while((*start_blank_iter==' ' || *start_blank_iter=='\t' || start_blank_iter.ends_line()) && + !start_blank_iter.starts_line() && start_blank_iter.backward_char()) {} + if(!start_blank_iter.starts_line()) { + start_blank_iter.forward_char(); + get_buffer()->erase(start_blank_iter, end_blank_iter); + } + else + get_buffer()->erase(iter, end_blank_iter); + iter=get_buffer()->get_insert()->get_iter(); + + int line_nr=iter.get_line(); auto tabs_end_iter=get_tabs_end_iter(); auto line_tabs=get_line_before(tabs_end_iter); if((line_nr+1)get_line_count()) { auto next_line_tabs_end_iter=get_tabs_end_iter(line_nr+1); auto next_line_tabs=get_line_before(next_line_tabs_end_iter); - if(insert_it.ends_line()) { + if(iter.ends_line()) { if(next_line_tabs.size()>line_tabs.size()) { get_source_buffer()->insert_at_cursor("\n"+next_line_tabs); scroll_to(get_source_buffer()->get_insert()); @@ -954,7 +970,6 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { } //Indent right when clicking tab, no matter where in the line the cursor is. Also works on selected text. else if(key->keyval==GDK_KEY_Tab) { - auto iter=get_buffer()->get_insert()->get_iter(); //Special case if insert is at beginning of empty line: if(iter.starts_line() && iter.ends_line() && !get_buffer()->get_has_selection()) { auto prev_line_iter=iter; @@ -1037,7 +1052,6 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { } //"Smart" backspace key else if(key->keyval==GDK_KEY_BackSpace && !get_buffer()->get_has_selection()) { - auto insert_it=get_buffer()->get_insert()->get_iter(); auto line=get_line_before(); bool do_smart_backspace=true; for(auto &chr: line) { @@ -1047,15 +1061,14 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { } } if(do_smart_backspace) { - auto line_start_iter=insert_it; + auto line_start_iter=iter; if(line_start_iter.backward_chars(line.size())) - get_buffer()->erase(insert_it, line_start_iter); + get_buffer()->erase(iter, line_start_iter); } } //"Smart" delete key else if(key->keyval==GDK_KEY_Delete && !get_buffer()->get_has_selection()) { - auto insert_iter=get_buffer()->get_insert()->get_iter(); - auto iter=insert_iter; + auto insert_iter=iter; bool do_smart_delete=true; do { if(*iter!=' ' && *iter!='\t' && !iter.ends_line()) { @@ -1078,7 +1091,6 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { //Next two are smart home/end keys that works with wrapped lines //Note that smart end goes FIRST to end of line to avoid hiding empty chars after expressions else if(key->keyval==GDK_KEY_End && (key->state&GDK_CONTROL_MASK)==0) { - auto iter=get_buffer()->get_insert()->get_iter(); auto end_line_iter=iter; while(!end_line_iter.ends_line() && end_line_iter.forward_char()) {} auto end_sentence_iter=end_line_iter; @@ -1105,7 +1117,6 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { return true; } else if(key->keyval==GDK_KEY_Home && (key->state&GDK_CONTROL_MASK)==0) { - auto iter=get_buffer()->get_insert()->get_iter(); auto start_line_iter=get_buffer()->get_iter_at_line(iter.get_line()); auto start_sentence_iter=start_line_iter; while(!start_sentence_iter.ends_line() && @@ -1778,10 +1789,25 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { return Source::View::on_key_press_event(key); } get_source_buffer()->begin_user_action(); - + iter=get_buffer()->get_insert()->get_iter(); //Indent depending on if/else/etc and brackets - if(key->keyval==GDK_KEY_Return) { - auto iter=get_buffer()->get_insert()->get_iter(); + if(key->keyval==GDK_KEY_Return && !iter.starts_line()) { + //First remove spaces or tabs around cursor + auto start_blank_iter=iter; + auto end_blank_iter=iter; + while((*end_blank_iter==' ' || *end_blank_iter=='\t') && + !end_blank_iter.ends_line() && end_blank_iter.forward_char()) {} + start_blank_iter.backward_char(); + while((*start_blank_iter==' ' || *start_blank_iter=='\t' || start_blank_iter.ends_line()) && + !start_blank_iter.starts_line() && start_blank_iter.backward_char()) {} + if(!start_blank_iter.starts_line()) { + start_blank_iter.forward_char(); + get_buffer()->erase(start_blank_iter, end_blank_iter); + } + else + get_buffer()->erase(iter, end_blank_iter); + iter=get_buffer()->get_insert()->get_iter(); + Gtk::TextIter start_of_sentence_iter; if(find_start_of_closed_expression(iter, start_of_sentence_iter)) { auto start_sentence_tabs_end_iter=get_tabs_end_iter(start_of_sentence_iter);