From 376c62bc63870fa1121548fc8b53271c21ed79a6 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Wed, 10 Dec 2025 02:15:41 +0100 Subject: SciTECO lexer: braces and two-character operators are now actually styled as operators * For consistency with other lexers, like the C/C++ lexer. * `^*`, `^/` and `^#` are also true operators and shouldn't be styled as regular commands. This required introducing a new operator style (3). --- src/core-commands.h | 1 + src/lexer.c | 17 ++++++++++++----- src/lexer.h | 14 ++++++++------ 3 files changed, 21 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/core-commands.h b/src/core-commands.h index cb28dce..4cc8747 100644 --- a/src/core-commands.h +++ b/src/core-commands.h @@ -125,6 +125,7 @@ TECO_DECLARE_STATE(teco_state_insert_indent); teco_state_t *teco_state_start_input(teco_machine_main_t *ctx, gunichar chr, GError **error); TECO_DECLARE_STATE(teco_state_start); +TECO_DECLARE_STATE(teco_state_control); TECO_DECLARE_STATE(teco_state_escape); TECO_DECLARE_STATE(teco_state_ctlc); TECO_DECLARE_STATE(teco_state_ctlc_control); diff --git a/src/lexer.c b/src/lexer.c index 02a6636..787fe89 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -26,6 +26,7 @@ #include "sciteco.h" #include "view.h" #include "parser.h" +#include "core-commands.h" #include "lexer.h" static teco_style_t @@ -37,16 +38,21 @@ teco_lexer_getstyle(teco_view_t *view, teco_machine_main_t *machine, /* * FIXME: At least this special workaround for numbers might be * unnecessary once we get a special parser state for parsing numbers. - * - * FIXME: What about ^* and ^/? - * They are currently highlighted as commands. */ if (machine->parent.current->keymacro_mask & TECO_KEYMACRO_MASK_START && chr <= 0xFF) { if (g_ascii_isdigit(chr)) style = SCE_SCITECO_NUMBER; - else if (strchr(",+-*/#&", chr)) + else if (strchr(",+-*/#&()", chr)) style = SCE_SCITECO_OPERATOR; + } else if (machine->parent.current == &teco_state_control) { + /* + * Two-character operators must always begin with caret + * They get a separate style, so we can extend it back to + * the caret in teco_lexter_step. + */ + if (strchr("*/#", chr)) + style = SCE_SCITECO_OPERATOR2; } /* @@ -174,8 +180,9 @@ teco_lexer_step(teco_view_t *view, teco_machine_main_t *machine, /* * True comments begin with `!*` or `!!`, but only the second character gets * the correct style by default, so we extend it backwards. + * The same is true for two-letter operators. */ - if (style == SCE_SCITECO_COMMENT) + if (style == SCE_SCITECO_COMMENT || style == SCE_SCITECO_OPERATOR2) old_pc--; teco_view_ssm(view, SCI_STARTSTYLING, start+old_pc, 0); diff --git a/src/lexer.h b/src/lexer.h index 2b011be..e91cdd1 100644 --- a/src/lexer.h +++ b/src/lexer.h @@ -25,12 +25,14 @@ typedef enum { SCE_SCITECO_DEFAULT = 0, SCE_SCITECO_COMMAND = 1, SCE_SCITECO_OPERATOR = 2, - SCE_SCITECO_QREG = 3, - SCE_SCITECO_STRING = 4, - SCE_SCITECO_NUMBER = 5, - SCE_SCITECO_LABEL = 6, - SCE_SCITECO_COMMENT = 7, - SCE_SCITECO_INVALID = 8 + /** two-character operators */ + SCE_SCITECO_OPERATOR2 = 3, + SCE_SCITECO_QREG = 4, + SCE_SCITECO_STRING = 5, + SCE_SCITECO_NUMBER = 6, + SCE_SCITECO_LABEL = 7, + SCE_SCITECO_COMMENT = 8, + SCE_SCITECO_INVALID = 9 } teco_style_t; void teco_lexer_style(teco_view_t *view, gsize end); -- cgit v1.2.3