Browse Source

Fixes to smart delete, backspace and end.

merge-requests/365/head
eidheim 10 years ago
parent
commit
137e2bcc18
  1. 47
      src/source.cc

47
src/source.cc

@ -994,8 +994,14 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
else if(key->keyval==GDK_KEY_BackSpace && !get_buffer()->get_has_selection()) { else if(key->keyval==GDK_KEY_BackSpace && !get_buffer()->get_has_selection()) {
auto insert_it=get_buffer()->get_insert()->get_iter(); auto insert_it=get_buffer()->get_insert()->get_iter();
auto line=get_line_before(); auto line=get_line_before();
std::smatch sm; bool do_smart_backspace=true;
if(std::regex_match(line, sm, tabs_regex) && sm[1].str().size()==line.size()) { for(auto &chr: line) {
if(chr!=' ' && chr!='\t') {
do_smart_backspace=false;
break;
}
}
if(do_smart_backspace) {
auto line_start_iter=insert_it; auto line_start_iter=insert_it;
if(line_start_iter.backward_chars(line.size())) if(line_start_iter.backward_chars(line.size()))
get_buffer()->erase(insert_it, line_start_iter); get_buffer()->erase(insert_it, line_start_iter);
@ -1005,31 +1011,26 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
else if(key->keyval==GDK_KEY_Delete && !get_buffer()->get_has_selection()) { else if(key->keyval==GDK_KEY_Delete && !get_buffer()->get_has_selection()) {
auto insert_iter=get_buffer()->get_insert()->get_iter(); auto insert_iter=get_buffer()->get_insert()->get_iter();
auto iter=insert_iter; auto iter=insert_iter;
bool perform_smart_delete=false; bool do_smart_delete=true;
if(iter.starts_line() && iter.ends_line()) {} do {
else if(iter.ends_line() && iter.forward_char()) { if(*iter!=' ' && *iter!='\t' && !iter.ends_line()) {
if(!iter.ends_line()) { do_smart_delete=false;
bool first_line=true; break;
while((*iter==' ' || *iter=='\t' || (first_line && iter.ends_line())) && iter.forward_char()) {
perform_smart_delete=true;
if(first_line && iter.ends_line())
first_line=false;
}
} }
} if(iter.ends_line()) {
else { iter.forward_char();
while((*iter==' ' || *iter=='\t') && iter.forward_char()) { break;
perform_smart_delete=true;
if(iter.ends_line()) {
iter.forward_char();
break;
}
} }
} while(iter.forward_char());
if(do_smart_delete) {
if(!insert_iter.starts_line())
while((*iter==' ' || *iter=='\t') && iter.forward_char()) {}
if(iter.backward_char())
get_buffer()->erase(insert_iter, iter);
} }
if(perform_smart_delete && iter.backward_char())
get_buffer()->erase(insert_iter, iter);
} }
//Next two are smart home/end keys that works with wrapped lines //Next two are smart home/end keys that works with wrapped lines
//Note that smart end goes FIRST to end of line to avoid hiding empty chars after expressions
else if(key->keyval==GDK_KEY_End && (key->state&GDK_CONTROL_MASK)==0) { else if(key->keyval==GDK_KEY_End && (key->state&GDK_CONTROL_MASK)==0) {
auto iter=get_buffer()->get_insert()->get_iter(); auto iter=get_buffer()->get_insert()->get_iter();
auto end_line_iter=iter; auto end_line_iter=iter;
@ -1041,7 +1042,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
if(!end_sentence_iter.ends_line()) if(!end_sentence_iter.ends_line())
end_sentence_iter.forward_char(); end_sentence_iter.forward_char();
if(iter<end_sentence_iter || iter==end_line_iter) { if(iter==end_line_iter) {
if((key->state&GDK_SHIFT_MASK)>0) if((key->state&GDK_SHIFT_MASK)>0)
get_buffer()->move_mark_by_name("insert", end_sentence_iter); get_buffer()->move_mark_by_name("insert", end_sentence_iter);
else else

Loading…
Cancel
Save