diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-04-08 22:23:35 +0300 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-04-08 23:59:21 +0300 |
commit | 44307bd7998e5f1fc81d63d74edaf4756ddf5a47 (patch) | |
tree | 130c3afbb6e92f01dee5c0adbf58be2551d3db00 /src/core-commands.c | |
parent | ed73342ba738a2f65bf916a10670bfeec137a562 (diff) | |
download | sciteco-44307bd7998e5f1fc81d63d74edaf4756ddf5a47.tar.gz |
improved rubbing out commands with modifiers
* This was actually broken if the command is preceded by `@` and `:` characters, which
are __not__ modifiers.
E.g. `Q:@I/foo^W` would have rubbed out the `:` register as well.
* Also, since it was all done in teco_state_process_edit_cmd(),
it would also rub out modifier characters from within string arguments,
E.g. `@I/::^EQ^W`
* Real commands now have their own ^W rubout implementation, while the generic
fallback just rubs out until the start state is re-established.
This fails to rub out modifiers as in `@I/^W`, though.
* Real command characters now use the common TECO_DEFINE_STATE_COMMAND().
* Added test cases for CTRL+W rub out.
A few control characters are now portably available to tests
via environment variables `$ESCAPE`, `$RUBOUT` and `$RUBOUT_WORD`.
Diffstat (limited to 'src/core-commands.c')
-rw-r--r-- | src/core-commands.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/src/core-commands.c b/src/core-commands.c index 5d6e3b9..7845dc2 100644 --- a/src/core-commands.c +++ b/src/core-commands.c @@ -47,6 +47,25 @@ #include "move-commands.h" #include "core-commands.h" +gboolean teco_state_command_process_edit_cmd(teco_machine_main_t *ctx, teco_machine_t *parent_ctx, + gunichar key, GError **error); + +/** + * @class TECO_DEFINE_STATE_COMMAND + * @implements TECO_DEFINE_STATE_CASEINSENSITIVE + * @ingroup states + * + * Base state for everything that is the beginning of a one or two + * letter command. + */ +#define TECO_DEFINE_STATE_COMMAND(NAME, ...) \ + TECO_DEFINE_STATE_CASEINSENSITIVE(NAME, \ + .process_edit_cmd_cb = (teco_state_process_edit_cmd_cb_t) \ + teco_state_command_process_edit_cmd, \ + .style = SCE_SCITECO_COMMAND, \ + ##__VA_ARGS__ \ + ) + static teco_state_t *teco_state_control_input(teco_machine_main_t *ctx, gunichar chr, GError **error); /* @@ -822,11 +841,10 @@ teco_state_start_input(teco_machine_main_t *ctx, gunichar chr, GError **error) teco_ascii_toupper(chr), error); } -TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_start, +TECO_DEFINE_STATE_COMMAND(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, - .style = SCE_SCITECO_COMMAND + .keymacro_mask = TECO_KEYMACRO_MASK_START | TECO_KEYMACRO_MASK_CASEINSENSITIVE ); /*$ F< @@ -983,9 +1001,7 @@ 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, - .style = SCE_SCITECO_COMMAND -); +TECO_DEFINE_STATE_COMMAND(teco_state_fcommand); static void teco_undo_change_dir_action(gchar **dir, gboolean run) @@ -1192,7 +1208,7 @@ 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_COMMAND(teco_state_condcommand, .style = SCE_SCITECO_OPERATOR ); @@ -1533,9 +1549,7 @@ 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, - .style = SCE_SCITECO_COMMAND -); +TECO_DEFINE_STATE_COMMAND(teco_state_control); static teco_state_t * teco_state_ascii_input(teco_machine_main_t *ctx, gunichar chr, GError **error) @@ -1661,15 +1675,14 @@ teco_state_escape_end_of_macro(teco_machine_t *ctx, GError **error) return teco_expressions_discard_args(error); } -TECO_DEFINE_STATE_CASEINSENSITIVE(teco_state_escape, +TECO_DEFINE_STATE_COMMAND(teco_state_escape, .end_of_macro_cb = teco_state_escape_end_of_macro, /* * The state should behave like teco_state_start * when it comes to function key macro masking. */ .is_start = TRUE, - .keymacro_mask = TECO_KEYMACRO_MASK_START | TECO_KEYMACRO_MASK_CASEINSENSITIVE, - .style = SCE_SCITECO_COMMAND + .keymacro_mask = TECO_KEYMACRO_MASK_START | TECO_KEYMACRO_MASK_CASEINSENSITIVE ); /*$ ED flags @@ -2464,9 +2477,7 @@ 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, - .style = SCE_SCITECO_COMMAND -); +TECO_DEFINE_STATE_COMMAND(teco_state_ecommand); gboolean teco_state_insert_initial(teco_machine_main_t *ctx, GError **error) |