Browse Source

Better find tab char and size function

merge-requests/365/head
eidheim 10 years ago
parent
commit
291c0509bd
  1. 159
      src/source.cc

159
src/source.cc

@ -520,7 +520,7 @@ void Source::View::replace_backward(const std::string &replacement) {
auto &start=selection_bound; auto &start=selection_bound;
Gtk::TextIter match_start, match_end; Gtk::TextIter match_start, match_end;
if(gtk_source_search_context_backward(search_context, start.gobj(), match_start.gobj(), match_end.gobj())) { if(gtk_source_search_context_backward(search_context, start.gobj(), match_start.gobj(), match_end.gobj())) {
auto offset=match_start.get_offset(); auto offset=match_start.get_offset();
gtk_source_search_context_replace(search_context, match_start.gobj(), match_end.gobj(), replacement.c_str(), replacement.size(), NULL); gtk_source_search_context_replace(search_context, match_start.gobj(), match_end.gobj(), replacement.c_str(), replacement.size(), NULL);
get_buffer()->select_range(get_buffer()->get_iter_at_offset(offset), get_buffer()->get_iter_at_offset(offset+replacement.size())); get_buffer()->select_range(get_buffer()->get_iter_at_offset(offset), get_buffer()->get_iter_at_offset(offset+replacement.size()));
@ -557,7 +557,7 @@ void Source::View::paste() {
bool first_paste_line=true; bool first_paste_line=true;
size_t paste_line_tabs=-1; size_t paste_line_tabs=-1;
bool first_paste_line_has_tabs=false; bool first_paste_line_has_tabs=false;
for(size_t c=0;c<text.size();c++) {; for(size_t c=0;c<text.size();c++) {
if(text[c]=='\n') { if(text[c]=='\n') {
end_line=c; end_line=c;
paste_line=true; paste_line=true;
@ -1172,36 +1172,141 @@ bool Source::View::on_button_press_event(GdkEventButton *event) {
} }
std::pair<char, unsigned> Source::View::find_tab_char_and_size() { std::pair<char, unsigned> Source::View::find_tab_char_and_size() {
auto size=get_buffer()->get_line_count();
std::unordered_map<char, size_t> tab_chars; std::unordered_map<char, size_t> tab_chars;
std::unordered_map<unsigned, size_t> tab_sizes; std::unordered_map<unsigned, size_t> tab_sizes;
unsigned last_tab_size=0; auto iter=get_buffer()->begin();
for(int c=0;c<size;c++) { long tab_count=-1;
auto tabs_end_iter=get_tabs_end_iter(c); long last_tab_count=0;
if(tabs_end_iter.starts_line() && tabs_end_iter.ends_line()) bool single_quoted=false;
continue; bool double_quoted=false;
std::string str=get_line_before(tabs_end_iter); //For bracket languages, TODO: add more language ids
if(language && (language->get_id()=="chdr" || language->get_id()=="cpphdr" || language->get_id()=="c" ||
long tab_diff=abs(static_cast<long>(str.size()-last_tab_size)); language->get_id()=="cpp" || language->get_id()=="objc" || language->get_id()=="java" ||
if(tab_diff>0) { language->get_id()=="javascript")) {
unsigned tab_diff_unsigned=static_cast<unsigned>(tab_diff); bool line_comment=false;
auto it_size=tab_sizes.find(tab_diff_unsigned); bool comment=false;
if(it_size!=tab_sizes.end()) bool bracket_last_line=false;
it_size->second++; char last_char=0;
else long last_tab_diff=-1;
tab_sizes[tab_diff_unsigned]=1; while(iter) {
if(iter.starts_line()) {
line_comment=false;
single_quoted=false;
double_quoted=false;
tab_count=0;
if(last_char=='{')
bracket_last_line=true;
else
bracket_last_line=false;
}
if(bracket_last_line && tab_count!=-1) {
if(*iter==' ') {
tab_chars[' ']++;
tab_count++;
}
else if(*iter=='\t') {
tab_chars['\t']++;
tab_count++;
}
else {
auto line_iter=iter;
char last_line_char=0;
while(line_iter && !line_iter.ends_line()) {
if(*line_iter!=' ' && *line_iter!='\t')
last_line_char=*line_iter;
if(*line_iter=='(')
break;
line_iter.forward_char();
}
if(last_line_char==':' || *iter=='#') {
tab_count=0;
if((iter.get_line()+1) < get_buffer()->get_line_count()) {
iter=get_buffer()->get_iter_at_line(iter.get_line()+1);
continue;
}
}
else if(!iter.ends_line()) {
if(tab_count!=last_tab_count)
tab_sizes[abs(tab_count-last_tab_count)]++;
last_tab_diff=abs(tab_count-last_tab_count);
last_tab_count=tab_count;
last_char=0;
}
}
}
auto prev_iter=iter;
prev_iter.backward_char();
auto prev_prev_iter=prev_iter;
prev_prev_iter.backward_char();
if(!double_quoted && *iter=='\'' && !(*prev_iter=='\\' && *prev_prev_iter!='\\'))
single_quoted=!single_quoted;
else if(!single_quoted && *iter=='\"' && !(*prev_iter=='\\' && *prev_prev_iter!='\\'))
double_quoted=!double_quoted;
else if(!single_quoted && !double_quoted) {
auto next_iter=iter;
next_iter.forward_char();
if(*iter=='/' && *next_iter=='/')
line_comment=true;
else if(*iter=='/' && *next_iter=='*')
comment=true;
else if(*iter=='*' && *next_iter=='/') {
iter.forward_char();
iter.forward_char();
comment=false;
}
}
if(!single_quoted && !double_quoted && !comment && !line_comment && *iter!=' ' && *iter!='\t' && !iter.ends_line())
last_char=*iter;
if(!single_quoted && !double_quoted && !comment && !line_comment && *iter=='}' && tab_count!=-1 && last_tab_diff!=-1)
last_tab_count-=last_tab_diff;
if(*iter!=' ' && *iter!='\t')
tab_count=-1;
iter.forward_char();
} }
}
last_tab_size=str.size(); else {
long para_count=0;
if(str.size()>0) { while(iter) {
auto it_char=tab_chars.find(str[0]); if(iter.starts_line())
if(it_char!=tab_chars.end()) tab_count=0;
it_char->second++; if(tab_count!=-1 && para_count==0 && single_quoted==false && double_quoted==false) {
else if(*iter==' ') {
tab_chars[str[0]]=1; tab_chars[' ']++;
tab_count++;
}
else if(*iter=='\t') {
tab_chars['\t']++;
tab_count++;
}
else if(!iter.ends_line()) {
if(tab_count!=last_tab_count)
tab_sizes[abs(tab_count-last_tab_count)]++;
last_tab_count=tab_count;
}
}
auto prev_iter=iter;
prev_iter.backward_char();
auto prev_prev_iter=prev_iter;
prev_prev_iter.backward_char();
if(!double_quoted && *iter=='\'' && !(*prev_iter=='\\' && *prev_prev_iter!='\\'))
single_quoted=!single_quoted;
else if(!single_quoted && *iter=='\"' && !(*prev_iter=='\\' && *prev_prev_iter!='\\'))
double_quoted=!double_quoted;
else if(!single_quoted && !double_quoted) {
if(*iter=='(')
para_count++;
else if(*iter==')')
para_count--;
}
if(*iter!=' ' && *iter!='\t')
tab_count=-1;
iter.forward_char();
} }
} }
char found_tab_char=0; char found_tab_char=0;
size_t occurences=0; size_t occurences=0;
for(auto &tab_char: tab_chars) { for(auto &tab_char: tab_chars) {

Loading…
Cancel
Save