Browse Source

Improved indentation.

merge-requests/365/head
eidheim 10 years ago
parent
commit
30d34eb7a3
  1. 56
      src/source.cc

56
src/source.cc

@ -929,16 +929,32 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
last_keyval_is_return=false; last_keyval_is_return=false;
get_source_buffer()->begin_user_action(); get_source_buffer()->begin_user_action();
auto iter=get_buffer()->get_insert()->get_iter();
//Indent as in next or previous line //Indent as in next or previous line
if(key->keyval==GDK_KEY_Return && !get_buffer()->get_has_selection()) { if(key->keyval==GDK_KEY_Return && !get_buffer()->get_has_selection() && !iter.starts_line()) {
auto insert_it=get_buffer()->get_insert()->get_iter(); //First remove spaces or tabs around cursor
int line_nr=insert_it.get_line(); auto start_blank_iter=iter;
auto end_blank_iter=iter;
while((*end_blank_iter==' ' || *end_blank_iter=='\t') &&
!end_blank_iter.ends_line() && end_blank_iter.forward_char()) {}
start_blank_iter.backward_char();
while((*start_blank_iter==' ' || *start_blank_iter=='\t' || start_blank_iter.ends_line()) &&
!start_blank_iter.starts_line() && start_blank_iter.backward_char()) {}
if(!start_blank_iter.starts_line()) {
start_blank_iter.forward_char();
get_buffer()->erase(start_blank_iter, end_blank_iter);
}
else
get_buffer()->erase(iter, end_blank_iter);
iter=get_buffer()->get_insert()->get_iter();
int line_nr=iter.get_line();
auto tabs_end_iter=get_tabs_end_iter(); auto tabs_end_iter=get_tabs_end_iter();
auto line_tabs=get_line_before(tabs_end_iter); auto line_tabs=get_line_before(tabs_end_iter);
if((line_nr+1)<get_buffer()->get_line_count()) { if((line_nr+1)<get_buffer()->get_line_count()) {
auto next_line_tabs_end_iter=get_tabs_end_iter(line_nr+1); auto next_line_tabs_end_iter=get_tabs_end_iter(line_nr+1);
auto next_line_tabs=get_line_before(next_line_tabs_end_iter); auto next_line_tabs=get_line_before(next_line_tabs_end_iter);
if(insert_it.ends_line()) { if(iter.ends_line()) {
if(next_line_tabs.size()>line_tabs.size()) { if(next_line_tabs.size()>line_tabs.size()) {
get_source_buffer()->insert_at_cursor("\n"+next_line_tabs); get_source_buffer()->insert_at_cursor("\n"+next_line_tabs);
scroll_to(get_source_buffer()->get_insert()); scroll_to(get_source_buffer()->get_insert());
@ -954,7 +970,6 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
} }
//Indent right when clicking tab, no matter where in the line the cursor is. Also works on selected text. //Indent right when clicking tab, no matter where in the line the cursor is. Also works on selected text.
else if(key->keyval==GDK_KEY_Tab) { else if(key->keyval==GDK_KEY_Tab) {
auto iter=get_buffer()->get_insert()->get_iter();
//Special case if insert is at beginning of empty line: //Special case if insert is at beginning of empty line:
if(iter.starts_line() && iter.ends_line() && !get_buffer()->get_has_selection()) { if(iter.starts_line() && iter.ends_line() && !get_buffer()->get_has_selection()) {
auto prev_line_iter=iter; auto prev_line_iter=iter;
@ -1037,7 +1052,6 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
} }
//"Smart" backspace key //"Smart" backspace 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 line=get_line_before(); auto line=get_line_before();
bool do_smart_backspace=true; bool do_smart_backspace=true;
for(auto &chr: line) { for(auto &chr: line) {
@ -1047,15 +1061,14 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
} }
} }
if(do_smart_backspace) { if(do_smart_backspace) {
auto line_start_iter=insert_it; auto line_start_iter=iter;
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(iter, line_start_iter);
} }
} }
//"Smart" delete key //"Smart" delete 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=iter;
auto iter=insert_iter;
bool do_smart_delete=true; bool do_smart_delete=true;
do { do {
if(*iter!=' ' && *iter!='\t' && !iter.ends_line()) { if(*iter!=' ' && *iter!='\t' && !iter.ends_line()) {
@ -1078,7 +1091,6 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
//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 //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 end_line_iter=iter; auto end_line_iter=iter;
while(!end_line_iter.ends_line() && end_line_iter.forward_char()) {} while(!end_line_iter.ends_line() && end_line_iter.forward_char()) {}
auto end_sentence_iter=end_line_iter; auto end_sentence_iter=end_line_iter;
@ -1105,7 +1117,6 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
return true; return true;
} }
else if(key->keyval==GDK_KEY_Home && (key->state&GDK_CONTROL_MASK)==0) { else if(key->keyval==GDK_KEY_Home && (key->state&GDK_CONTROL_MASK)==0) {
auto iter=get_buffer()->get_insert()->get_iter();
auto start_line_iter=get_buffer()->get_iter_at_line(iter.get_line()); auto start_line_iter=get_buffer()->get_iter_at_line(iter.get_line());
auto start_sentence_iter=start_line_iter; auto start_sentence_iter=start_line_iter;
while(!start_sentence_iter.ends_line() && while(!start_sentence_iter.ends_line() &&
@ -1778,10 +1789,25 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) {
return Source::View::on_key_press_event(key); return Source::View::on_key_press_event(key);
} }
get_source_buffer()->begin_user_action(); get_source_buffer()->begin_user_action();
iter=get_buffer()->get_insert()->get_iter();
//Indent depending on if/else/etc and brackets //Indent depending on if/else/etc and brackets
if(key->keyval==GDK_KEY_Return) { if(key->keyval==GDK_KEY_Return && !iter.starts_line()) {
auto iter=get_buffer()->get_insert()->get_iter(); //First remove spaces or tabs around cursor
auto start_blank_iter=iter;
auto end_blank_iter=iter;
while((*end_blank_iter==' ' || *end_blank_iter=='\t') &&
!end_blank_iter.ends_line() && end_blank_iter.forward_char()) {}
start_blank_iter.backward_char();
while((*start_blank_iter==' ' || *start_blank_iter=='\t' || start_blank_iter.ends_line()) &&
!start_blank_iter.starts_line() && start_blank_iter.backward_char()) {}
if(!start_blank_iter.starts_line()) {
start_blank_iter.forward_char();
get_buffer()->erase(start_blank_iter, end_blank_iter);
}
else
get_buffer()->erase(iter, end_blank_iter);
iter=get_buffer()->get_insert()->get_iter();
Gtk::TextIter start_of_sentence_iter; Gtk::TextIter start_of_sentence_iter;
if(find_start_of_closed_expression(iter, start_of_sentence_iter)) { if(find_start_of_closed_expression(iter, start_of_sentence_iter)) {
auto start_sentence_tabs_end_iter=get_tabs_end_iter(start_of_sentence_iter); auto start_sentence_tabs_end_iter=get_tabs_end_iter(start_of_sentence_iter);

Loading…
Cancel
Save