diff options
author | Jakob Kaivo <jkk@x1-nano.kaivo.local> | 2023-04-01 22:46:34 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@x1-nano.kaivo.local> | 2023-04-01 22:46:34 -0400 |
commit | 23e9c66180b95e5b1ba03ae739c04ebefa183e05 (patch) | |
tree | 91dd9ac0d4270208b770bbc85766d5918c8e2d5a | |
parent | 73611cd92215d478a549a6c869450376efc26393 (diff) |
begin work on command history (need to fix so it doesn't clear screen)
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | shed.c | 14 | ||||
-rw-r--r-- | shed.h | 5 | ||||
-rw-r--r-- | shed_commands.c | 3 | ||||
-rw-r--r-- | shed_edit.c | 4 | ||||
-rw-r--r-- | shed_history.c | 18 | ||||
-rw-r--r-- | shed_non_vi.c | 10 |
7 files changed, 49 insertions, 9 deletions
@@ -13,7 +13,7 @@ SOURCES=alias.c bg.c builtins.c cd.c command.c fc.c fg.c getopts.c \ dot.c eval.c exec.c exit.c export.c readonly.c shift.c times.c trap.c \ unset.c \ interactive.c parse.c init.c getopt.c unspecified.c \ - shed.c shed_commands.c shed_edit.c shed_insert.c shed_io.c shed_move.c shed_non_vi.c + shed.c shed_commands.c shed_edit.c shed_history.o shed_insert.c shed_io.c shed_move.c shed_non_vi.c HEADERS=sh.h shed.h OBJECTS=alias.o bg.o builtins.o cd.o command.o fc.o fg.o getopts.o \ hash.o jobs.o kill.o newgrp.o pwd.o read.o set.o main.o type.o \ @@ -21,7 +21,7 @@ OBJECTS=alias.o bg.o builtins.o cd.o command.o fc.o fg.o getopts.o \ dot.o eval.o exec.o exit.o export.o readonly.o shift.o times.o trap.o \ unset.o \ interactive.o parse.o init.o getopt.o unspecified.o \ - shed.o shed_commands.o shed_edit.o shed_insert.o shed_io.o shed_move.o shed_non_vi.o \ + shed.o shed_commands.o shed_edit.o shed_history.o shed_insert.o shed_io.o shed_move.o shed_non_vi.o \ sh.tab.o sh.yy.o BUILTINS=alias bg cd command fc fg getopts jobs newgrp read \ ulimit umask unalias wait @@ -22,13 +22,23 @@ struct shed *shed(struct shed *e) if (e->cur == NULL) { e->cur = calloc(1, sizeof(*e->cur)); if (e->cur == NULL) { + /* FIXME */ return e; } e->handle = shed_handle_non_vi; + e->head = e->cur; + e->tail = e->cur; + } else { + e->tail->next = calloc(1, sizeof(*e->cur)); + if (e->tail->next == NULL) { + /* FIXME */ + return e; + } + e->tail->next->prev = e->tail; + e->tail = e->tail->next; + e->cur = e->tail; } - memset(e->cur, '\0', sizeof(*e->cur)); - struct termios original_tio; if (tcgetattr(STDIN_FILENO, &original_tio) != 0) { e->cur = NULL; @@ -36,6 +36,8 @@ enum { struct termios; struct buffer { + struct buffer *next; + struct buffer *prev; size_t len; size_t pos; ssize_t nread; @@ -75,6 +77,9 @@ int shed_replace(struct shed *e); int shed_start_over(struct shed *e); int shed_worderase(struct shed *e); +int shed_history_backward(struct shed *e); +int shed_history_forward(struct shed *e); + int shed_move_forward(struct shed *e); int shed_move_backward(struct shed *e); int shed_move_beginning(struct shed *e); diff --git a/shed_commands.c b/shed_commands.c index 0c2bdfc..adf31ab 100644 --- a/shed_commands.c +++ b/shed_commands.c @@ -108,7 +108,8 @@ int shed_execute(struct shed *e) { struct buffer *b = e->cur; b->pos = b->nread; - shed_insert_char(b, '\n'); + //shed_insert_char(b, '\n'); + write(STDOUT_FILENO, "\n", 1); if (e->handle == shed_handle_edit) { e->handle = shed_handle_insert; } diff --git a/shed_edit.c b/shed_edit.c index 44af225..b742414 100644 --- a/shed_edit.c +++ b/shed_edit.c @@ -69,10 +69,10 @@ int shed_handle_edit(struct shed *e, struct termios *t, char c) case 'U': // r = shed_bigundo(e); break; case 'k': /* FALLTHROUGH */ - case '-': // r = shed_history_back(e); break; + case '-': r = shed_history_backward(e); break; case 'j': /* FALLTHOUGH */ - case '+': // r = shed_history_forward(e); break; + case '+': r = shed_history_forward(e); break; case 'G': // r = shed_history_first(e); break; case '/': // r = shed_history_backsearch(e); break; diff --git a/shed_history.c b/shed_history.c new file mode 100644 index 0000000..076554c --- /dev/null +++ b/shed_history.c @@ -0,0 +1,18 @@ +#include <stddef.h> +#include "shed.h" + +int shed_history_forward(struct shed *e) +{ + if (e->cur->next != NULL) { + e->cur = e->cur->next; + } + return shed_redraw(e); +} + +int shed_history_backward(struct shed *e) +{ + if (e->cur->prev != NULL) { + e->cur = e->cur->prev; + } + return shed_redraw(e); +} diff --git a/shed_non_vi.c b/shed_non_vi.c index eda2cc6..b299122 100644 --- a/shed_non_vi.c +++ b/shed_non_vi.c @@ -47,6 +47,12 @@ int shed_handle_non_vi(struct shed *e, struct termios *t, char c) if (c == '\033') { char esc[2]; read(STDIN_FILENO, esc, 2); + if (esc[1] == 'A') { + return shed_history_backward(e); + } + if (esc[1] == 'B') { + return shed_history_forward(e); + } if (esc[1] == 'C') { return shed_move_forward(e); } @@ -75,9 +81,9 @@ int shed_handle_non_vi(struct shed *e, struct termios *t, char c) case CTRL_K: return shed_delete_toend(e); case CTRL_L: return shed_redraw(e); case CTRL_M: return shed_execute(e); - case CTRL_N: // return history_forward(e); + case CTRL_N: return shed_history_forward(e); case CTRL_O: // return ??? /* ??? */ - case CTRL_P: // return history_backward(e); + case CTRL_P: return shed_history_backward(e); case CTRL_Q: // /* TTY START */ case CTRL_R: // return history_backsearch(e); case CTRL_S: // /* TTY STOP */ |