aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRobin Haberkorn <rhaberkorn@fmsbw.de>2026-08-09 13:52:37 +0200
committerRobin Haberkorn <rhaberkorn@fmsbw.de>2026-08-10 23:55:40 +0200
commit822b93aa765c7497b617ead419357f1be09e9ab0 (patch)
tree40bd544ed57f27dc597735a89a1049417a2170ef /src
parent573c9d9b60e2c4dca2be6ccd43ac92b8725f4453 (diff)
when inserting text after auto completions, escape all magic string building characters
This fixes insertion of strings containing ^, ^P, ^Q, ^R, ^V, ^W, ^E. It mainly affects Q-Register specification auto-completions, but filenames could theoretically also contain such special characters.
Diffstat (limited to 'src')
-rw-r--r--src/cmdline.c6
-rw-r--r--src/parser.c15
2 files changed, 17 insertions, 4 deletions
diff --git a/src/cmdline.c b/src/cmdline.c
index e7761aa..7fe044c 100644
--- a/src/cmdline.c
+++ b/src/cmdline.c
@@ -1475,6 +1475,9 @@ teco_state_help_process_edit_cmd(teco_machine_main_t *ctx, teco_machine_t *paren
g_auto(teco_string_t) new_chars, new_chars_escaped;
gboolean unambiguous = teco_help_auto_complete(ctx->expectstring.string.data, &new_chars);
+ /*
+ * FIXME: The help command (?) does not have string building characters.
+ */
teco_machine_stringbuilding_escape(stringbuilding_ctx, new_chars.data, new_chars.len, &new_chars_escaped);
if (unambiguous && ctx->expectstring.nesting == 1)
teco_string_append_wc(&new_chars_escaped,
@@ -1492,6 +1495,9 @@ teco_state_help_insert_completion(teco_machine_main_t *ctx, teco_string_t str, G
{
teco_machine_stringbuilding_t *stringbuilding_ctx = &ctx->expectstring.machine;
+ /*
+ * FIXME: The help command (?) does not have string building characters.
+ */
g_auto(teco_string_t) str_escaped;
teco_machine_stringbuilding_escape(stringbuilding_ctx, str.data, str.len, &str_escaped);
if (ctx->expectstring.nesting == 1)
diff --git a/src/parser.c b/src/parser.c
index 32e60cd..8b02764 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1023,9 +1023,11 @@ teco_machine_stringbuilding_reset(teco_machine_stringbuilding_t *ctx)
ctx->mode = TECO_STRINGBUILDING_MODE_NORMAL;
}
-/*
- * If we case folded only ANSI characters as in teco_ascii_toupper(),
- * this could be simplified.
+/**
+ * Escape string so it can be inserted into a command's string argument
+ * or Q-Register specification.
+ *
+ * This is used for auto-completions and when clicking into auto-completion popups.
*/
void
teco_machine_stringbuilding_escape(teco_machine_stringbuilding_t *ctx, const gchar *str, gsize len,
@@ -1038,13 +1040,18 @@ teco_machine_stringbuilding_escape(teco_machine_stringbuilding_t *ctx, const gch
gunichar chr = g_utf8_get_char(str+i);
/*
+ * If we case folded only ANSI characters as in teco_ascii_toupper(),
+ * this could be simplified.
+ *
* NOTE: We support both `[` and `{`, so this works for autocompleting
* long Q-register specifications as well.
* This may therefore insert unnecessary ^Q, but they won't hurt.
*/
if (g_unichar_toupper(chr) == ctx->escape_char ||
(ctx->escape_char == '[' && chr == ']') ||
- (ctx->escape_char == '{' && chr == '}'))
+ (ctx->escape_char == '{' && chr == '}') ||
+ /* magic characters: ^P, ^Q, ^R, ^V, ^W, ^E */
+ (chr != TECO_CTL_KEY('@') && strchr("^\x10\x11\x12\x16\x17\x05", chr)))
target->data[target->len++] = TECO_CTL_KEY('Q');
gsize lenc = g_utf8_next_char(str+i) - (str+i);