aboutsummaryrefslogtreecommitdiffstats
path: root/pw.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-05-06 21:16:41 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-05-06 21:16:41 -0700
commitb11c4d66002e5338c6e210fb31a7e19eef649d21 (patch)
treecf2a91110789031e2cb12b126dd963032d5a4e12 /pw.c
parentbdb1bb5e9be601e096a5c83d4ba56e6cf7821360 (diff)
downloadpw-b11c4d66002e5338c6e210fb31a7e19eef649d21.tar.gz
pw-b11c4d66002e5338c6e210fb31a7e19eef649d21.tar.bz2
pw-b11c4d66002e5338c6e210fb31a7e19eef649d21.zip
Implement . (period) command for repeating commands.
Diffstat (limited to 'pw.c')
-rw-r--r--pw.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/pw.c b/pw.c
index 307863f..7ceb695 100644
--- a/pw.c
+++ b/pw.c
@@ -1036,7 +1036,7 @@ int main(int argc, char **argv)
for (int kbd_state = kbd_cmd, kbd_prev = kbd_cmd, lasttime = -1,
workbout = workmax, work = workbout, histpos = 0,
- cmdcount = INT_MAX;
+ cmdcount = INT_MAX, prevcmd = 0, prevcount = 0;
kbd_state != kbd_exit ;)
{
int force = 0, nfds = 2, pollms = poll_interval;
@@ -1419,6 +1419,13 @@ int main(int argc, char **argv)
pw.curcmd = pw.cmdbuf;
kbd_state = kbd_result;
break;
+ case '.':
+ if (prevcmd) {
+ ch = prevcmd;
+ cmdcount = prevcount;
+ goto fakecmd;
+ }
+ break;
case '0':
if (cmdcount == INT_MAX) {
pw.hpos = 0;
@@ -1431,10 +1438,19 @@ int main(int argc, char **argv)
if (cmdcount == INT_MAX)
cmdcount = 0;
cmdcount = (cmdcount * 10 + (ch - '0')) % 1000;
+ break;
}
+ ch = 0;
+ break;
+ }
+ if (!isdigit(ch)) {
+ if (ch && ch != '.') {
+ prevcmd = ch;
+ prevcount = cmdcount;
+ }
+ if (kbd_state == kbd_cmd)
+ cmdcount = INT_MAX;
}
- if (kbd_state == kbd_cmd && !isdigit(ch))
- cmdcount = INT_MAX;
break;
case kbd_esc:
if (ch == '[') {
@@ -1558,6 +1574,7 @@ int main(int argc, char **argv)
kbd_state = kbd_cmd;
pw.curcmd = 0;
cmdcount = INT_MAX;
+ prevcmd = 0;
break;
case BS: case DEL:
{