Finish the editor features
This commit is contained in:
parent
798f5895a0
commit
ba3fc967be
1 changed files with 43 additions and 1 deletions
44
kilo.c
44
kilo.c
|
@ -69,6 +69,8 @@ struct editorConfig E;
|
|||
/*** prototypes ***/
|
||||
|
||||
void editorSetStatusMessage(const char *fmt, ...);
|
||||
void editorRefreshScreen();
|
||||
char *editorPrompt(char *prompt);
|
||||
|
||||
/*** terminal ***/
|
||||
|
||||
|
@ -370,7 +372,13 @@ void editorOpen(char *filename) {
|
|||
}
|
||||
|
||||
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;
|
||||
char *buf = editorRowsToString(&len);
|
||||
|
@ -531,6 +539,40 @@ void editorSetStatusMessage(const char *fmt, ...) {
|
|||
|
||||
/*** 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) {
|
||||
erow *row = (E.cy >= E.numrows) ? NULL : &E.row[E.cy];
|
||||
|
||||
|
|
Loading…
Reference in a new issue