From 18caaeda6e629cfa764c7ea939e57b47b6ce09b8 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 11 Oct 2015 14:40:02 +0200 Subject: [PATCH] Replaced tab regex with function that finds end of tab. --- src/source.cc | 201 +++++++++++++++++++++++++------------------------- src/source.h | 5 +- src/window.cc | 4 +- 3 files changed, 107 insertions(+), 103 deletions(-) diff --git a/src/source.cc b/src/source.cc index 412e0c3..42d4ea9 100644 --- a/src/source.cc +++ b/src/source.cc @@ -258,6 +258,26 @@ Source::View::View(const boost::filesystem::path &file_path, const boost::filesy }); set_tooltip_events(); + + tab_char=Singleton::Config::source()->default_tab_char; + tab_size=Singleton::Config::source()->default_tab_size; + if(Singleton::Config::source()->auto_tab_char_and_size) { + auto tab_char_and_size=find_tab_char_and_size(); + if(tab_char_and_size.first!=0) { + if(tab_char!=tab_char_and_size.first || tab_size!=tab_char_and_size.second) { + std::string tab_str; + if(tab_char_and_size.first==' ') + tab_str=""; + else + tab_str=""; + Singleton::terminal()->print("Tab char and size for file "+file_path.string()+" set to: "+tab_str+", "+std::to_string(tab_char_and_size.second)+".\n"); + } + + tab_char=tab_char_and_size.first; + tab_size=tab_char_and_size.second; + } + } + set_tab_char_and_size(tab_char, tab_size); } void Source::View::set_tab_char_and_size(char tab_char, unsigned tab_size) { @@ -267,8 +287,6 @@ void Source::View::set_tab_char_and_size(char tab_char, unsigned tab_size) { tab.clear(); for(unsigned c=0;cremove_tag_by_name("spellcheck_error", get_buffer()->begin(), get_buffer()->end()); - - tab_char=Singleton::Config::source()->default_tab_char; - tab_size=Singleton::Config::source()->default_tab_size; - if(Singleton::Config::source()->auto_tab_char_and_size) { - auto tab_char_and_size=find_tab_char_and_size(); - if(tab_char_and_size.first!=0) { - if(tab_char!=tab_char_and_size.first || tab_size!=tab_char_and_size.second) { - std::string tab_str; - if(tab_char_and_size.first==' ') - tab_str=""; - else - tab_str=""; - Singleton::terminal()->print("Tab char and size for file "+file_path.string()+" set to: "+tab_str+", "+std::to_string(tab_char_and_size.second)+".\n"); - } - - tab_char=tab_char_and_size.first; - tab_size=tab_char_and_size.second; - } - } - set_tab_char_and_size(tab_char, tab_size); } void Source::View::set_tooltip_events() { @@ -542,8 +540,9 @@ void Source::View::paste() { auto line=get_line_before(); std::smatch sm; std::string prefix_tabs; - if(!get_buffer()->get_has_selection() && std::regex_match(line, sm, tabs_regex) && sm[2].str().size()==0) { - prefix_tabs=sm[1].str(); + auto tabs_end_iter=get_tabs_end_iter(); + if(!get_buffer()->get_has_selection() && tabs_end_iter.ends_line()) { + prefix_tabs=get_line_before(tabs_end_iter); Glib::ustring::size_type start_line=0; Glib::ustring::size_type end_line=0; @@ -741,15 +740,12 @@ std::string Source::View::get_line(const Gtk::TextIter &iter) { std::string line(get_source_buffer()->get_text(line_start_it, line_end_it)); return line; } - std::string Source::View::get_line(Glib::RefPtr mark) { return get_line(mark->get_iter()); } - std::string Source::View::get_line(int line_nr) { return get_line(get_buffer()->get_iter_at_line(line_nr)); } - std::string Source::View::get_line() { return get_line(get_buffer()->get_insert()); } @@ -759,15 +755,28 @@ std::string Source::View::get_line_before(const Gtk::TextIter &iter) { std::string line(get_source_buffer()->get_text(line_it, iter)); return line; } - std::string Source::View::get_line_before(Glib::RefPtr mark) { return get_line_before(mark->get_iter()); } - std::string Source::View::get_line_before() { return get_line_before(get_buffer()->get_insert()); } +Gtk::TextIter Source::View::get_tabs_end_iter(const Gtk::TextIter &iter) { + return get_tabs_end_iter(iter.get_line()); +} +Gtk::TextIter Source::View::get_tabs_end_iter(Glib::RefPtr mark) { + return get_tabs_end_iter(mark->get_iter()); +} +Gtk::TextIter Source::View::get_tabs_end_iter(int line_nr) { + auto sentence_iter = get_source_buffer()->get_iter_at_line(line_nr); + while((*sentence_iter==' ' || *sentence_iter=='\t') && !sentence_iter.ends_line() && sentence_iter.forward_char()) {} + return sentence_iter; +} +Gtk::TextIter Source::View::get_tabs_end_iter() { + return get_tabs_end_iter(get_buffer()->get_insert()); +} + bool Source::View::find_start_of_closed_expression(Gtk::TextIter iter, Gtk::TextIter &found_iter) { int count1=0; int count2=0; @@ -924,25 +933,20 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { if(key->keyval==GDK_KEY_Return && !get_buffer()->get_has_selection()) { auto insert_it=get_buffer()->get_insert()->get_iter(); int line_nr=insert_it.get_line(); - auto line=get_line_before(); - std::smatch sm; - if(std::regex_match(line, sm, tabs_regex)) { - if((line_nr+1)get_line_count()) { - string next_line=get_line(line_nr+1); - auto line_end_iter=get_buffer()->get_iter_at_line(line_nr+1); - if(line_end_iter.backward_char()) { - std::smatch sm2; - if(insert_it==line_end_iter && std::regex_match(next_line, sm2, tabs_regex)) { - if(sm2[1].str().size()>sm[1].str().size()) { - get_source_buffer()->insert_at_cursor("\n"+sm2[1].str()); - scroll_to(get_source_buffer()->get_insert()); - get_source_buffer()->end_user_action(); - return true; - } - } + auto tabs_end_iter=get_tabs_end_iter(); + auto line_tabs=get_line_before(tabs_end_iter); + if((line_nr+1)get_line_count()) { + 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); + if(insert_it.ends_line()) { + if(next_line_tabs.size()>line_tabs.size()) { + get_source_buffer()->insert_at_cursor("\n"+next_line_tabs); + scroll_to(get_source_buffer()->get_insert()); + get_source_buffer()->end_user_action(); + return true; } } - get_source_buffer()->insert_at_cursor("\n"+sm[1].str()); + get_source_buffer()->insert_at_cursor("\n"+line_tabs); scroll_to(get_source_buffer()->get_insert()); get_source_buffer()->end_user_action(); return true; @@ -955,22 +959,23 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { if(iter.starts_line() && iter.ends_line() && !get_buffer()->get_has_selection()) { auto prev_line_iter=iter; while(prev_line_iter.starts_line() && prev_line_iter.backward_char()) {} - auto line=get_line_before(prev_line_iter); - std::smatch sm; - if(std::regex_match(line, sm, tabs_regex)) { - auto tabs=sm[1].str(); - auto next_line_iter=iter; - while(next_line_iter.starts_line() && next_line_iter.forward_char()) {} - line=get_line(next_line_iter); - if(std::regex_match(line, sm, tabs_regex)) { - if(sm[1].str().size()=tab_size) { - get_buffer()->insert_at_cursor(tabs); - get_source_buffer()->end_user_action(); - return true; - } - } + auto prev_line_tabs_end_iter=get_tabs_end_iter(prev_line_iter); + auto previous_line_tabs=get_line_before(prev_line_tabs_end_iter); + + auto next_line_iter=iter; + while(next_line_iter.starts_line() && next_line_iter.forward_char()) {} + auto next_line_tabs_end_iter=get_tabs_end_iter(next_line_iter); + auto next_line_tabs=get_line_before(next_line_tabs_end_iter); + + std::string tabs; + if(previous_line_tabs.size()=tab_size) { + get_buffer()->insert_at_cursor(tabs); + get_source_buffer()->end_user_action(); + return true; } } @@ -997,15 +1002,16 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { std::vector ignore_line; for(int line_nr=line_start;line_nr<=line_end;line_nr++) { auto line_it = get_source_buffer()->get_iter_at_line(line_nr); - if(!get_buffer()->get_has_selection() || line_it!=selection_end) { - string line=get_line(line_nr); - std::smatch sm; - if(std::regex_match(line, sm, tabs_regex) && (sm[1].str().size()>0 || sm[2].str().size()==0)) { - if(sm[2].str().size()>0) { - indent_left_steps=std::min(indent_left_steps, (unsigned)sm[1].str().size()); + if(!get_buffer()->get_has_selection() || line_it!=selection_end) { + auto tabs_end_iter=get_tabs_end_iter(line_nr); + auto line_tabs=get_line_before(tabs_end_iter); + + if(line_tabs.size()>0 || tabs_end_iter.ends_line()) { + if(!tabs_end_iter.ends_line()) { + indent_left_steps=std::min(indent_left_steps, static_cast(line_tabs.size())); ignore_line.push_back(false); } - else if((unsigned)sm[1].str().size()(line_tabs.size())get_insert()->get_iter(); Gtk::TextIter start_of_sentence_iter; if(find_start_of_closed_expression(iter, start_of_sentence_iter)) { - auto start_line=get_line_before(start_of_sentence_iter); - std::smatch sm; - std::string tabs; - if(std::regex_match(start_line, sm, tabs_regex)) { - tabs=sm[1].str(); - } + auto start_sentence_tabs_end_iter=get_tabs_end_iter(start_of_sentence_iter); + auto tabs=get_line_before(start_sentence_tabs_end_iter); + std::smatch sm; if(iter.backward_char() && *iter=='{') { auto found_iter=iter; bool found_right_bracket=find_right_bracket_forward(iter, found_iter); bool has_bracket=false; if(found_right_bracket) { - auto line=get_line_before(found_iter); - if(std::regex_match(line, sm, tabs_regex)) { - if(tabs.size()==sm[1].str().size()) - has_bracket=true; - } + auto tabs_end_iter=get_tabs_end_iter(found_iter); + auto line_tabs=get_line_before(tabs_end_iter); + if(tabs.size()==line_tabs.size()) + has_bracket=true; } if(*get_buffer()->get_insert()->get_iter()=='}') { get_source_buffer()->insert_at_cursor("\n"+tabs+tab+"\n"+tabs); @@ -1830,11 +1832,11 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { auto found_iter=iter; if(find_open_expression_symbol(iter, start_of_sentence_iter, found_iter)) { auto line=get_line_before(found_iter); - if(std::regex_match(line, sm, tabs_regex)) { - tabs=sm[1].str(); - for(size_t c=0;cinsert_at_cursor("\n"+tabs+tab); @@ -1879,21 +1881,20 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { Gtk::TextIter start_of_left_bracket_sentence_iter; if(find_start_of_closed_expression(left_bracket_iter, start_of_left_bracket_sentence_iter)) { std::smatch sm; - auto start_left_bracket_sentence=get_line_before(start_of_left_bracket_sentence_iter); - if(std::regex_match(start_left_bracket_sentence, sm, tabs_regex)) { - if(tabs.size()==(sm[1].str().size()+tab_size)) { - auto start_line_iter=get_buffer()->get_iter_at_line(iter.get_line()); - auto start_line_plus_tab_size=start_line_iter; - for(size_t c=0;cerase(start_line_iter, start_line_plus_tab_size); - } - else { - get_source_buffer()->insert_at_cursor("\n"+tabs+tab); - scroll_to(get_source_buffer()->get_insert()); - get_source_buffer()->end_user_action(); - return true; - } + auto tabs_end_iter=get_tabs_end_iter(start_of_left_bracket_sentence_iter); + auto tabs_start_of_sentence=get_line_before(tabs_end_iter); + if(tabs.size()==(tabs_start_of_sentence.size()+tab_size)) { + auto start_line_iter=get_buffer()->get_iter_at_line(iter.get_line()); + auto start_line_plus_tab_size=start_line_iter; + for(size_t c=0;cerase(start_line_iter, start_line_plus_tab_size); + } + else { + get_source_buffer()->insert_at_cursor("\n"+tabs+tab); + scroll_to(get_source_buffer()->get_insert()); + get_source_buffer()->end_user_action(); + return true; } } } diff --git a/src/source.h b/src/source.h index cfa474d..214da6b 100644 --- a/src/source.h +++ b/src/source.h @@ -148,6 +148,10 @@ namespace Source { std::string get_line_before(const Gtk::TextIter &iter); std::string get_line_before(Glib::RefPtr mark); std::string get_line_before(); + Gtk::TextIter get_tabs_end_iter(const Gtk::TextIter &iter); + Gtk::TextIter get_tabs_end_iter(Glib::RefPtr mark); + Gtk::TextIter get_tabs_end_iter(int line_nr); + Gtk::TextIter get_tabs_end_iter(); bool find_start_of_closed_expression(Gtk::TextIter iter, Gtk::TextIter &found_iter); bool find_open_expression_symbol(Gtk::TextIter iter, const Gtk::TextIter &until_iter, Gtk::TextIter &found_iter); @@ -161,7 +165,6 @@ namespace Source { unsigned tab_size; char tab_char; std::string tab; - std::regex tabs_regex; bool spellcheck_all=false; std::unique_ptr spellcheck_suggestions_dialog; diff --git a/src/window.cc b/src/window.cc index 3d167db..06a1cc6 100644 --- a/src/window.cc +++ b/src/window.cc @@ -249,7 +249,7 @@ void Window::create_menu() { } } }); - menu.action_group->add(Gtk::Action::create("EditSetTab", "Set Tab Char and Size"), Gtk::AccelKey(menu.key_map["edit_set_tab"]), [this]() { + menu.action_group->add(Gtk::Action::create("EditSetTab", "Set Tab in Current Buffer"), Gtk::AccelKey(menu.key_map["edit_set_tab"]), [this]() { set_tab_entry(); }); @@ -841,7 +841,7 @@ void Window::set_tab_entry() { entry_tab_char_it->on_activate=activate_function; entry_tab_size_it->on_activate=activate_function; - entry_box.buttons.emplace_back("Set tab char and size", [this, entry_tab_char_it](){ + entry_box.buttons.emplace_back("Set tab in current buffer", [this, entry_tab_char_it](){ entry_tab_char_it->activate(); });