tRecord and show if file is changed - ve - a minimal text editor (work in progr… | |
git clone git://src.adamsgaard.dk/ve | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 42a8291950dcb96ec855afa221e71e06c6ef8e88 | |
parent f0699261a58f3c5e8e5eaff0e85553d4b7475fde | |
Author: Anders Damsgaard <[email protected]> | |
Date: Tue, 6 Aug 2019 16:36:59 +0200 | |
Record and show if file is changed | |
Diffstat: | |
M byote.h | 1 + | |
M input.c | 13 +++++++++++++ | |
M io.c | 21 +++++++++++++++++---- | |
M output.c | 4 +++- | |
M row.c | 13 +++++++++++++ | |
M row.h | 1 + | |
M terminal.c | 1 + | |
7 files changed, 49 insertions(+), 5 deletions(-) | |
--- | |
diff --git a/byote.h b/byote.h | |
t@@ -30,6 +30,7 @@ struct editor_config { | |
int show_status; | |
char status_msg[80]; | |
time_t status_msg_time; | |
+ int file_changed; | |
}; | |
extern struct editor_config E; | |
diff --git a/input.c b/input.c | |
t@@ -3,6 +3,7 @@ | |
#include "byote.h" | |
#include "terminal.h" | |
#include "edit.h" | |
+#include "output.h" | |
#include "io.h" | |
#define CTRL_KEY(k) ((k) & 0x1f) | |
t@@ -65,6 +66,18 @@ editor_process_keypress() | |
break; | |
case CTRL_KEY('q'): | |
+ if (E.file_changed) { | |
+ editor_set_status_message("error: " | |
+ "file ha… | |
+ "Press C… | |
+ break; | |
+ } else { | |
+ write(STDOUT_FILENO, "\x1b[2J", 4); /*… | |
+ write(STDOUT_FILENO, "\x1b[H", 3); | |
+ exit(0); | |
+ break; | |
+ } | |
+ case CTRL_KEY('x'): | |
write(STDOUT_FILENO, "\x1b[2J", 4); /* clear s… | |
write(STDOUT_FILENO, "\x1b[H", 3); | |
exit(0); | |
diff --git a/io.c b/io.c | |
t@@ -9,6 +9,7 @@ | |
#include <string.h> | |
#include <fcntl.h> | |
#include <unistd.h> | |
+#include <errno.h> | |
#include "byote.h" | |
#include "terminal.h" | |
#include "row.h" | |
t@@ -39,6 +40,7 @@ file_open(char *filename) | |
} | |
free(line); | |
fclose(fp); | |
+ E.file_changed = 0; | |
} | |
/* convert rows to one long char array of length buflen */ | |
t@@ -76,10 +78,21 @@ file_save(char *filename) | |
} | |
buf = editor_concatenate_rows(&len); | |
+ | |
fd = open(filename, O_RDWR | O_CREAT, 0644); | |
- ftruncate(fd, len); | |
- write(fd, buf, len); | |
- close(fd); | |
+ if (fd != -1) { | |
+ if (ftruncate(fd, len) != -1) { | |
+ if (write(fd, buf, len) == len) { | |
+ close(fd); | |
+ free(buf); | |
+ E.file_changed = 0; | |
+ editor_set_status_message("%d bytes written to… | |
+ return; | |
+ } | |
+ } | |
+ close(fd); | |
+ } | |
free(buf); | |
- editor_set_status_message("%s written", filename); | |
+ editor_set_status_message("error: can't save! I/O error %s", | |
+ strerror(errno)); | |
} | |
diff --git a/output.c b/output.c | |
t@@ -66,7 +66,9 @@ editor_draw_status(struct abuf *ab) | |
} | |
left_status_len += snprintf(left_status + left_status_len, | |
sizeof(left_status), | |
- E.filename ? E.filename : "[unnamed] "); | |
+ "%.20s %s", | |
+ E.filename ? E.filename : "[unnamed]", | |
+ E.file_changed ? "[+] " : ""); | |
right_status_len = snprintf(right_status, sizeof(right_status), | |
"%d%% < %d:%d", | |
diff --git a/row.c b/row.c | |
t@@ -65,6 +65,7 @@ editor_append_row(char *s, size_t len) | |
editor_update_row(&E.row[i]); | |
++E.num_rows; | |
+ E.file_changed = 1; | |
} | |
/* insert character to row, making sure to allocate memory accordingly */ | |
t@@ -78,4 +79,16 @@ editor_row_insert_char(eRow *row, int i, int c) | |
row->size++; | |
row->chars[i] = c; | |
editor_update_row(row); | |
+ E.file_changed = 1; | |
+} | |
+ | |
+void | |
+editor_row_delete_char(eRow *row, int i) | |
+{ | |
+ if (i<0 || i>row->size) | |
+ return; | |
+ memmove(&row->chars[i], &row->chars[i+1], row->size-i); | |
+ row->size--; | |
+ editor_update_row(row); | |
+ E.file_changed = 1; | |
} | |
diff --git a/row.h b/row.h | |
t@@ -6,5 +6,6 @@ | |
int editor_row_cursor_x_to_rx(eRow *row, int cursor_x); | |
void editor_append_row(char *s, size_t len); | |
void editor_row_insert_char(eRow *row, int i, int c); | |
+void editor_row_delete_char(eRow *row, int i); | |
#endif | |
diff --git a/terminal.c b/terminal.c | |
t@@ -121,6 +121,7 @@ init_editor() { | |
E.status_msg[0] = '\0'; | |
E.status_msg_time = 0; | |
E.show_status = 0; | |
+ E.file_changed = 0; | |
if (get_window_size(&E.screen_rows, &E.screen_columns) == -1) | |
die("get_window_size"); |