syntax
This commit is contained in:
parent
510faabc16
commit
f03f084d72
98
tted.c
98
tted.c
|
@ -19,7 +19,7 @@
|
||||||
/** defines */
|
/** defines */
|
||||||
#define TTED_VERSION "0.0.1"
|
#define TTED_VERSION "0.0.1"
|
||||||
#define TTED_TAB_STOP 8
|
#define TTED_TAB_STOP 8
|
||||||
#define TTED_QUIT_TIMES 3
|
#define TTED_QUIT_TIMES 1
|
||||||
#define CTRL_KEY(k) ((k) & 0x1f)
|
#define CTRL_KEY(k) ((k) & 0x1f)
|
||||||
|
|
||||||
enum editorKey {
|
enum editorKey {
|
||||||
|
@ -35,13 +35,28 @@ enum editorKey {
|
||||||
PAGE_DOWN
|
PAGE_DOWN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum editorHighlight {
|
||||||
|
HL_NORMAL = 0,
|
||||||
|
HL_NUMBER,
|
||||||
|
HL_MATCH
|
||||||
|
};
|
||||||
|
|
||||||
|
#define HL_HIGHLIGHT_NUMBERS (1<<0)
|
||||||
|
|
||||||
|
|
||||||
/** data */
|
/** data */
|
||||||
|
struct editorSyntax {
|
||||||
|
char *filetype;
|
||||||
|
char **filematch;
|
||||||
|
int flags;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct erow {
|
typedef struct erow {
|
||||||
int size;
|
int size;
|
||||||
int rsize;
|
int rsize;
|
||||||
char *chars;
|
char *chars;
|
||||||
char *render;
|
char *render;
|
||||||
|
unsigned char *hl;
|
||||||
} erow;
|
} erow;
|
||||||
|
|
||||||
struct editorConfig {
|
struct editorConfig {
|
||||||
|
@ -186,6 +201,45 @@ int getWindowSize(int *rows, int *cols) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** syntax highlighting */
|
||||||
|
|
||||||
|
int is_separator(int c){
|
||||||
|
return isspace(c) || c == '\0' || strchr(",.()+-/*=~%<>[];\"", c) != NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void editorUpdateSyntax(erow *row){
|
||||||
|
row->hl = realloc(row->hl, row->rsize);
|
||||||
|
memset(row->hl, HL_NORMAL, row->rsize);
|
||||||
|
|
||||||
|
int prev_sep = 1;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while(i < row->rsize){
|
||||||
|
char c = row->render[i];
|
||||||
|
unsigned char prev_hl = (i>0) ? row->hl[i-1] : HL_NORMAL;
|
||||||
|
|
||||||
|
if ((isdigit(c) && (prev_sep || prev_hl == HL_NUMBER))||
|
||||||
|
(c == '.' && prev_hl == HL_NUMBER)){
|
||||||
|
row->hl[i] = HL_NUMBER;
|
||||||
|
i++;
|
||||||
|
prev_sep = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_sep = is_separator(c);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int editorSyntaxToColor(int hl){
|
||||||
|
switch(hl){
|
||||||
|
case HL_NUMBER: return 31;
|
||||||
|
case HL_MATCH: return 34;
|
||||||
|
default: return 37;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** row operations */
|
/** row operations */
|
||||||
int editorRowCxToRx(erow *row, int cx) {
|
int editorRowCxToRx(erow *row, int cx) {
|
||||||
int rx = 0;
|
int rx = 0;
|
||||||
|
@ -235,6 +289,8 @@ void editorUpdateRow(erow *row) {
|
||||||
}
|
}
|
||||||
row->render[idx] = '\0';
|
row->render[idx] = '\0';
|
||||||
row->rsize = idx;
|
row->rsize = idx;
|
||||||
|
|
||||||
|
editorUpdateSyntax(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -249,6 +305,7 @@ void editorInsertRow(int at, char *s, size_t len) {
|
||||||
E.row[at].chars[len] = '\0';
|
E.row[at].chars[len] = '\0';
|
||||||
E.row[at].rsize = 0;
|
E.row[at].rsize = 0;
|
||||||
E.row[at].render = NULL;
|
E.row[at].render = NULL;
|
||||||
|
E.row[at].hl = NULL;
|
||||||
editorUpdateRow(&E.row[at]);
|
editorUpdateRow(&E.row[at]);
|
||||||
E.numrows++;
|
E.numrows++;
|
||||||
E.dirty++;
|
E.dirty++;
|
||||||
|
@ -257,6 +314,7 @@ void editorInsertRow(int at, char *s, size_t len) {
|
||||||
void editorFreeRow(erow *row) {
|
void editorFreeRow(erow *row) {
|
||||||
free(row->render);
|
free(row->render);
|
||||||
free(row->chars);
|
free(row->chars);
|
||||||
|
free(row->hl);
|
||||||
}
|
}
|
||||||
|
|
||||||
void editorDelRow(int at) {
|
void editorDelRow(int at) {
|
||||||
|
@ -412,6 +470,15 @@ void editorFindCallback(char *query, int key) {
|
||||||
static int last_match = -1;
|
static int last_match = -1;
|
||||||
static int direction = 1;
|
static int direction = 1;
|
||||||
|
|
||||||
|
static int saved_hl_line;
|
||||||
|
static char *saved_hl = NULL;
|
||||||
|
|
||||||
|
if (saved_hl) {
|
||||||
|
memcpy(E.row[saved_hl_line].hl, saved_hl, E.row[saved_hl_line].rsize);
|
||||||
|
free(saved_hl);
|
||||||
|
saved_hl = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (key== '\r' || key == '\x1b') {
|
if (key== '\r' || key == '\x1b') {
|
||||||
last_match = -1;
|
last_match = -1;
|
||||||
direction = 1;
|
direction = 1;
|
||||||
|
@ -446,6 +513,11 @@ void editorFindCallback(char *query, int key) {
|
||||||
E.cy = current;
|
E.cy = current;
|
||||||
E.cx = editorRowCxToRx(row, match - row->render);
|
E.cx = editorRowCxToRx(row, match - row->render);
|
||||||
E.rowoff = E.numrows;
|
E.rowoff = E.numrows;
|
||||||
|
|
||||||
|
saved_hl_line = current;
|
||||||
|
saved_hl = malloc(row->rsize);
|
||||||
|
memcpy(saved_hl, row->hl, row->rsize);
|
||||||
|
memset(&row->hl[match - row->render], HL_MATCH, strlen(query));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -538,7 +610,29 @@ void editorDrawRows(struct abuf *ab) {
|
||||||
int len = E.row[filerow].rsize - E.coloff;
|
int len = E.row[filerow].rsize - E.coloff;
|
||||||
if (len < 0) len = 0;
|
if (len < 0) len = 0;
|
||||||
if (len > E.screencols) len = E.screencols; // truncate if further than columns
|
if (len > E.screencols) len = E.screencols; // truncate if further than columns
|
||||||
abAppend(ab, &E.row[filerow].render[E.coloff], len);
|
char *c = &E.row[filerow].render[E.coloff];
|
||||||
|
unsigned char *hl = &E.row[filerow].hl[E.coloff];
|
||||||
|
int current_color = -1;
|
||||||
|
int j;
|
||||||
|
for (j=0;j< len;j++){
|
||||||
|
if (hl[j] == HL_NORMAL){
|
||||||
|
if (current_color != -1){
|
||||||
|
abAppend(ab, "\x1b[39m", 5);
|
||||||
|
current_color = -1;
|
||||||
|
}
|
||||||
|
abAppend(ab, &c[j], 1);
|
||||||
|
} else {
|
||||||
|
int color = editorSyntaxToColor(hl[j]);
|
||||||
|
if (color != current_color) {
|
||||||
|
current_color = color;
|
||||||
|
char buf[16];
|
||||||
|
int clen = snprintf(buf, sizeof(buf), "\x1b[%dm", color);
|
||||||
|
abAppend(ab, buf, clen);
|
||||||
|
}
|
||||||
|
abAppend(ab, &c[j], 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
abAppend(ab, "\x1b[39m", 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
abAppend(ab, "\x1b[K", 3);
|
abAppend(ab, "\x1b[K", 3);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user