aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core-commands.c
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2025-04-08 22:23:35 +0300
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2025-04-08 23:59:21 +0300
commit44307bd7998e5f1fc81d63d74edaf4756ddf5a47 (patch)
tree130c3afbb6e92f01dee5c0adbf58be2551d3db00 /src/core-commands.c
parented73342ba738a2f65bf916a10670bfeec137a562 (diff)
downloadsciteco-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.c43
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)