aboutsummaryrefslogtreecommitdiffstats
path: root/incdec.pm
diff options
context:
space:
mode:
authorTeddy Wing2021-08-22 20:17:54 +0200
committerTeddy Wing2021-08-22 20:32:27 +0200
commitebce4b2272bcb8299d0ab4fa1524b6f4af9976c3 (patch)
treed813be4d796a7e0b960e8d8145da4a340bc9eb68 /incdec.pm
parent6a2d1fc08c17b417a25156bdadcaf45d1929ea4f (diff)
downloadreadline-incdec-ebce4b2272bcb8299d0ab4fa1524b6f4af9976c3.tar.bz2
incdec: Fix negative number handling when number is second of two
When the negative number is the last of two numbers, the first number would be incremented or decremented instead of the second one. Fix this by: * Removing the `\b` word boundaries in the search pattern. This caused the match start position to not include the hyphen that designates a negative number (instead starting at one after the hyphen). * Setting `$start_position` to the start position of the current match (`$-[0]`) on every match loop iteration. This ensures the start position is set to an appropriate index when the number we want to increment is the last one in the line. Since the condition in the loop depends on there being a previous match position, it wouldn't set the start position correctly in all cases for the last number in the line. * Remove the special case to handle the last number in the line when searching backward with the cursor in the last position. That case is now handled directly in the loop by always setting `$start_position`.
Diffstat (limited to 'incdec.pm')
-rw-r--r--incdec.pm19
1 files changed, 9 insertions, 10 deletions
diff --git a/incdec.pm b/incdec.pm
index 23bb545..364f000 100644
--- a/incdec.pm
+++ b/incdec.pm
@@ -12,15 +12,18 @@ sub incdec {
my $start_position = 0;
# my @match_ranges;
my $previous_match_start = 0;
- # my $previous_match_end = 0;
- while ($line =~ /\b(-?\d+)\b/g) {
+ my $previous_match_end = 0;
+ while ($line =~ /(-?\d+)/g) {
if ($is_backward) {
- # print "p[$point_position] -[$-[0]] +[$+[0]]\n";
- # print "p[$point_position] -[$previous_match_start] +[$previous_match_end]\n";
+ print "p[$point_position] -[$-[0]] +[$+[0]]\n";
+ print "p[$point_position] -[$previous_match_start] +[$previous_match_end]\n";
# print "last match: $^N\n";
- # print $previous_match_end - 1 . " <= $point_position < $-[0]\n";
+ print $previous_match_end - 1 . " <= $point_position < $-[0]\n";
# if ($previous_match_end - 1 <= $point_position
# && $point_position < $-[0]) {
+
+ # Try always setting $start_position and resetting it if there's another number?
+ $start_position = $-[0];
if ($point_position < $-[0]) {
# print "match at [$previous_match_start]";
$start_position = $previous_match_start;
@@ -29,7 +32,7 @@ sub incdec {
}
$previous_match_start = $-[0];
- # $previous_match_end = $+[0];
+ $previous_match_end = $+[0];
# my @range = ($-[0], $+[0]);
# push @match_ranges, \@range;
@@ -43,10 +46,6 @@ sub incdec {
}
}
- if ($is_backward && $point_position == length $line) {
- $start_position = $previous_match_start;
- }
-
pos($line) = $start_position;
$line =~ s/\G([^-\d]*)(-?\d+)/$1 . ($2 + $increment_by)/e;