diff --git a/ke/Makefile b/ke/Makefile index cb2b2f5..618b16a 100644 --- a/ke/Makefile +++ b/ke/Makefile @@ -2,10 +2,10 @@ BIN := ke OBJS := abuf.o erow.o main.o LDFLAGS := -CFLAGS := -pedantic -Wall -Werror -Wextra -O0 -std=c99 -g +CFLAGS := -pedantic -Wall -Werror -Wextra -O2 -std=c99 -g -fno-builtin-memmove .PHONY: all -all: build +all: build install .PHONY: build build: $(BIN) @@ -27,6 +27,6 @@ keypress: keypress.c .PHONY: install install: $(BIN) - cp $(BIN) $(HOME)/bin/ + install -C $(BIN) $(HOME)/bin/ %.o: %.c diff --git a/ke/erow.c b/ke/erow.c index 4cc495e..b52f624 100644 --- a/ke/erow.c +++ b/ke/erow.c @@ -92,7 +92,9 @@ erow_update(struct erow *row) } } - free(row->render); + if (row->rsize) { + free(row->render); + } row->render = NULL; row->render = malloc(row->size + (tabs * (TAB_STOP-1)) + (ctrl * 3) + 1); assert(row->render != NULL); diff --git a/ke/main.c b/ke/main.c index 59c4c62..8e555dc 100644 --- a/ke/main.c +++ b/ke/main.c @@ -21,7 +21,7 @@ #include "defs.h" -#define KE_VERSION "0.9.0" +#define KE_VERSION "0.9.1" #define ESCSEQ "\x1b[" #define CTRL_KEY(key) ((key)&0x1f) #define TAB_STOP 8 @@ -118,8 +118,8 @@ goto_line() return; } - editor->cury = lineno; - editor->rowoffs = editor->nrows; + editor->cury = lineno - 1; + editor->rowoffs = editor->cury - (editor->rows / 2); } @@ -207,7 +207,7 @@ deletech() { struct erow *row = NULL; - if (editor->cury == editor->nrows) { + if (editor->cury >= editor->nrows) { return; } @@ -245,7 +245,7 @@ open_file(const char *filename) editor->dirty = 0; if ((fp = fopen(filename, "r")) == NULL) { if (errno == ENOENT) { - printf("no such file"); + editor_set_status("[new file]"); return; } die("fopen"); @@ -311,6 +311,11 @@ save_file() int status = 1; /* will be used as exit code */ char *buf; + if (!editor->dirty) { + editor_set_status("No changes to save."); + return 0; + } + if (editor->filename == NULL) { editor->filename = editor_prompt("Filename: %s", NULL); if (editor->filename == NULL) { @@ -341,7 +346,10 @@ save_file() save_exit: if (fd) close(fd); - if (buf) free(buf); + if (buf) { + free(buf); + buf = NULL; + } if (status != 0) { buf = strerror(errno); @@ -650,6 +658,9 @@ move_cursor(int16_t c) break; case END_KEY: case CTRL_KEY('e'): + if (editor->nrows == 0) { + break; + } editor->curx = editor->row[editor->cury].size; break; default: @@ -712,6 +723,7 @@ process_kcommand(int16_t c) process_normal(DEL_KEY); } break; + case 'g': case CTRL_KEY('g'): goto_line(); break; @@ -916,6 +928,7 @@ draw_rows(struct abuf *ab) ab_append(ab, "|", 1); } } else { + erow_update(&editor->row[filerow]); buflen = editor->row[filerow].rsize - editor->coloffs; if (buflen < 0) { buflen = 0; @@ -941,7 +954,8 @@ draw_status_bar(struct abuf *ab) int len, rlen; len = snprintf(status, sizeof(status), "%c%cke: %.20s - %d lines", - editor->dirty ? '!' : '-', editor->dirty ? '!' : '-', + editor->mode == MODE_KCOMMAND ? 'K' : 'N', + editor->dirty ? '!' : '-', editor->filename ? editor->filename : "[no file]", editor->nrows); rlen = snprintf(rstatus, sizeof(rstatus), "L%d/%d C%d", @@ -1049,11 +1063,9 @@ editor_set_status(const char *fmt, ...) void loop() { - int up = 1; - while (1) { - if (up) display_refresh(); - up = process_keypress(); + display_refresh(); + while (process_keypress() != 0) ; } } diff --git a/kte/defs.h b/kte/defs.h index 3eccc6f..79119cb 100644 --- a/kte/defs.h +++ b/kte/defs.h @@ -40,6 +40,7 @@ static struct { /* terminal.c */ +void nextline(); /* TODO: destroy this */ void terminal_refresh(); void terminal_init(); void terminal_deinit(); @@ -49,5 +50,8 @@ int terminal_getch(); /* input.c */ int handle_keypress(int c); +/* file_buffer.c */ +void init_buffer(struct buffer *buf) + #endif /* KTE_DEFS_H */ diff --git a/kte/file_buffer.c b/kte/file_buffer.c new file mode 100644 index 0000000..b53a6a1 --- /dev/null +++ b/kte/file_buffer.c @@ -0,0 +1,10 @@ +#include "defs.h" + + +void +init_buffer(struct buffer *buf) +{ + /* put the cursor at the top of the file */ + buf->curx = 0; + buf->cury = 0; +} diff --git a/kte/input.c b/kte/input.c index 9be10a4..fdde00c 100644 --- a/kte/input.c +++ b/kte/input.c @@ -17,7 +17,8 @@ handle_keypress(int c) static int mode = MODE_NORMAL; if (mode == MODE_NORMAL) { - printf("%02x\t", c); + printf("%02x", c); + nextline(); } return 1; diff --git a/kte/main.c b/kte/main.c index ff42766..b77bafe 100644 --- a/kte/main.c +++ b/kte/main.c @@ -11,11 +11,9 @@ #include "defs.h" -void -deinit() -{ - endwin(); -} +struct buffer *buffers; +int nbufs; +int cbuf; /* current buffer */ int @@ -23,6 +21,10 @@ main() { int c, up = 1; + buffers = calloc(1, sizeof(struct buffer)); + nbufs = 1; + cbuf = 0; + terminal_init(); terminal_message("welcome to KTE", 14); terminal_refresh(); diff --git a/kte/terminal.c b/kte/terminal.c index b5ac37c..6b91293 100644 --- a/kte/terminal.c +++ b/kte/terminal.c @@ -5,6 +5,18 @@ #include "defs.h" + */ +static int cury = 0; + +void +nextline() +{ + printf("\t%d", cury); + wrefresh(editor.main); + cury++; +} + + void terminal_refresh() { @@ -14,6 +26,11 @@ terminal_refresh() if ((time(NULL) - editor.msgtm) > KTE_MSG_TIME) { wrefresh(editor.message); } + + wmove(editor.main, cury, 0); + if (cury > LINES-3) { + cury = 0; + } }