From 5332fa624fc0b5394b9afbe17f93399d434ff28e Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 18 Aug 2021 09:09:41 +0200 Subject: [PATCH] Fixed indentation on enter after for instance {\n 1,\n 2,\n} --- src/source.cpp | 24 ++++++++++++++++++++---- src/source.hpp | 4 +++- tests/source_key_test.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/source.cpp b/src/source.cpp index c5b07db..f80f43c 100644 --- a/src/source.cpp +++ b/src/source.cpp @@ -2177,9 +2177,16 @@ bool Source::View::forward_to_code(Gtk::TextIter &iter) { return !iter.is_end(); } -void Source::View::backward_to_code_or_line_start(Gtk::TextIter &iter) { - while(!iter.starts_line() && (!is_code_iter(iter) || *iter == ' ' || *iter == '\t' || iter.ends_line()) && iter.backward_char()) { +bool Source::View::backward_to_code_or_line_start(Gtk::TextIter &iter) { + while(!iter.starts_line() && (*iter == ' ' || *iter == '\t' || iter.ends_line() || !is_code_iter(iter)) && iter.backward_char()) { } + return !iter.is_start() || is_code_iter(iter); +} + +bool Source::View::forward_to_code_or_line_end(Gtk::TextIter &iter) { + while(!iter.ends_line() && (*iter == ' ' || *iter == '\t' || !is_code_iter(iter)) && iter.forward_char()) { + } + return !iter.is_end(); } Gtk::TextIter Source::View::get_start_of_expression(Gtk::TextIter iter) { @@ -2194,7 +2201,7 @@ Gtk::TextIter Source::View::get_start_of_expression(Gtk::TextIter iter) { if(is_bracket_language) { if(*iter == ';' && is_code_iter(iter)) has_semicolon = true; - if(*iter == '{' && is_code_iter(iter)) { + else if(*iter == '{' && is_code_iter(iter)) { iter.backward_char(); has_open_curly = true; } @@ -2246,7 +2253,10 @@ Gtk::TextIter Source::View::get_start_of_expression(Gtk::TextIter iter) { if(!test_iter.starts_line() && *test_iter == ':' && is_code_iter(test_iter)) continue; } - // Handle ',', ':', or operators that can be used between two lines, on previous line: + + // Handle ',', ':', or operators that can be used between two lines, on previous line + + // Return if previous line is empty auto previous_iter = iter; previous_iter.backward_char(); backward_to_code_or_line_start(previous_iter); @@ -2272,6 +2282,12 @@ Gtk::TextIter Source::View::get_start_of_expression(Gtk::TextIter iter) { } if(*previous_iter != ',') return iter; + else { + // Return if , is followed by }, for instance: {\n 1,\n 2,\n} + auto next_iter = iter; + if(forward_to_code_or_line_end(next_iter) && *next_iter == '}') + return iter; + } } } while(iter.backward_char()); diff --git a/src/source.hpp b/src/source.hpp index 93edaf2..b0f458e 100644 --- a/src/source.hpp +++ b/src/source.hpp @@ -153,7 +153,9 @@ namespace Source { /// Iter will not be moved if iter is already a code iter. bool forward_to_code(Gtk::TextIter &iter); /// Iter will not be moved if iter is already a code iter (not part of comment or string, and not whitespace) or at line start - void backward_to_code_or_line_start(Gtk::TextIter &iter); + bool backward_to_code_or_line_start(Gtk::TextIter &iter); + /// Iter will not be moved if iter is already a code iter (not part of comment or string, and not whitespace) or at line end + bool forward_to_code_or_line_end(Gtk::TextIter &iter); /// If closing bracket is found, continues until the open bracket. /// Returns if open bracket is found that has no corresponding closing bracket. /// Else, return at start of line. diff --git a/tests/source_key_test.cpp b/tests/source_key_test.cpp index 1bdf942..6a7323a 100644 --- a/tests/source_key_test.cpp +++ b/tests/source_key_test.cpp @@ -2730,6 +2730,32 @@ int main() { ""); g_assert(buffer->get_insert()->get_iter() == buffer->end()); } + { + buffer->set_text(R"(function test() { + let a = { + red: 0.0, + green: 0.0, + blue: 1.0, + }; +} +)"); + auto iter = buffer->begin(); + iter.forward_chars(79); + buffer->place_cursor(iter); + view.on_key_press_event(&event); + g_assert(buffer->get_text() == R"(function test() { + let a = { + red: 0.0, + green: 0.0, + blue: 1.0, + }; + +} +)"); + iter = buffer->begin(); + iter.forward_chars(82); + g_assert(buffer->get_insert()->get_iter() == iter); + } } { auto language = language_manager->get_language("markdown");