diff options
| -rw-r--r-- | Makefile | 3 | ||||
| -rw-r--r-- | incdec | 28 | ||||
| -rw-r--r-- | incdec.m4 | 110 |
3 files changed, 123 insertions, 18 deletions
@@ -7,3 +7,6 @@ incdec.pl: incdec.pl.m4 incdec.pm sed -n '/sub incdec {/,/^}/p' incdec.pm > incdec.sub.pl m4 $< > $@ rm incdec.sub.pl + +incdec: incdec.m4 incdec.pl + m4 $< > $@ @@ -57,6 +57,9 @@ function __readline_incdec { # print "$line, ${"increment-by"}, ${"point-position"}, $backward"; line=$(perl -s -e ' +use strict; +use warnings; + sub incdec { my ($line, $increment_by, $point_position, $is_backward) = @_; @@ -64,33 +67,23 @@ sub incdec { $is_backward ||= 0; my $start_position = 0; - # my @match_ranges; my $previous_match_start = 0; - # 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 "last match: $^N\n"; - # print $previous_match_end - 1 . " <= $point_position < $-[0]\n"; - # if ($previous_match_end - 1 <= $point_position - # && $point_position < $-[0]) { - - # TODO: document, last number handline + # Set start position to the current match start. This gives us the + # correct start position when incrementing the last number in a + # line. $start_position = $-[0]; + # If point is not at the end, set start position to the number + # closest to the point position. if ($point_position < $-[0]) { - # print "match at [$previous_match_start]"; $start_position = $previous_match_start; last; } $previous_match_start = $-[0]; - # $previous_match_end = $+[0]; - - # my @range = ($-[0], $+[0]); - # push @match_ranges, \@range; } else { if ($point_position < $+[0]) { @@ -107,9 +100,8 @@ sub incdec { return $line; } - # print "$line, ${\"increment-by\"}, ${\"point-position\"}, $backward"; - my $output = incdec($line, $increment_by, $point_position, $backward); - print $output; +my $output = incdec($line, $increment_by, $point_position, $backward); +print $output; ' \ -- \ -line="$READLINE_LINE" \ diff --git a/incdec.m4 b/incdec.m4 new file mode 100644 index 0000000..0398a56 --- /dev/null +++ b/incdec.m4 @@ -0,0 +1,110 @@ +function incdec { + local EX_DATAERR=65 + + # Portion of the line from point to the end of the line. + local line_part="${READLINE_LINE:$READLINE_POINT}" + + # Number to increment. + local number= + + # If the line part doesn't contain a number, exit. + # if ! [[ "$line_part" =~ [^0-9]*([0-9]+)[^0-9]* ]]; then + # return $EX_DATAERR + # fi + + number=${BASH_REMATCH[1]} + + # echo "${READLINE_LINE}" + # echo "${BASH_REMATCH[0]}" + # echo "$(($number + 1))" + + incremented_line="$(echo "$line_part" | perl -pe 's/(\d+)/$1+1/e')" + + # echo "${READLINE_LINE:0:$READLINE_POINT}$incremented_line" + READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$incremented_line" + # echo 'this is a test' +} + +function __readline_incdec_incdec2 { + # echo "!!" + echo !# +} + +# function __readline_incdec_perl { +# perl +# } + +# bind -x '"\C-xa+":incdec' +# bind '"\C-xa+": "\C-e$(incdec)\e\C-e"' +# bind '"\C-xa+": "\C-e`incdec`"' +# bind '"\C-xaa":\C-xa+' + +function __readline_incdec_save_readline_point { + __readline_incdec_readline_point="$READLINE_POINT" +} + +bind -x '"\C-xasrp": __readline_incdec_save_readline_point' + +# bind '"\C-xaa": \C-xasrp\C-c$(__readline_incdec_incdec2)\e\C-e' +# bind '"\C-xaa": \C-xasrp' +# bind '"\C-xaa": __readline_incdec_incdec2' + +function __readline_incdec { + local increment_by="$1" + local backward="$2" + + # local incdec = + # print "$line, ${"increment-by"}, ${"point-position"}, $backward"; + + line=$(perl -s -e ' +include(`incdec.pl')dnl +' \ + -- \ + -line="$READLINE_LINE" \ + -increment_by="$increment_by" \ + -point_position="$READLINE_POINT" \ + -backward="$backward" + ) + + # echo "$line" + + READLINE_LINE="$line" + + # TODO: If point was at the end, put it at the end again. The length of he line may have changed. + + # TODO 2021.08.22: If new READLINE_LINE is longer, move point to the right. If shorter, move it to the left. +} + +function __readline_incdec_increment { + local old_line_length="${#READLINE_LINE}" + + __readline_incdec 1 1 + + local new_line_length="${#READLINE_LINE}" + + if [ "$old_line_length" -gt "$new_line_length" ]; then + READLINE_POINT="$(($READLINE_POINT - 1))" + fi +} + +function __readline_incdec_decrement { + local old_line_length="${#READLINE_LINE}" + + __readline_incdec -1 1 + + local new_line_length="${#READLINE_LINE}" + + if [ "$old_line_length" -lt "$new_line_length" ]; then + READLINE_POINT="$(($READLINE_POINT + 1))" + # elif [ "$old_line_length" -gt "$new_line_length" ]; then + # READLINE_POINT="$(($READLINE_POINT - 1))" + fi +} + +bind -x '"\C-x-": __readline_incdec_decrement' +bind -x '"\C-x+": __readline_incdec_increment' + + +# 2021.01.15: Idea: Maybe try using $EDITOR + +# 2021.08.20: Idea: If point is at start, use forward matching, if point is at end, use backward matching |
