Browse Source

Replaced tab regex with function that finds end of tab.

merge-requests/365/head
eidheim 10 years ago
parent
commit
18caaeda6e
  1. 201
      src/source.cc
  2. 5
      src/source.h
  3. 4
      src/window.cc

201
src/source.cc

@ -258,6 +258,26 @@ Source::View::View(const boost::filesystem::path &file_path, const boost::filesy
}); });
set_tooltip_events(); 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="<space>";
else
tab_str="<tab>";
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) { 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(); tab.clear();
for(unsigned c=0;c<tab_size;c++) for(unsigned c=0;c<tab_size;c++)
tab+=tab_char; tab+=tab_char;
tabs_regex=std::regex("^([ \\t]*)(.*)$");
} }
void Source::View::configure() { void Source::View::configure() {
@ -359,26 +377,6 @@ void Source::View::configure() {
else else
spellcheck_checker = to_aspell_speller(spellcheck_possible_err); spellcheck_checker = to_aspell_speller(spellcheck_possible_err);
get_buffer()->remove_tag_by_name("spellcheck_error", get_buffer()->begin(), get_buffer()->end()); get_buffer()->remove_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="<space>";
else
tab_str="<tab>";
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() { void Source::View::set_tooltip_events() {
@ -542,8 +540,9 @@ void Source::View::paste() {
auto line=get_line_before(); auto line=get_line_before();
std::smatch sm; std::smatch sm;
std::string prefix_tabs; std::string prefix_tabs;
if(!get_buffer()->get_has_selection() && std::regex_match(line, sm, tabs_regex) && sm[2].str().size()==0) { auto tabs_end_iter=get_tabs_end_iter();
prefix_tabs=sm[1].str(); 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 start_line=0;
Glib::ustring::size_type end_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)); std::string line(get_source_buffer()->get_text(line_start_it, line_end_it));
return line; return line;
} }
std::string Source::View::get_line(Glib::RefPtr<Gtk::TextBuffer::Mark> mark) { std::string Source::View::get_line(Glib::RefPtr<Gtk::TextBuffer::Mark> mark) {
return get_line(mark->get_iter()); return get_line(mark->get_iter());
} }
std::string Source::View::get_line(int line_nr) { std::string Source::View::get_line(int line_nr) {
return get_line(get_buffer()->get_iter_at_line(line_nr)); return get_line(get_buffer()->get_iter_at_line(line_nr));
} }
std::string Source::View::get_line() { std::string Source::View::get_line() {
return get_line(get_buffer()->get_insert()); 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)); std::string line(get_source_buffer()->get_text(line_it, iter));
return line; return line;
} }
std::string Source::View::get_line_before(Glib::RefPtr<Gtk::TextBuffer::Mark> mark) { std::string Source::View::get_line_before(Glib::RefPtr<Gtk::TextBuffer::Mark> mark) {
return get_line_before(mark->get_iter()); return get_line_before(mark->get_iter());
} }
std::string Source::View::get_line_before() { std::string Source::View::get_line_before() {
return get_line_before(get_buffer()->get_insert()); 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<Gtk::TextBuffer::Mark> 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) { bool Source::View::find_start_of_closed_expression(Gtk::TextIter iter, Gtk::TextIter &found_iter) {
int count1=0; int count1=0;
int count2=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()) { if(key->keyval==GDK_KEY_Return && !get_buffer()->get_has_selection()) {
auto insert_it=get_buffer()->get_insert()->get_iter(); auto insert_it=get_buffer()->get_insert()->get_iter();
int line_nr=insert_it.get_line(); int line_nr=insert_it.get_line();
auto line=get_line_before(); auto tabs_end_iter=get_tabs_end_iter();
std::smatch sm; auto line_tabs=get_line_before(tabs_end_iter);
if(std::regex_match(line, sm, tabs_regex)) { 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);
string next_line=get_line(line_nr+1); auto next_line_tabs=get_line_before(next_line_tabs_end_iter);
auto line_end_iter=get_buffer()->get_iter_at_line(line_nr+1); if(insert_it.ends_line()) {
if(line_end_iter.backward_char()) { if(next_line_tabs.size()>line_tabs.size()) {
std::smatch sm2; get_source_buffer()->insert_at_cursor("\n"+next_line_tabs);
if(insert_it==line_end_iter && std::regex_match(next_line, sm2, tabs_regex)) { scroll_to(get_source_buffer()->get_insert());
if(sm2[1].str().size()>sm[1].str().size()) { get_source_buffer()->end_user_action();
get_source_buffer()->insert_at_cursor("\n"+sm2[1].str()); return true;
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()); scroll_to(get_source_buffer()->get_insert());
get_source_buffer()->end_user_action(); get_source_buffer()->end_user_action();
return true; 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()) { if(iter.starts_line() && iter.ends_line() && !get_buffer()->get_has_selection()) {
auto prev_line_iter=iter; auto prev_line_iter=iter;
while(prev_line_iter.starts_line() && prev_line_iter.backward_char()) {} while(prev_line_iter.starts_line() && prev_line_iter.backward_char()) {}
auto line=get_line_before(prev_line_iter); auto prev_line_tabs_end_iter=get_tabs_end_iter(prev_line_iter);
std::smatch sm; auto previous_line_tabs=get_line_before(prev_line_tabs_end_iter);
if(std::regex_match(line, sm, tabs_regex)) {
auto tabs=sm[1].str(); auto next_line_iter=iter;
auto next_line_iter=iter; while(next_line_iter.starts_line() && next_line_iter.forward_char()) {}
while(next_line_iter.starts_line() && next_line_iter.forward_char()) {} auto next_line_tabs_end_iter=get_tabs_end_iter(next_line_iter);
line=get_line(next_line_iter); auto next_line_tabs=get_line_before(next_line_tabs_end_iter);
if(std::regex_match(line, sm, tabs_regex)) {
if(sm[1].str().size()<tabs.size()) std::string tabs;
tabs=sm[1].str(); if(previous_line_tabs.size()<next_line_tabs.size())
if(tabs.size()>=tab_size) { tabs=previous_line_tabs;
get_buffer()->insert_at_cursor(tabs); else
get_source_buffer()->end_user_action(); tabs=next_line_tabs;
return true; if(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<bool> ignore_line; std::vector<bool> ignore_line;
for(int line_nr=line_start;line_nr<=line_end;line_nr++) { for(int line_nr=line_start;line_nr<=line_end;line_nr++) {
auto line_it = get_source_buffer()->get_iter_at_line(line_nr); auto line_it = get_source_buffer()->get_iter_at_line(line_nr);
if(!get_buffer()->get_has_selection() || line_it!=selection_end) { if(!get_buffer()->get_has_selection() || line_it!=selection_end) {
string line=get_line(line_nr); auto tabs_end_iter=get_tabs_end_iter(line_nr);
std::smatch sm; auto line_tabs=get_line_before(tabs_end_iter);
if(std::regex_match(line, sm, tabs_regex) && (sm[1].str().size()>0 || sm[2].str().size()==0)) {
if(sm[2].str().size()>0) { if(line_tabs.size()>0 || tabs_end_iter.ends_line()) {
indent_left_steps=std::min(indent_left_steps, (unsigned)sm[1].str().size()); if(!tabs_end_iter.ends_line()) {
indent_left_steps=std::min(indent_left_steps, static_cast<unsigned>(line_tabs.size()));
ignore_line.push_back(false); ignore_line.push_back(false);
} }
else if((unsigned)sm[1].str().size()<indent_left_steps) else if(static_cast<unsigned>(line_tabs.size())<indent_left_steps)
ignore_line.push_back(true); ignore_line.push_back(true);
else else
ignore_line.push_back(false); ignore_line.push_back(false);
@ -1778,24 +1784,20 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) {
auto iter=get_buffer()->get_insert()->get_iter(); auto 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_line=get_line_before(start_of_sentence_iter); auto start_sentence_tabs_end_iter=get_tabs_end_iter(start_of_sentence_iter);
std::smatch sm; auto tabs=get_line_before(start_sentence_tabs_end_iter);
std::string tabs;
if(std::regex_match(start_line, sm, tabs_regex)) {
tabs=sm[1].str();
}
std::smatch sm;
if(iter.backward_char() && *iter=='{') { if(iter.backward_char() && *iter=='{') {
auto found_iter=iter; auto found_iter=iter;
bool found_right_bracket=find_right_bracket_forward(iter, found_iter); bool found_right_bracket=find_right_bracket_forward(iter, found_iter);
bool has_bracket=false; bool has_bracket=false;
if(found_right_bracket) { if(found_right_bracket) {
auto line=get_line_before(found_iter); auto tabs_end_iter=get_tabs_end_iter(found_iter);
if(std::regex_match(line, sm, tabs_regex)) { auto line_tabs=get_line_before(tabs_end_iter);
if(tabs.size()==sm[1].str().size()) if(tabs.size()==line_tabs.size())
has_bracket=true; has_bracket=true;
}
} }
if(*get_buffer()->get_insert()->get_iter()=='}') { if(*get_buffer()->get_insert()->get_iter()=='}') {
get_source_buffer()->insert_at_cursor("\n"+tabs+tab+"\n"+tabs); 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; auto found_iter=iter;
if(find_open_expression_symbol(iter, start_of_sentence_iter, found_iter)) { if(find_open_expression_symbol(iter, start_of_sentence_iter, found_iter)) {
auto line=get_line_before(found_iter); auto line=get_line_before(found_iter);
if(std::regex_match(line, sm, tabs_regex)) { auto tabs_end_iter=get_tabs_end_iter(found_iter);
tabs=sm[1].str(); tabs=get_line_before(tabs_end_iter);
for(size_t c=0;c<sm[2].str().size()+1;c++) auto iter=tabs_end_iter;
tabs+=' '; while(iter<=found_iter && iter.forward_char())
} tabs+=' ';
} }
else if(std::regex_match(line, sm, no_bracket_statement_regex)) { else if(std::regex_match(line, sm, no_bracket_statement_regex)) {
get_source_buffer()->insert_at_cursor("\n"+tabs+tab); get_source_buffer()->insert_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; Gtk::TextIter start_of_left_bracket_sentence_iter;
if(find_start_of_closed_expression(left_bracket_iter, start_of_left_bracket_sentence_iter)) { if(find_start_of_closed_expression(left_bracket_iter, start_of_left_bracket_sentence_iter)) {
std::smatch sm; std::smatch sm;
auto start_left_bracket_sentence=get_line_before(start_of_left_bracket_sentence_iter); auto tabs_end_iter=get_tabs_end_iter(start_of_left_bracket_sentence_iter);
if(std::regex_match(start_left_bracket_sentence, sm, tabs_regex)) { auto tabs_start_of_sentence=get_line_before(tabs_end_iter);
if(tabs.size()==(sm[1].str().size()+tab_size)) { 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_iter=get_buffer()->get_iter_at_line(iter.get_line());
auto start_line_plus_tab_size=start_line_iter; auto start_line_plus_tab_size=start_line_iter;
for(size_t c=0;c<tab_size;c++) for(size_t c=0;c<tab_size;c++)
start_line_plus_tab_size.forward_char(); start_line_plus_tab_size.forward_char();
get_buffer()->erase(start_line_iter, start_line_plus_tab_size); get_buffer()->erase(start_line_iter, start_line_plus_tab_size);
} }
else { else {
get_source_buffer()->insert_at_cursor("\n"+tabs+tab); get_source_buffer()->insert_at_cursor("\n"+tabs+tab);
scroll_to(get_source_buffer()->get_insert()); scroll_to(get_source_buffer()->get_insert());
get_source_buffer()->end_user_action(); get_source_buffer()->end_user_action();
return true; return true;
}
} }
} }
} }

5
src/source.h

@ -148,6 +148,10 @@ namespace Source {
std::string get_line_before(const Gtk::TextIter &iter); std::string get_line_before(const Gtk::TextIter &iter);
std::string get_line_before(Glib::RefPtr<Gtk::TextBuffer::Mark> mark); std::string get_line_before(Glib::RefPtr<Gtk::TextBuffer::Mark> mark);
std::string get_line_before(); std::string get_line_before();
Gtk::TextIter get_tabs_end_iter(const Gtk::TextIter &iter);
Gtk::TextIter get_tabs_end_iter(Glib::RefPtr<Gtk::TextBuffer::Mark> 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_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); 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; unsigned tab_size;
char tab_char; char tab_char;
std::string tab; std::string tab;
std::regex tabs_regex;
bool spellcheck_all=false; bool spellcheck_all=false;
std::unique_ptr<SelectionDialog> spellcheck_suggestions_dialog; std::unique_ptr<SelectionDialog> spellcheck_suggestions_dialog;

4
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(); set_tab_entry();
}); });
@ -841,7 +841,7 @@ void Window::set_tab_entry() {
entry_tab_char_it->on_activate=activate_function; entry_tab_char_it->on_activate=activate_function;
entry_tab_size_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(); entry_tab_char_it->activate();
}); });

Loading…
Cancel
Save