From 34eadaa2e42ff3c17c1ed28d3ef2d67b2322ab4e Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 9 Jun 2021 21:04:37 +0200 Subject: [PATCH] Minor improvement to extend selection for non-bracket languages --- src/source.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) 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; }