diff --git a/src/source.cc b/src/source.cc index 97b5beb..2d087c0 100644 --- a/src/source.cc +++ b/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; diff --git a/tests/source_key_test.cc b/tests/source_key_test.cc index cb45db0..782c176 100644 --- a/tests/source_key_test.cc +++ b/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"