From e5a4dca496b2360cf5c9ccbf803020d51e75871f Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 4 Sep 2016 12:25:48 +0200 Subject: [PATCH] Improved behaviour on control-up/down: move up/down paragraphs, similar to control-left/right --- src/source.cc | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/source.cc b/src/source.cc index ef96fab..9aede5e 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1072,6 +1072,69 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { previous_non_modifier_keyval=last_keyval; last_keyval=key->keyval; + //Move cursor one paragraph down + if(key->keyval==GDK_KEY_Down && (key->state&GDK_CONTROL_MASK)>0) { + get_buffer()->begin_user_action(); + auto selection_start_iter=get_buffer()->get_selection_bound()->get_iter(); + auto iter=get_buffer()->get_iter_at_line(get_buffer()->get_insert()->get_iter().get_line()); + bool empty_line=false; + bool text_found=false; + for(;;) { + if(!iter) + break; + if(iter.starts_line()) + empty_line=true; + if(empty_line && !iter.ends_line() && *iter!=' ' && *iter!='\t') + empty_line=false; + if(!text_found && !iter.ends_line() && *iter!=' ' && *iter!='\t') + text_found=true; + if(empty_line && text_found && iter.ends_line()) + break; + iter.forward_char(); + } + iter=get_buffer()->get_iter_at_line(iter.get_line()); + if((key->state&GDK_SHIFT_MASK)>0) + get_buffer()->select_range(iter, selection_start_iter); + else + get_buffer()->place_cursor(iter); + scroll_to(get_buffer()->get_insert()); + get_buffer()->end_user_action(); + return true; + } + //Move cursor one paragraph up + else if(key->keyval==GDK_KEY_Up && (key->state&GDK_CONTROL_MASK)>0) { + get_buffer()->begin_user_action(); + auto selection_start_iter=get_buffer()->get_selection_bound()->get_iter(); + auto iter=get_buffer()->get_iter_at_line(get_buffer()->get_insert()->get_iter().get_line()); + iter.backward_char(); + bool empty_line=false; + bool text_found=false; + for(;;) { + if(!iter || iter.is_start()) + break; + if(iter.ends_line()) + empty_line=true; + if(empty_line && !iter.ends_line() && *iter!=' ' && *iter!='\t') + empty_line=false; + if(!text_found && !iter.ends_line() && *iter!=' ' && *iter!='\t') + text_found=true; + if(empty_line && text_found && iter.starts_line()) + break; + iter.backward_char(); + } + if(empty_line) { + iter=get_iter_at_line_end(iter.get_line()); + iter.forward_char(); + } + if((key->state&GDK_SHIFT_MASK)>0) + get_buffer()->select_range(iter, selection_start_iter); + else + get_buffer()->place_cursor(iter); + scroll_to(get_buffer()->get_insert()); + get_buffer()->end_user_action(); + return true; + } + if(get_buffer()->get_has_selection()) return on_key_press_event_basic(key);