diff --git a/src/source.cc b/src/source.cc index 1df7eb0..0d50beb 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1708,7 +1708,7 @@ bool Source::View::on_key_press_event(GdkEventKey *key) { bool Source::View::on_key_press_event_basic(GdkEventKey *key) { auto iter = get_buffer()->get_insert()->get_iter(); - // Indent as in current or previous line + // Indent as in current or next line if((key->keyval == GDK_KEY_Return || key->keyval == GDK_KEY_KP_Enter) && !get_buffer()->get_has_selection() && !iter.starts_line()) { cleanup_whitespace_characters_on_return(iter); @@ -1727,11 +1727,12 @@ bool Source::View::on_key_press_event_basic(GdkEventKey *key) { return true; } + // Indent as in current or next line int line_nr = iter.get_line(); if(iter.ends_line() && (line_nr + 1) < get_buffer()->get_line_count()) { - auto next_line_tabs = get_line_before(get_tabs_end_iter(line_nr + 1)); - if(next_line_tabs.size() > tabs.size()) { - get_buffer()->insert_at_cursor('\n' + next_line_tabs); + auto next_tabs_end_iter = get_tabs_end_iter(line_nr + 1); + if(next_tabs_end_iter.get_line_offset() > tabs_end_iter.get_line_offset()) { + get_buffer()->insert_at_cursor('\n' + get_line_before(next_tabs_end_iter)); scroll_to(get_buffer()->get_insert()); return true; } @@ -2244,6 +2245,9 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey *key) { for(size_t c = 0; c < tab_size; c++) start_line_plus_tab_size.forward_char(); get_buffer()->erase(start_line_iter, start_line_plus_tab_size); + get_buffer()->insert_at_cursor('\n' + tabs); + scroll_to(get_buffer()->get_insert()); + return true; } else { get_buffer()->insert_at_cursor('\n' + tabs + tab); @@ -2253,8 +2257,16 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey *key) { } } } - if(use_fixed_continuation_indenting) - return false; // Use basic indentation since for instance JavaScript code can contain JSX + // Indent as in current or next line + int line_nr = iter.get_line(); + if(iter.ends_line() && (line_nr + 1) < get_buffer()->get_line_count()) { + auto next_tabs_end_iter = get_tabs_end_iter(line_nr + 1); + if(next_tabs_end_iter.get_line_offset() > tabs_end_iter.get_line_offset()) { + get_buffer()->insert_at_cursor('\n' + get_line_before(next_tabs_end_iter)); + scroll_to(get_buffer()->get_insert()); + return true; + } + } get_buffer()->insert_at_cursor('\n' + tabs); scroll_to(get_buffer()->get_insert()); return true; diff --git a/tests/source_key_test.cc b/tests/source_key_test.cc index 8810061..f60e3a5 100644 --- a/tests/source_key_test.cc +++ b/tests/source_key_test.cc @@ -1322,6 +1322,38 @@ int main() { " "); g_assert(buffer->get_insert()->get_iter() == buffer->end()); } + { + buffer->set_text("#test\n" + " test();"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + auto iter = buffer->get_iter_at_line(0); + iter.forward_to_line_end(); + buffer->place_cursor(iter); + view.on_key_press_event(&event); + g_assert(buffer->get_text() == "#test\n" + " \n" + " test();"); + iter = buffer->get_iter_at_line(1); + iter.forward_to_line_end(); + g_assert(buffer->get_insert()->get_iter() == iter); + } + { + buffer->set_text(" #test\n" + " test();"); + while(Gtk::Main::events_pending()) + Gtk::Main::iteration(false); + auto iter = buffer->get_iter_at_line(0); + iter.forward_to_line_end(); + buffer->place_cursor(iter); + view.on_key_press_event(&event); + g_assert(buffer->get_text() == " #test\n" + " \n" + " test();"); + iter = buffer->get_iter_at_line(1); + iter.forward_to_line_end(); + g_assert(buffer->get_insert()->get_iter() == iter); + } { buffer->set_text("if('a'=='a')");