Browse Source

Bracket language indentation's default enter action now performs as the basic enter action

merge-requests/389/head
eidheim 7 years ago
parent
commit
e399e559fc
  1. 24
      src/source.cc
  2. 32
      tests/source_key_test.cc

24
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) { bool Source::View::on_key_press_event_basic(GdkEventKey *key) {
auto iter = get_buffer()->get_insert()->get_iter(); 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()) { 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); cleanup_whitespace_characters_on_return(iter);
@ -1727,11 +1727,12 @@ bool Source::View::on_key_press_event_basic(GdkEventKey *key) {
return true; return true;
} }
// Indent as in current or next line
int line_nr = iter.get_line(); int line_nr = iter.get_line();
if(iter.ends_line() && (line_nr + 1) < get_buffer()->get_line_count()) { 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)); auto next_tabs_end_iter = get_tabs_end_iter(line_nr + 1);
if(next_line_tabs.size() > tabs.size()) { if(next_tabs_end_iter.get_line_offset() > tabs_end_iter.get_line_offset()) {
get_buffer()->insert_at_cursor('\n' + next_line_tabs); get_buffer()->insert_at_cursor('\n' + get_line_before(next_tabs_end_iter));
scroll_to(get_buffer()->get_insert()); scroll_to(get_buffer()->get_insert());
return true; 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++) for(size_t c = 0; c < tab_size; c++)
start_line_plus_tab_size.forward_char(); start_line_plus_tab_size.forward_char();
get_buffer()->erase(start_line_iter, start_line_plus_tab_size); 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 { else {
get_buffer()->insert_at_cursor('\n' + tabs + tab); 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) // Indent as in current or next line
return false; // Use basic indentation since for instance JavaScript code can contain JSX 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); get_buffer()->insert_at_cursor('\n' + tabs);
scroll_to(get_buffer()->get_insert()); scroll_to(get_buffer()->get_insert());
return true; return true;

32
tests/source_key_test.cc

@ -1322,6 +1322,38 @@ int main() {
" "); " ");
g_assert(buffer->get_insert()->get_iter() == buffer->end()); 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')"); buffer->set_text("if('a'=='a')");

Loading…
Cancel
Save