use strict; use warnings; use List::Util qw/max/; if (IsTextSelected() == 0) { # not selected -> select previous line GoLineTop(); BeginSelect(); Jump(ExpandParameter('$y') - 1); BeginSelect(); # end select } unless (GetSelectColmFrom() == 1 && GetSelectColmTo() == 1) { MsgBox(sprintf( "select correctly!\nSelectColmFrom(%d) and SelectColmTo(%d) must be 1", GetSelectColmFrom(), GetSelectColmTo() )); exit(0); } my $y = max(GetSelectLineFrom(), GetSelectLineTo()); my $lines = abs(GetSelectLineFrom() - GetSelectLineTo()); # save selection my $prev_line = GetSelectedString(0); # save previous selection Jump(GetSelectLineFrom()); BeginSelect(); Jump(ExpandParameter('$y') - $lines); BeginSelect(); # end select my $prev2_line = GetSelectedString(0); # return cursor Jump($y); # split with numbers my @prev2 = split(/(\d+)/, $prev2_line); my @prev = split(/(\d+)/, $prev_line); # check if they are analyzable if (@prev2 != @prev) { MsgBox("can't analyze!"); exit(0); } # inclement each element my $result = ''; for (my $i = 0; $i < @prev2; $i++) { my $prev = $prev[$i]; my $prev2 = $prev2[$i]; if ($prev2 eq $prev) { # identical strings => copy it $result .= $prev2 } elsif ($prev2 =~ /^\d+$/ && $prev =~ /^\d+$/) { # number => inclement it if (length($prev2) == length($prev) && ($prev2 =~ /^0\d+$/ || $prev =~ /^0\d+$/)) { # begins with 0 => format new string in the same way $result .= sprintf('%0*d', length($prev2), $prev + ($prev - $prev2)); } else { # simple inclement $result .= $prev + ($prev - $prev2); } } else { MsgBox("can't analyze!"); exit(0); } } # insert new string InsText($result); # select new string BeginSelect(); Jump(ExpandParameter('$y') - $lines); BeginSelect(); # end select