diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2024-12-09 12:58:25 +0300 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2024-12-13 00:58:14 +0300 |
commit | 244a54a18b7db6af177c9d10f3224772f08d7484 (patch) | |
tree | 188f5a2f1b2e3311efb65299b639021a231540af /src/core-commands.c | |
parent | 7cc78b82e19816220dac5ddf83e51f1140894b42 (diff) | |
download | sciteco-244a54a18b7db6af177c9d10f3224772f08d7484.tar.gz |
implemented Scintilla lexer for SciTECO code, i.e. TECO syntax highlighting
* this works by embedding the SciTECO parser and driving it always (exclusively)
in parse-only mode.
* A new teco_state_t::style determines the Scintilla style for any character
accepted in the given state.
* Therefore, the SciTECO lexer is always 100% exact and corresponds to the current
SciTECO grammer - it does not have to be maintained separately.
There are a few exceptions and tweaks, though.
* The contents of curly-brace escapes (`@^Uq{...}`) are rendered as ordinary
code using a separate parser instance.
This can be disabled with the lexer.sciteco.macrodef property.
Unfortunately, SciTECO does not currently allow setting lexer properties (FIXME).
* Labels and comments are currently styled the same.
This could change in the future once we introduce real comments.
* Lexers are usually implemented in C++, but I did not want to draw in C++.
Especially not since we'd have to include parser.h and other SciTECO headers,
that really do not want to keep C++-compatible.
Instead, the lexer is implemented "in the container".
@ES/SCI_SETILEXER/sciteco/ is internally translated to SCI_SETILEXER(NULL)
and we get Scintilla notifications when styling the view becomes necessary.
This is then centrally forwarded to the teco_lexer_style() which
uses the ordinary teco_view_ssm() API for styling.
* Once the command line becomes a Scintilla view even on Curses,
we can enabled syntax highlighting of the command line macro.
Diffstat (limited to 'src/core-commands.c')
-rw-r--r-- | src/core-commands.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/core-commands.c b/src/core-commands.c index 2f473ce..52b577d 100644 --- a/src/core-commands.c +++ b/src/core-commands.c @@ -31,6 +31,7 @@ #include "expressions.h" #include "ring.h" #include "parser.h" +#include "lexer.h" #include "symbols.h" #include "search.h" #include "spawn.h" @@ -1293,7 +1294,8 @@ teco_state_start_input(teco_machine_main_t *ctx, gunichar chr, GError **error) TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_start, .end_of_macro_cb = NULL, /* Allowed at the end of a macro! */ .is_start = TRUE, - .keymacro_mask = TECO_KEYMACRO_MASK_START | TECO_KEYMACRO_MASK_CASEINSENSITIVE + .keymacro_mask = TECO_KEYMACRO_MASK_START | TECO_KEYMACRO_MASK_CASEINSENSITIVE, + .style = SCE_SCITECO_COMMAND ); /*$ F< @@ -1450,7 +1452,9 @@ teco_state_fcommand_input(teco_machine_main_t *ctx, gunichar chr, GError **error teco_ascii_toupper(chr), error); } -TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_fcommand); +TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_fcommand, + .style = SCE_SCITECO_COMMAND +); static void teco_undo_change_dir_action(gchar **dir, gboolean run) @@ -1657,7 +1661,9 @@ teco_state_condcommand_input(teco_machine_main_t *ctx, gunichar chr, GError **er return &teco_state_start; } -TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_condcommand); +TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_condcommand, + .style = SCE_SCITECO_OPERATOR +); /*$ ^_ negate * n^_ -> ~n -- Binary negation @@ -2055,7 +2061,9 @@ teco_state_control_input(teco_machine_main_t *ctx, gunichar chr, GError **error) teco_ascii_toupper(chr), error); } -TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_control); +TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_control, + .style = SCE_SCITECO_COMMAND +); static teco_state_t * teco_state_ascii_input(teco_machine_main_t *ctx, gunichar chr, GError **error) @@ -2956,7 +2964,9 @@ teco_state_ecommand_input(teco_machine_main_t *ctx, gunichar chr, GError **error teco_ascii_toupper(chr), error); } -TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_ecommand); +TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_ecommand, + .style = SCE_SCITECO_COMMAND +); gboolean teco_state_insert_initial(teco_machine_main_t *ctx, GError **error) |