Browse Source

Slight improvement to smart insertions of {}

merge-requests/389/head
eidheim 7 years ago
parent
commit
5b221b0d29
  1. 19
      src/source.cc
  2. 56
      tests/source_key_test.cc

19
src/source.cc

@ -2595,14 +2595,19 @@ bool Source::View::on_key_press_event_smart_inserts(GdkEventKey *key) {
}
// Insert {}
else if(key->keyval == GDK_KEY_braceleft && allow_insertion(iter)) {
// Do not add } if next line has a higher indentation
auto start_iter = get_start_of_expression(iter);
if(iter.get_line() + 1 < get_buffer()->get_line_count() && *start_iter != '(' && *start_iter != '[' && *start_iter != '{') {
auto tabs_end_iter = (get_tabs_end_iter(get_buffer()->get_iter_at_line(start_iter.get_line())));
auto next_line_iter = get_buffer()->get_iter_at_line(iter.get_line() + 1);
auto next_line_tabs_end_iter = (get_tabs_end_iter(get_buffer()->get_iter_at_line(next_line_iter.get_line())));
if(next_line_tabs_end_iter.get_line_offset() > tabs_end_iter.get_line_offset())
return false;
// Do not add } if { is at end of line and next line has a higher indentation
auto test_iter = iter;
while(!test_iter.ends_line() && (*test_iter == ' ' || *test_iter == '\t' || !is_code_iter(test_iter) || is_comment_iter(test_iter)) && test_iter.forward_char()) {
}
if(test_iter.ends_line()) {
if(iter.get_line() + 1 < get_buffer()->get_line_count() && *start_iter != '(' && *start_iter != '[' && *start_iter != '{') {
auto tabs_end_iter = (get_tabs_end_iter(get_buffer()->get_iter_at_line(start_iter.get_line())));
auto next_line_iter = get_buffer()->get_iter_at_line(iter.get_line() + 1);
auto next_line_tabs_end_iter = (get_tabs_end_iter(get_buffer()->get_iter_at_line(next_line_iter.get_line())));
if(next_line_tabs_end_iter.get_line_offset() > tabs_end_iter.get_line_offset())
return false;
}
}
Gtk::TextIter close_iter;

56
tests/source_key_test.cc

@ -1525,6 +1525,62 @@ int main() {
iter.forward_to_line_end();
g_assert(buffer->get_insert()->get_iter() == iter);
}
{
buffer->set_text(" if(true) // test\n"
" ;");
while(Gtk::Main::events_pending())
Gtk::Main::iteration(false);
auto iter = buffer->get_iter_at_line(0);
iter.forward_chars(11);
buffer->place_cursor(iter);
view.on_key_press_event(&event);
g_assert(buffer->get_text() == " if(true) {} // test\n"
" ;");
iter = buffer->get_iter_at_line(0);
iter.forward_chars(12);
g_assert(buffer->get_insert()->get_iter() == iter);
}
{
buffer->set_text(" if(true) // test\n"
" ;");
while(Gtk::Main::events_pending())
Gtk::Main::iteration(false);
auto iter = buffer->get_iter_at_line(0);
iter.forward_chars(11);
buffer->place_cursor(iter);
view.on_key_press_event(&event);
g_assert(buffer->get_text() == " if(true) { // test\n"
" ;");
iter = buffer->get_iter_at_line(0);
iter.forward_chars(12);
g_assert(buffer->get_insert()->get_iter() == iter);
}
{
buffer->set_text(" a= if(true) {\n"
" ;");
auto iter = buffer->get_iter_at_line(0);
iter.forward_chars(4);
buffer->place_cursor(iter);
view.on_key_press_event(&event);
g_assert(buffer->get_text() == " a={} if(true) {\n"
" ;");
iter = buffer->get_iter_at_line(0);
iter.forward_chars(5);
g_assert(buffer->get_insert()->get_iter() == iter);
}
{
buffer->set_text(" if(a==) {\n"
" ;");
auto iter = buffer->get_iter_at_line(0);
iter.forward_chars(8);
buffer->place_cursor(iter);
view.on_key_press_event(&event);
g_assert(buffer->get_text() == " if(a=={}) {\n"
" ;");
iter = buffer->get_iter_at_line(0);
iter.forward_chars(9);
g_assert(buffer->get_insert()->get_iter() == iter);
}
{
buffer->set_text("namespace test \n"
"{\n"

Loading…
Cancel
Save