highlight keywords
This commit is contained in:
parent
1f2dd407b0
commit
d2a7328b09
48
kilo.c
48
kilo.c
|
@ -38,6 +38,9 @@ enum editorKey {
|
|||
|
||||
enum editorHighlight {
|
||||
HL_NORMAL = 0,
|
||||
HL_COMMENT,
|
||||
HL_KEYWORD1,
|
||||
HL_KEYWORD2,
|
||||
HL_STRING,
|
||||
HL_NUMBER,
|
||||
HL_MATCH
|
||||
|
@ -51,6 +54,8 @@ enum editorHighlight {
|
|||
struct editorSyntax {
|
||||
char *filetype;
|
||||
char **filematch;
|
||||
char **keywords;
|
||||
char *singleline_comment_start;
|
||||
int flags;
|
||||
};
|
||||
|
||||
|
@ -84,11 +89,19 @@ struct editorConfig E;
|
|||
/*** filetypes ***/
|
||||
|
||||
char *C_HL_extensions[] = { ".c", ".h", ".cpp", NULL };
|
||||
char *C_HL_keywords[] = {
|
||||
"switch", "if", "while", "for", "break", "continue", "return", "else",
|
||||
"struct", "union", "typedef", "static", "enum", "class", "case",
|
||||
"int|", "long|", "double|", "float|", "char|" , "unsigned|", "signed|",
|
||||
"void|", NULL
|
||||
};
|
||||
|
||||
struct editorSyntax HLDB[] = {
|
||||
{
|
||||
"c",
|
||||
C_HL_extensions,
|
||||
C_HL_keywords,
|
||||
"//",
|
||||
HL_HIGHLIGHT_NUMBERS | HL_HIGHLIGHT_STRINGS
|
||||
},
|
||||
};
|
||||
|
@ -243,6 +256,11 @@ void editorUpdateSyntax(erow *row) {
|
|||
if (E.syntax == NULL)
|
||||
return;
|
||||
|
||||
char **keywords = E.syntax->keywords;
|
||||
|
||||
char *scs = E.syntax->singleline_comment_start;
|
||||
int scs_len = scs ? strlen(scs) : 0;
|
||||
|
||||
int prev_sep = 1;
|
||||
int in_string = 0;
|
||||
|
||||
|
@ -251,6 +269,13 @@ void editorUpdateSyntax(erow *row) {
|
|||
char c = row->render[i];
|
||||
unsigned char prev_hl = (i > 0) ? row->hl[i - 1] : HL_NORMAL;
|
||||
|
||||
if (scs_len && !in_string) {
|
||||
if (!strncmp(&row->render[i], scs, scs_len)) {
|
||||
memset(&row->hl[i], HL_COMMENT, row->rsize - 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (E.syntax->flags & HL_HIGHLIGHT_STRINGS) {
|
||||
if (in_string) {
|
||||
row->hl[i] = HL_STRING;
|
||||
|
@ -284,6 +309,26 @@ void editorUpdateSyntax(erow *row) {
|
|||
}
|
||||
}
|
||||
|
||||
if (prev_sep) {
|
||||
int j;
|
||||
for (j = 0; keywords[j]; j++) {
|
||||
int klen = strlen(keywords[j]);
|
||||
int kw2 = keywords[j][klen - 1] == '|';
|
||||
if (kw2) klen--;
|
||||
|
||||
if (!strncmp(&row->render[i], keywords[j], klen) &&
|
||||
is_separator(row->render[i + klen])) {
|
||||
memset(&row->hl[i], kw2 ? HL_KEYWORD2 : HL_KEYWORD1, klen);
|
||||
i += klen;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (keywords[j] != NULL) {
|
||||
prev_sep = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
prev_sep = is_separator(c);
|
||||
i++;
|
||||
}
|
||||
|
@ -291,6 +336,9 @@ void editorUpdateSyntax(erow *row) {
|
|||
|
||||
int editorSyntaxToColor(int hl) {
|
||||
switch (hl) {
|
||||
case HL_COMMENT: return 36;
|
||||
case HL_KEYWORD1: return 33;
|
||||
case HL_KEYWORD2: return 32;
|
||||
case HL_STRING: return 35;
|
||||
case HL_NUMBER: return 31;
|
||||
case HL_NORMAL: return 34;
|
||||
|
|
Loading…
Reference in New Issue