Browse Source

Bracket languages: now adds or removes /**/ around selection when typing /

merge-requests/393/head
eidheim 7 years ago
parent
commit
092d729554
  1. 93
      src/source.cc

93
src/source.cc

@ -2347,75 +2347,96 @@ bool Source::View::on_key_press_event_smart_inserts(GdkEventKey *key) {
}}; }};
if(get_buffer()->get_has_selection()) { if(get_buffer()->get_has_selection()) {
bool perform_insertion = false; if(is_bracket_language) {
char left_char, right_char; // 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 // Insert () around selection
if(key->keyval == GDK_KEY_parenleft) { if(key->keyval == GDK_KEY_parenleft) {
perform_insertion = true; left = '(';
left_char = '('; right = ')';
right_char = ')';
} }
// Insert [] around selection // Insert [] around selection
else if(key->keyval == GDK_KEY_bracketleft) { else if(key->keyval == GDK_KEY_bracketleft) {
perform_insertion = true; left = '[';
left_char = '['; right = ']';
right_char = ']';
} }
// Insert {} around selection // Insert {} around selection
else if(key->keyval == GDK_KEY_braceleft) { else if(key->keyval == GDK_KEY_braceleft) {
perform_insertion = true; left = '{';
left_char = '{'; right = '}';
right_char = '}';
} }
// Insert <> around selection // Insert <> around selection
else if(key->keyval == GDK_KEY_less) { else if(key->keyval == GDK_KEY_less) {
perform_insertion = true; left = '<';
left_char = '<'; right = '>';
right_char = '>';
} }
// Insert '' around selection // Insert '' around selection
else if(key->keyval == GDK_KEY_apostrophe) { else if(key->keyval == GDK_KEY_apostrophe) {
perform_insertion = true; left = '\'';
left_char = '\''; right = '\'';
right_char = '\'';
} }
// Insert "" around selection // Insert "" around selection
else if(key->keyval == GDK_KEY_quotedbl) { else if(key->keyval == GDK_KEY_quotedbl) {
perform_insertion = true; left = '"';
left_char = '"'; right = '"';
right_char = '"';
} }
else if(language && language->get_id() == "markdown") { else if(language && language->get_id() == "markdown") {
if(key->keyval == GDK_KEY_dead_grave) { if(key->keyval == GDK_KEY_dead_grave) {
perform_insertion = true; left = '`';
left_char = '`'; right = '`';
right_char = '`';
} }
if(key->keyval == GDK_KEY_asterisk) { if(key->keyval == GDK_KEY_asterisk) {
perform_insertion = true; left = '*';
left_char = '*'; right = '*';
right_char = '*';
} }
if(key->keyval == GDK_KEY_underscore) { if(key->keyval == GDK_KEY_underscore) {
perform_insertion = true; left = '_';
left_char = '_'; right = '_';
right_char = '_';
} }
if(key->keyval == GDK_KEY_dead_tilde) { if(key->keyval == GDK_KEY_dead_tilde) {
perform_insertion = true; left = '~';
left_char = '~'; right = '~';
right_char = '~';
} }
} }
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; Gtk::TextIter start, end;
get_buffer()->get_selection_bounds(start, end); get_buffer()->get_selection_bounds(start, end);
auto start_mark = get_buffer()->create_mark(start); auto start_mark = get_buffer()->create_mark(start);
auto end_mark = get_buffer()->create_mark(end); auto end_mark = get_buffer()->create_mark(end);
get_buffer()->insert(start, Glib::ustring() + left_char); get_buffer()->insert(start, left);
get_buffer()->insert(end_mark->get_iter(), Glib::ustring() + right_char); get_buffer()->insert(end_mark->get_iter(), right);
auto start_mark_next_iter = start_mark->get_iter(); 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()->select_range(start_mark_next_iter, end_mark->get_iter());
get_buffer()->delete_mark(start_mark); get_buffer()->delete_mark(start_mark);
get_buffer()->delete_mark(end_mark); get_buffer()->delete_mark(end_mark);

Loading…
Cancel
Save