From 82b8c6ed742a5f71042c7cf22a0a04fe63497188 Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 11 Aug 2015 21:07:36 +0200 Subject: [PATCH] Smart paste got smarter. --- src/source.cc | 81 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/src/source.cc b/src/source.cc index bd19bb7..8c7e322 100644 --- a/src/source.cc +++ b/src/source.cc @@ -137,17 +137,17 @@ void Source::View::paste() { const std::regex spaces_regex(std::string("^(")+Singleton::Config::source()->tab_char+"*)(.*)$"); auto line=get_line_before_insert(); std::smatch sm; - std::string prefix; + std::string prefix_tabs; if(std::regex_match(line, sm, spaces_regex) && sm[2].str().size()==0) { - prefix=sm[1].str(); - + prefix_tabs=sm[1].str(); + Glib::ustring::size_type start_line=0; Glib::ustring::size_type end_line=0; bool paste_line=false; bool first_paste_line=true; - size_t first_paste_line_tabs=0; - get_source_buffer()->begin_user_action(); - for(Glib::ustring::size_type c=0;ctab_char) + tabs++; + else + break; + } if(first_paste_line) { - std::string line=text.substr(start_line, end_line-start_line); - for(auto chr: line) { - if(chr==Singleton::Config::source()->tab_char) - first_paste_line_tabs++; - else - break; + if(tabs!=0) { + first_paste_line_has_tabs=true; + paste_line_tabs=tabs; } - get_buffer()->insert_at_cursor(text.substr(start_line+first_paste_line_tabs, end_line-start_line-first_paste_line_tabs)); + first_paste_line=false; } - else { - std::string line=text.substr(start_line, end_line-start_line); - size_t paste_line_tabs=0; - for(auto chr: line) { - if(chr==Singleton::Config::source()->tab_char) - paste_line_tabs++; - else - break; - } - if(paste_line_tabs>=first_paste_line_tabs) - get_buffer()->insert_at_cursor("\n"+prefix+text.substr(start_line+first_paste_line_tabs, end_line-start_line-first_paste_line_tabs)); - else { - size_t tabs=0; - if(prefix.size()>(first_paste_line_tabs-paste_line_tabs)) - tabs=prefix.size()-(first_paste_line_tabs-paste_line_tabs); - get_buffer()->insert_at_cursor("\n"+prefix.substr(0, tabs)+text.substr(start_line+paste_line_tabs, end_line-start_line-paste_line_tabs)); - } + else + paste_line_tabs=std::min(paste_line_tabs, tabs); + + start_line=end_line+1; + paste_line=false; + } + } + if(paste_line_tabs==(size_t)-1) + paste_line_tabs=0; + start_line=0; + end_line=0; + paste_line=false; + first_paste_line=true; + get_source_buffer()->begin_user_action(); + for(Glib::ustring::size_type c=0;cinsert_at_cursor(text.substr(start_line+paste_line_tabs, end_line-start_line-paste_line_tabs)); + else + get_buffer()->insert_at_cursor(text.substr(start_line, end_line-start_line)); + first_paste_line=false; } + else + get_buffer()->insert_at_cursor('\n'+prefix_tabs+text.substr(start_line+paste_line_tabs, end_line-start_line-paste_line_tabs)); start_line=end_line+1; - first_paste_line=false; paste_line=false; } }