Browse Source

Fixed indentation on enter after for instance {\n 1,\n 2,\n}

pipelines/357160723
eidheim 4 years ago
parent
commit
5332fa624f
  1. 24
      src/source.cpp
  2. 4
      src/source.hpp
  3. 26
      tests/source_key_test.cpp

24
src/source.cpp

@ -2177,9 +2177,16 @@ bool Source::View::forward_to_code(Gtk::TextIter &iter) {
return !iter.is_end(); return !iter.is_end();
} }
void Source::View::backward_to_code_or_line_start(Gtk::TextIter &iter) { bool 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()) { 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) { 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(is_bracket_language) {
if(*iter == ';' && is_code_iter(iter)) if(*iter == ';' && is_code_iter(iter))
has_semicolon = true; has_semicolon = true;
if(*iter == '{' && is_code_iter(iter)) { else if(*iter == '{' && is_code_iter(iter)) {
iter.backward_char(); iter.backward_char();
has_open_curly = true; 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)) if(!test_iter.starts_line() && *test_iter == ':' && is_code_iter(test_iter))
continue; 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; auto previous_iter = iter;
previous_iter.backward_char(); previous_iter.backward_char();
backward_to_code_or_line_start(previous_iter); 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 != ',') if(*previous_iter != ',')
return 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()); } while(iter.backward_char());

4
src/source.hpp

@ -153,7 +153,9 @@ namespace Source {
/// Iter will not be moved if iter is already a code iter. /// Iter will not be moved if iter is already a code iter.
bool forward_to_code(Gtk::TextIter &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 /// 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. /// If closing bracket is found, continues until the open bracket.
/// Returns if open bracket is found that has no corresponding closing bracket. /// Returns if open bracket is found that has no corresponding closing bracket.
/// Else, return at start of line. /// Else, return at start of line.

26
tests/source_key_test.cpp

@ -2730,6 +2730,32 @@ int main() {
""); "");
g_assert(buffer->get_insert()->get_iter() == buffer->end()); 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"); auto language = language_manager->get_language("markdown");

Loading…
Cancel
Save