From 2bf54e013330b1fa08becc748753330f634c9ec9 Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 9 Sep 2016 10:18:27 +0200 Subject: [PATCH] Now performs smart insertions on selected text --- src/source.cc | 91 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 31 deletions(-) diff --git a/src/source.cc b/src/source.cc index 5fe8606..381b808 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1786,8 +1786,67 @@ bool Source::View::on_key_press_event_smart_brackets(GdkEventKey *key) { } bool Source::View::on_key_press_event_smart_insertions(GdkEventKey *key) { - if(get_buffer()->get_has_selection()) + if(get_buffer()->get_has_selection()) { + bool perform_insertion=false; + char left_char, right_char; + // Insert () around selection + if(key->keyval==GDK_KEY_parenleft) { + perform_insertion=true; + left_char='('; + right_char=')'; + } + // Insert [] around selection + else if(key->keyval==GDK_KEY_bracketleft) { + perform_insertion=true; + left_char='['; + right_char=']'; + } + // Insert {} around selection + else if(key->keyval==GDK_KEY_braceleft) { + perform_insertion=true; + left_char='{'; + right_char='}'; + } + // Insert <> around selection + else if(key->keyval==GDK_KEY_less) { + perform_insertion=true; + left_char='<'; + right_char='>'; + } + // Insert '' around selection + else if(key->keyval==GDK_KEY_apostrophe) { + perform_insertion=true; + left_char='\''; + right_char='\''; + } + // Insert "" around selection + else if(key->keyval==GDK_KEY_quotedbl) { + perform_insertion=true; + left_char='"'; + right_char='"'; + } + // Insert `` around selection + else if(key->keyval==GDK_KEY_dead_grave) { + perform_insertion=true; + left_char='`'; + right_char='`'; + } + if(perform_insertion) { + Gtk::TextIter start, end; + get_buffer()->get_selection_bounds(start, end); + auto start_mark=get_buffer()->create_mark(start); + auto end_mark=get_buffer()->create_mark(end); + get_buffer()->insert(start, Glib::ustring()+left_char); + get_buffer()->insert(end_mark->get_iter(), Glib::ustring()+right_char); + auto start_mark_next_iter=start_mark->get_iter(); + start_mark_next_iter.forward_char(); + get_buffer()->select_range(start_mark_next_iter, end_mark->get_iter()); + get_buffer()->delete_mark(start_mark); + get_buffer()->delete_mark(end_mark); + return true; + } return false; + } auto iter=get_buffer()->get_insert()->get_iter(); auto previous_iter=iter; @@ -1864,28 +1923,6 @@ bool Source::View::on_key_press_event_smart_insertions(GdkEventKey *key) { return true; } } - // Insert {} - // else if(key->keyval==GDK_KEY_braceleft) { - // if(symbol_count(iter, '{', '}')==0) { - // get_buffer()->insert_at_cursor("{}"); - // auto iter=get_buffer()->get_insert()->get_iter(); - // iter.backward_char(); - // get_buffer()->place_cursor(iter); - // scroll_to(get_buffer()->get_insert()); - // return true; - // } - // } - // Move on } in {} - // else if(key->keyval==GDK_KEY_braceright) { - // if(*iter=='}') { - // if(symbol_count(iter, '{', '}')==0) { - // iter.forward_char(); - // get_buffer()->place_cursor(iter); - // scroll_to(get_buffer()->get_insert()); - // return true; - // } - // } - // } // Insert '' else if(key->keyval==GDK_KEY_apostrophe && allow_insertion(iter) && symbol_count(iter, '\'', -1)%2==0) { get_buffer()->insert_at_cursor("''"); @@ -1941,14 +1978,6 @@ bool Source::View::on_key_press_event_smart_insertions(GdkEventKey *key) { scroll_to(get_buffer()->get_insert()); return true; } - // Delete {} - // else if(*previous_iter=='{' && *iter=='}' && symbol_count(iter, '{', '}')==0) { - // auto next_iter=iter; - // next_iter.forward_char(); - // get_buffer()->erase(previous_iter, next_iter); - // scroll_to(get_buffer()->get_insert()); - // return true; - // } } }