From 7936941dfc675db93fb1185be8da1dee774d8136 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 9 Aug 2015 20:02:09 +0200 Subject: [PATCH] Fixed backspace indenting abit (for python especially), will rewrite some of the indenting in a day or two. --- src/source.cc | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/source.cc b/src/source.cc index dc66986..bcefc3e 100644 --- a/src/source.cc +++ b/src/source.cc @@ -224,17 +224,19 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { } //"Smart" backspace key else if(key->keyval==GDK_KEY_BackSpace && !get_buffer()->get_has_selection()) { - Gtk::TextIter insert_it=get_source_buffer()->get_insert()->get_iter(); + auto insert_it=get_source_buffer()->get_insert()->get_iter(); int line_nr=insert_it.get_line(); - if(line_nr>0) { + auto line_it=get_source_buffer()->get_iter_at_line(line_nr); + if(line_it!=insert_it) { string line=get_line(line_nr); - string previous_line=get_line(line_nr-1); smatch sm; - if(std::regex_match(previous_line, sm, spaces_regex)) { - if(line==sm[1] || line==(std::string(sm[1])+config->tab) || (line+config->tab==sm[1])) { - Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(line_nr); - get_source_buffer()->erase(line_it, insert_it); - } + if(std::regex_match(line, sm, spaces_regex) && sm[1].str().size()>=config->tab_size) { + auto insert_minus_tab_it=insert_it; + for(unsigned c=0;ctab_size;c++) + insert_minus_tab_it--; + get_source_buffer()->erase(insert_minus_tab_it, insert_it); + get_source_buffer()->end_user_action(); + return true; } } } @@ -692,6 +694,25 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { get_source_buffer()->end_user_action(); return Source::View::on_key_press_event(key); } + //"Smart" backspace key + else if(key->keyval==GDK_KEY_BackSpace && !get_buffer()->get_has_selection()) { + Gtk::TextIter insert_it=get_source_buffer()->get_insert()->get_iter(); + int line_nr=insert_it.get_line(); + if(line_nr>0) { + string line=get_line(line_nr); + string previous_line=get_line(line_nr-1); + smatch sm; + if(std::regex_match(previous_line, sm, spaces_regex)) { + if(line==sm[1] || line==(std::string(sm[1])+config->tab) || (line+config->tab==sm[1])) { + auto line_it = get_source_buffer()->get_iter_at_line(line_nr); + line_it--; + get_source_buffer()->erase(line_it, insert_it); + get_source_buffer()->end_user_action(); + return true; + } + } + } + } get_source_buffer()->end_user_action(); return Source::View::on_key_press_event(key);