diff --git a/src/source.cc b/src/source.cc index 23dd48d..6c77347 100644 --- a/src/source.cc +++ b/src/source.cc @@ -2347,75 +2347,96 @@ bool Source::View::on_key_press_event_smart_inserts(GdkEventKey *key) { }}; if(get_buffer()->get_has_selection()) { - bool perform_insertion = false; - char left_char, right_char; + if(is_bracket_language) { + // Remove /**/ around selection + if(key->keyval == GDK_KEY_slash) { + Gtk::TextIter start, end; + get_buffer()->get_selection_bounds(start, end); + auto before_start = start; + auto after_end = end; + if(before_start.backward_char() && *before_start == '*' && before_start.backward_char() && *before_start == '/' && + *after_end == '*' && after_end.forward_char() && *after_end == '/') { + auto start_mark = get_buffer()->create_mark(start); + auto end_mark = get_buffer()->create_mark(end); + get_buffer()->erase(before_start, start); + after_end = end_mark->get_iter(); + after_end.forward_chars(2); + get_buffer()->erase(end_mark->get_iter(), after_end); + + get_buffer()->select_range(start_mark->get_iter(), end_mark->get_iter()); + get_buffer()->delete_mark(start_mark); + get_buffer()->delete_mark(end_mark); + return true; + } + } + } + + Glib::ustring left, right; // Insert () around selection if(key->keyval == GDK_KEY_parenleft) { - perform_insertion = true; - left_char = '('; - right_char = ')'; + left = '('; + right = ')'; } // Insert [] around selection else if(key->keyval == GDK_KEY_bracketleft) { - perform_insertion = true; - left_char = '['; - right_char = ']'; + left = '['; + right = ']'; } // Insert {} around selection else if(key->keyval == GDK_KEY_braceleft) { - perform_insertion = true; - left_char = '{'; - right_char = '}'; + left = '{'; + right = '}'; } // Insert <> around selection else if(key->keyval == GDK_KEY_less) { - perform_insertion = true; - left_char = '<'; - right_char = '>'; + left = '<'; + right = '>'; } // Insert '' around selection else if(key->keyval == GDK_KEY_apostrophe) { - perform_insertion = true; - left_char = '\''; - right_char = '\''; + left = '\''; + right = '\''; } // Insert "" around selection else if(key->keyval == GDK_KEY_quotedbl) { - perform_insertion = true; - left_char = '"'; - right_char = '"'; + left = '"'; + right = '"'; } else if(language && language->get_id() == "markdown") { if(key->keyval == GDK_KEY_dead_grave) { - perform_insertion = true; - left_char = '`'; - right_char = '`'; + left = '`'; + right = '`'; } if(key->keyval == GDK_KEY_asterisk) { - perform_insertion = true; - left_char = '*'; - right_char = '*'; + left = '*'; + right = '*'; } if(key->keyval == GDK_KEY_underscore) { - perform_insertion = true; - left_char = '_'; - right_char = '_'; + left = '_'; + right = '_'; } if(key->keyval == GDK_KEY_dead_tilde) { - perform_insertion = true; - left_char = '~'; - right_char = '~'; + left = '~'; + right = '~'; } } - if(perform_insertion) { + else if(is_bracket_language) { + // Insert /**/ around selection + if(key->keyval == GDK_KEY_slash) { + left = "/*"; + right = "*/"; + } + } + if(!left.empty() && !right.empty()) { 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); + get_buffer()->insert(start, left); + get_buffer()->insert(end_mark->get_iter(), right); + auto start_mark_next_iter = start_mark->get_iter(); - start_mark_next_iter.forward_char(); + start_mark_next_iter.forward_chars(left.size()); get_buffer()->select_range(start_mark_next_iter, end_mark->get_iter()); get_buffer()->delete_mark(start_mark); get_buffer()->delete_mark(end_mark);