diff options
| author | Teddy Wing | 2021-08-29 00:28:31 +0200 |
|---|---|---|
| committer | Teddy Wing | 2021-08-29 00:47:56 +0200 |
| commit | e56b8c2e88c8c5444f66634dbe3c511a5f37a3d6 (patch) | |
| tree | 01e0429e37fc6552877b26a1bb19a53ca2025245 /incdec.bash | |
| parent | 9be99793b2d7eb4cc28db4cfc615325055d3853f (diff) | |
| download | readline-incdec-e56b8c2e88c8c5444f66634dbe3c511a5f37a3d6.tar.bz2 | |
incdec.pm: Always return start position when backwards is on
Previously, if backwards was on and point was before the first number on
the line, the start position would be set to 0 (when it gets set to
`$previous_match_start`). This means the start position wouldn't get set
to the actual start position of the first number.
We want the actual start position of that number so we can move point
only if it's on or after the current number when changing between
negative and positive numbers.
Also, the `\G` pattern didn't work on some of the `sed` tests because it
matches a number at that position. Since the position wasn't one that
was followed by the number, the regex didn't match a number, and the
increment didn't happen. We can get rid of the special handling for
start position at 0 now.
Diffstat (limited to 'incdec.bash')
| -rw-r--r-- | incdec.bash | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/incdec.bash b/incdec.bash index 7144282..0b8eae3 100644 --- a/incdec.bash +++ b/incdec.bash @@ -31,7 +31,9 @@ sub incdec { $is_backward ||= 0; my $start_position = 0; + # my $previous_match_start = $point_position; my $previous_match_start = 0; + my $i = 0; while ($line =~ /(-?\d+)/g) { if ($is_backward) { # Set start position to the current match start. This gives us the @@ -39,6 +41,12 @@ sub incdec { # line. $start_position = $-[0]; + # Keep the start position of the first number if point is before + # the first number. + if ($i == 0 && $point_position < $-[0]) { + last; + } + # If point is not at the end, set start position to the number # closest to the point position. if ($point_position < $-[0]) { @@ -48,6 +56,7 @@ sub incdec { } $previous_match_start = $-[0]; + $i++; } else { if ($point_position < $+[0]) { @@ -59,13 +68,13 @@ sub incdec { } # Using `\G` when `pos` is 0 seems to cause occasional missed substitutions. - if ($start_position > 0) { + # if ($start_position > 0) { pos($line) = $start_position; $line =~ s/\G(-?\d+)/$1 + $increment_by/e; - } - else { - $line =~ s/(-?\d+)/$1 + $increment_by/e; - } + # } + # else { + # $line =~ s/(-?\d+)/$1 + $increment_by/e; + # } return ($line, $start_position); } |
