Finish the editor features

This commit is contained in:
Aaron Fischer 2018-10-08 15:34:52 +02:00
parent 798f5895a0
commit ba3fc967be

44
kilo.c
View file

@ -69,6 +69,8 @@ struct editorConfig E;
/*** prototypes ***/ /*** prototypes ***/
void editorSetStatusMessage(const char *fmt, ...); void editorSetStatusMessage(const char *fmt, ...);
void editorRefreshScreen();
char *editorPrompt(char *prompt);
/*** terminal ***/ /*** terminal ***/
@ -370,7 +372,13 @@ void editorOpen(char *filename) {
} }
void editorSave() { void editorSave() {
if (E.filename == NULL) return; if (E.filename == NULL) {
E.filename = editorPrompt("Save as: %s (ESC to cancel)");
if (E.filename == NULL) {
editorSetStatusMessage("Save aborted");
return;
}
}
int len; int len;
char *buf = editorRowsToString(&len); char *buf = editorRowsToString(&len);
@ -531,6 +539,40 @@ void editorSetStatusMessage(const char *fmt, ...) {
/*** input ***/ /*** input ***/
char *editorPrompt(char *prompt) {
size_t bufsize = 128;
char *buf = malloc(bufsize);
size_t buflen = 0;
buf[0] = '\0';
while (1) {
editorSetStatusMessage(prompt, buf);
editorRefreshScreen();
int c = editorReadKey();
if (c == DEL_KEY || c == CTRL_KEY('h') || c == BACKSPACE) {
if (buflen != 0) buf[--buflen] = '\0';
} else if (c == '\x1b') {
editorSetStatusMessage("");
free(buf);
return NULL;
} else if (c == '\r') {
if (buflen != 0) {
editorSetStatusMessage("");
return buf;
}
} else if (!iscntrl(c) && c < 128) {
if (buflen == bufsize -1) {
bufsize *= 2;
buf = realloc(buf, bufsize);
}
buf[buflen++] = c;
buf[buflen] = '\0';
}
}
}
void editorMoveCursor(int key) { void editorMoveCursor(int key) {
erow *row = (E.cy >= E.numrows) ? NULL : &E.row[E.cy]; erow *row = (E.cy >= E.numrows) ? NULL : &E.row[E.cy];