tAllow saving of file to disk - ve - a minimal text editor (work in progress) | |
git clone git://src.adamsgaard.dk/ve | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit f0699261a58f3c5e8e5eaff0e85553d4b7475fde | |
parent d5fa4d87e9cc60c1d421b57b507e53690f5a0c8d | |
Author: Anders Damsgaard <[email protected]> | |
Date: Tue, 6 Aug 2019 16:09:03 +0200 | |
Allow saving of file to disk | |
Diffstat: | |
M input.c | 20 +++++++++++++++++++- | |
M io.c | 46 +++++++++++++++++++++++++++++… | |
M io.h | 1 + | |
3 files changed, 66 insertions(+), 1 deletion(-) | |
--- | |
diff --git a/input.c b/input.c | |
t@@ -3,6 +3,7 @@ | |
#include "byote.h" | |
#include "terminal.h" | |
#include "edit.h" | |
+#include "io.h" | |
#define CTRL_KEY(k) ((k) & 0x1f) | |
t@@ -75,6 +76,10 @@ editor_process_keypress() | |
editor_move_cursor(c); | |
break; | |
+ case CTRL_KEY('w'): | |
+ file_save(E.filename); | |
+ break; | |
+ | |
case CTRL_KEY('f'): | |
i = E.screen_rows; | |
while (i--) | |
t@@ -125,9 +130,22 @@ editor_process_keypress() | |
} else if (E.mode == 1) { /* insert mode */ | |
switch (c) { | |
case CTRL_KEY('c'): | |
- case 27: /* escape */ | |
+ case '\x1b': /* escape */ | |
E.mode = 0; | |
break; | |
+ | |
+ case CTRL_KEY('\r'): /* enter */ | |
+ /* TODO */ | |
+ break; | |
+ | |
+ case 127: /* backspace */ | |
+ case CTRL_KEY('h'): | |
+ /* TODO */ | |
+ break; | |
+ | |
+ case CTRL_KEY('l'): | |
+ break; | |
+ | |
default: | |
editor_insert_char(c); | |
break; | |
diff --git a/io.c b/io.c | |
t@@ -7,9 +7,12 @@ | |
#include <stdio.h> | |
#include <sys/types.h> | |
#include <string.h> | |
+#include <fcntl.h> | |
+#include <unistd.h> | |
#include "byote.h" | |
#include "terminal.h" | |
#include "row.h" | |
+#include "output.h" | |
void | |
file_open(char *filename) | |
t@@ -37,3 +40,46 @@ file_open(char *filename) | |
free(line); | |
fclose(fp); | |
} | |
+ | |
+/* convert rows to one long char array of length buflen */ | |
+char* | |
+editor_concatenate_rows(int *buflen) | |
+{ | |
+ int totlen, j; | |
+ char *buf, *p; | |
+ | |
+ totlen = 0; | |
+ for (j=0; j<E.num_rows; ++j) | |
+ totlen += E.row[j].size + 1; /* add space for newline char */ | |
+ *buflen = totlen; | |
+ | |
+ buf = malloc(totlen); | |
+ p = buf; | |
+ for (j=0; j<E.num_rows; ++j) { | |
+ memcpy(p, E.row[j].chars, E.row[j].size); | |
+ p += E.row[j].size; | |
+ *p = '\n'; | |
+ p++; | |
+ } | |
+ return buf; | |
+} | |
+ | |
+void | |
+file_save(char *filename) | |
+{ | |
+ int len, fd; | |
+ char *buf; | |
+ | |
+ if (filename == NULL) { | |
+ editor_set_status_message("error: no filename specified"); | |
+ return; | |
+ } | |
+ | |
+ buf = editor_concatenate_rows(&len); | |
+ fd = open(filename, O_RDWR | O_CREAT, 0644); | |
+ ftruncate(fd, len); | |
+ write(fd, buf, len); | |
+ close(fd); | |
+ free(buf); | |
+ editor_set_status_message("%s written", filename); | |
+} | |
diff --git a/io.h b/io.h | |
t@@ -2,5 +2,6 @@ | |
#define IO_H_ | |
void file_open(char *filename); | |
+void file_save(char *filename); | |
#endif |