diff options
| -rw-r--r-- | incdec | 70 |
1 files changed, 69 insertions, 1 deletions
@@ -34,7 +34,7 @@ function __readline_incdec_incdec2 { # perl # } -bind -x '"\C-xa+":incdec' +# 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+' @@ -49,6 +49,74 @@ bind -x '"\C-xasrp": __readline_incdec_save_readline_point' # 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 ' +sub incdec { + my ($line, $increment_by, $point_position, $is_backward) = @_; + + $point_position ||= 0; + $is_backward ||= 0; + + my $start_position = 0; + my $previous_match_start = 0; + while ($line =~ /(\d+)/g) { + if ($is_backward) { + if ($point_position < $-[0]) { + $start_position = $previous_match_start; + + last; + } + + $previous_match_start = $-[0]; + + } + else { + if ($point_position < $+[0]) { + $start_position = $-[0]; + + last; + } + } + } + + 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; + + return $line; +} + + # print "$line, ${\"increment-by\"}, ${\"point-position\"}, $backward"; + my $output = incdec($line, ${"increment-by"}, ${"point-position"}, $backward); + print $output; +' \ + -- \ + -line="$READLINE_LINE" \ + -increment-by="$increment_by" \ + -point-position="$READLINE_POINT" \ + -backward="$backward" + ) + + # echo "$line" + + READLINE_LINE="$line" +} + +function __readline_incdec_increment { + __readline_incdec 1 1 +} + +bind -x '"\C-xa+": __readline_incdec_increment' + # 2021.01.15: Idea: Maybe try using $EDITOR |
