| tShow tabs with > symbols - ve - a minimal text editor (work in progress) | |
| git clone git://src.adamsgaard.dk/ve | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit ec3976286cbc8ff16cf02429d735951bb80a29d4 | |
| parent d459a5c2e81581c2019aa6ef69c99bc08d8180f2 | |
| Author: Anders Damsgaard <[email protected]> | |
| Date: Tue, 6 Aug 2019 13:46:18 +0200 | |
| Show tabs with > symbols | |
| Diffstat: | |
| M byote.h | 8 ++++++-- | |
| M io.c | 40 +++++++++++++++++++++++++++++… | |
| M output.c | 4 ++-- | |
| 3 files changed, 47 insertions(+), 5 deletions(-) | |
| --- | |
| diff --git a/byote.h b/byote.h | |
| t@@ -6,10 +6,14 @@ | |
| #define PROGNAME "byote" | |
| #define VERSION "0.0.1" | |
| +#define TAB_WIDTH 4 | |
| + | |
| /* editor row: stores a row of text */ | |
| typedef struct eRow { | |
| - int size; | |
| - char *chars; | |
| + char *chars; /* text read from file */ | |
| + char *rchars; /* text to render */ | |
| + int size; /* length of chars */ | |
| + int rsize; /* length of rchars */ | |
| } eRow; | |
| struct editor_config { | |
| diff --git a/io.c b/io.c | |
| t@@ -10,7 +10,40 @@ | |
| #include "byote.h" | |
| #include "terminal.h" | |
| -void editor_append_row(char *s, size_t len) | |
| +/* translate tabs before display */ | |
| +void | |
| +editor_update_row(eRow* row) | |
| +{ | |
| + int j, idx, tabs; | |
| + | |
| + free(row->rchars); | |
| + row->rchars = malloc(row->size + 1); | |
| + | |
| + tabs = 0; | |
| + for (j=0; j<row->size; ++j) | |
| + if (row->chars[j] == '\t') | |
| + tabs++; | |
| + | |
| + free(row->rchars); | |
| + row->rchars = malloc(row->size + tabs*(TAB_WIDTH - 1) + 1); | |
| + | |
| + idx = 0; | |
| + for (j=0; j<row->size; ++j) { | |
| + if (row->chars[j] == '\t') { | |
| + row->rchars[idx++] = '>'; | |
| + while (idx % TAB_WIDTH != 0) | |
| + row->rchars[idx++] = ' '; | |
| + } else { | |
| + row->rchars[idx++] = row->chars[j]; | |
| + } | |
| + } | |
| + row->rchars[idx] = '\0'; | |
| + row->rsize = idx; | |
| +} | |
| + | |
| +/* add row to buffer */ | |
| +void | |
| +editor_append_row(char *s, size_t len) | |
| { | |
| int i; | |
| t@@ -20,6 +53,11 @@ void editor_append_row(char *s, size_t len) | |
| E.row[i].chars = malloc(len + 1); | |
| memcpy(E.row[i].chars, s, len); | |
| E.row[i].chars[len] = '\0'; | |
| + | |
| + E.row[i].rsize = 0; | |
| + E.row[i].rchars = NULL; | |
| + editor_update_row(&E.row[i]); | |
| + | |
| ++E.num_rows; | |
| } | |
| diff --git a/output.c b/output.c | |
| t@@ -94,12 +94,12 @@ editor_draw_rows(struct abuf *ab) | |
| if (y == E.screen_rows-1) { | |
| draw_status(ab); | |
| } else if (file_row < E.num_rows) { | |
| - len = E.row[file_row].size - E.column_offset; | |
| + len = E.row[file_row].rsize - E.column_offset; | |
| if (len < 0) | |
| len = 0; | |
| if (len > E.screen_columns) | |
| len = E.screen_columns; | |
| - ab_append(ab, &E.row[file_row].chars[E.column_offset],… | |
| + ab_append(ab, &E.row[file_row].rchars[E.column_offset]… | |
| } else { | |
| ab_append(ab, "~", 1); | |
| } |