tShow tabs with > symbols - ve - a minimal text editor (work in progress)
(HTM) git clone git://src.adamsgaard.dk/ve
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit ec3976286cbc8ff16cf02429d735951bb80a29d4
(DIR) parent d459a5c2e81581c2019aa6ef69c99bc08d8180f2
(HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
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(-)
---
(DIR) 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 {
(DIR) 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;
}
(DIR) 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], len);
+ ab_append(ab, &E.row[file_row].rchars[E.column_offset], len);
} else {
ab_append(ab, "~", 1);
}