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); | |
} |