From bb8109b7c4f2e3d44afe12a5ec29bf384b027abb Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 4 Sep 2016 22:05:01 +0200 Subject: [PATCH] Fixes #281: )-key moves cursor forward instead of inserting ) when appropriate --- src/source.cc | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index 9aede5e..af00d61 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1139,7 +1139,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { return on_key_press_event_basic(key); auto iter=get_buffer()->get_insert()->get_iter(); - if(iter.backward_char() && (get_source_buffer()->iter_has_context_class(iter, "comment") || get_source_buffer()->iter_has_context_class(iter, "string"))) + if(get_source_buffer()->iter_has_context_class(iter, "comment") || get_source_buffer()->iter_has_context_class(iter, "string")) return on_key_press_event_basic(key); if(is_bracket_language) @@ -1595,6 +1595,63 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { } } } + //Move after ')' if closed expression + else if(key->keyval==GDK_KEY_parenright) { + if(*iter==')') { + Gtk::TextIter found_iter; + auto bracket_count=[this](Gtk::TextIter iter) { + int para_count=0; + int curly_count=0; + auto iter_stored=iter; + + do { + if(!get_source_buffer()->iter_has_context_class(iter, "comment") && !get_source_buffer()->iter_has_context_class(iter, "string")) { + if(*iter==')') + para_count++; + else if(*iter=='(') + para_count--; + else if(*iter=='}') + curly_count++; + else if(*iter=='{') + curly_count--; + + if(curly_count<0) + break; + } + } while(iter.backward_char()); + + iter=iter_stored; + if(!iter.forward_char()) { + return para_count; + } + curly_count=0; + do { + if(!get_source_buffer()->iter_has_context_class(iter, "comment") && !get_source_buffer()->iter_has_context_class(iter, "string")) { + if(*iter==')') + para_count++; + else if(*iter=='(') + para_count--; + else if(*iter=='}') + curly_count++; + else if(*iter=='{') + curly_count--; + + if(curly_count>0) + break; + } + } while(iter.forward_char()); + + return para_count; + }; + if(bracket_count(iter)==0) { + iter.forward_char(); + get_buffer()->place_cursor(iter); + scroll_to(get_buffer()->get_insert()); + get_buffer()->end_user_action(); + return true; + } + } + } get_buffer()->end_user_action(); return on_key_press_event_basic(key);