Make the editor insert text!

This commit is contained in:
Aaron Fischer 2018-10-05 11:29:30 +02:00
parent 7e76609326
commit 66b97546e2

44
kilo.c
View file

@ -24,6 +24,7 @@
#define CTRL_KEY(k) ((k) & 0x1f) #define CTRL_KEY(k) ((k) & 0x1f)
enum editorKey { enum editorKey {
BACKSPACE = 127,
ARROW_LEFT = 1000, ARROW_LEFT = 1000,
ARROW_RIGHT, ARROW_RIGHT,
ARROW_UP, ARROW_UP,
@ -201,13 +202,13 @@ void editorUpdateRow(erow *row) {
} }
free(row->render); free(row->render);
row->render = malloc(row->size + tabs*(KILO_TAB_STOP-1) + 1); row->render = malloc(row->size + tabs*(KILO_TAB_STOP - 1) + 1);
int idx = 0; int idx = 0;
for (j=0; j<row->size; j++) { for (j=0; j<row->size; j++) {
if (row->chars[j] == '\t') { if (row->chars[j] == '\t') {
row->render[idx++] = ' '; row->render[idx++] = ' ';
while (idx%KILO_TAB_STOP != 0) row->render[idx++] = ' '; while (idx % KILO_TAB_STOP != 0) row->render[idx++] = ' ';
} else { } else {
row->render[idx++] = row->chars[j]; row->render[idx++] = row->chars[j];
} }
@ -232,6 +233,26 @@ void editorAppendRow(char *s, size_t len) {
E.numrows++; E.numrows++;
} }
void editorRowInsertChar(erow *row, int at, int c) {
if (at < 0 || at > row->size) at = row->size;
row->chars = realloc(row->chars, row->size + 2);
memmove(&row->chars[at + 1], &row->chars[at], row->size - at + 1);
row->size++;
row->chars[at] = c;
editorUpdateRow(row);
}
/*** editor operations ***/
void editorInsertChar(int c) {
if (E.cy == E.numrows) {
editorAppendRow("", 0);
}
editorRowInsertChar(&E.row[E.cy], E.cx, c);
E.cx++;
}
/*** file i/o ***/ /*** file i/o ***/
void editorOpen(char *filename) { void editorOpen(char *filename) {
@ -277,7 +298,7 @@ void abFree(struct abuf *ab) {
/*** output ***/ /*** output ***/
void editorScroll() { void editorScroll() {
E.rx = E.cx; E.rx = 0;
if (E.cy < E.numrows) { if (E.cy < E.numrows) {
E.rx = editorRowCxToRx(&E.row[E.cy], E.cx); E.rx = editorRowCxToRx(&E.row[E.cy], E.cx);
} }
@ -435,6 +456,10 @@ void editorProcessKeypress() {
int c = editorReadKey(); // Blocking! int c = editorReadKey(); // Blocking!
switch (c) { switch (c) {
case '\r':
/* TODO */
break;
case CTRL_KEY('q'): case CTRL_KEY('q'):
write(STDOUT_FILENO, "\x1b[2J", 4); write(STDOUT_FILENO, "\x1b[2J", 4);
write(STDOUT_FILENO, "\x1b[H", 3); write(STDOUT_FILENO, "\x1b[H", 3);
@ -451,6 +476,12 @@ void editorProcessKeypress() {
} }
break; break;
case BACKSPACE:
case CTRL_KEY('h'):
case DEL_KEY:
/* TODO */
break;
case PAGE_UP: case PAGE_UP:
case PAGE_DOWN: case PAGE_DOWN:
{ {
@ -472,6 +503,13 @@ void editorProcessKeypress() {
editorMoveCursor(c); editorMoveCursor(c);
break; break;
case CTRL_KEY('l'):
case '\x1b':
break;
default:
editorInsertChar(c);
break;
} }
} }