summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--shed.c14
-rw-r--r--shed.h5
-rw-r--r--shed_commands.c3
-rw-r--r--shed_edit.c4
-rw-r--r--shed_history.c18
-rw-r--r--shed_non_vi.c10
7 files changed, 49 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index 25faeb3..d7e3084 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/shed.c b/shed.c
index c010cb1..2cf1b54 100644
--- a/shed.c
+++ b/shed.c
@@ -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;
diff --git a/shed.h b/shed.h
index fac00c4..ce288f6 100644
--- a/shed.h
+++ b/shed.h
@@ -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 */