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()) {
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);

Loading…
Cancel
Save