diff --git a/src/source.cpp b/src/source.cpp index 527ca5f..fc98f8a 100644 --- a/src/source.cpp +++ b/src/source.cpp @@ -1624,6 +1624,50 @@ void Source::View::extend_selection() { end.forward_char(); if(start != start_stored || end != end_stored) { + // Forward to closing symbol if open symbol is found between start and end + auto iter = start; + para_count = 0; + square_count = 0; + curly_count = 0; + do { + if(*iter == '(' && is_code_iter(iter)) + para_count++; + else if(*iter == ')' && is_code_iter(iter)) + para_count--; + else if(*iter == '[' && is_code_iter(iter)) + square_count++; + else if(*iter == ']' && is_code_iter(iter)) + square_count--; + else if(*iter == '{' && is_code_iter(iter)) + curly_count++; + else if(*iter == '}' && is_code_iter(iter)) + curly_count--; + if(para_count < 0 || square_count < 0 || curly_count < 0) + break; + } while(iter.forward_char() && iter < end); + if(iter == end && (para_count > 0 || square_count > 0 || curly_count > 0)) { + do { + if(*iter == '(' && is_code_iter(iter)) + para_count++; + else if(*iter == ')' && is_code_iter(iter)) + para_count--; + else if(*iter == '[' && is_code_iter(iter)) + square_count++; + else if(*iter == ']' && is_code_iter(iter)) + square_count--; + else if(*iter == '{' && is_code_iter(iter)) + curly_count++; + else if(*iter == '}' && is_code_iter(iter)) + curly_count--; + if(para_count == 0 && square_count == 0 && curly_count == 0) + break; + } while(iter.forward_char()); + if(iter) { + end = iter; + end.forward_char(); + } + } + get_buffer()->select_range(start, end); return; }