summaryrefslogtreecommitdiffstats
path: root/src/getchar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/getchar.c')
-rw-r--r--src/getchar.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/getchar.c b/src/getchar.c
index 7bbdf35834..9d8c0d4bff 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -685,6 +685,46 @@ stuffnumReadbuff(long n)
}
/*
+ * Stuff a string into the typeahead buffer, such that edit() will insert it
+ * literally ("literally" TRUE) or interpret is as typed characters.
+ */
+ void
+stuffescaped(char_u *arg, int literally)
+{
+ int c;
+ char_u *start;
+
+ while (*arg != NUL)
+ {
+ // Stuff a sequence of normal ASCII characters, that's fast. Also
+ // stuff K_SPECIAL to get the effect of a special key when "literally"
+ // is TRUE.
+ start = arg;
+ while ((*arg >= ' '
+#ifndef EBCDIC
+ && *arg < DEL // EBCDIC: chars above space are normal
+#endif
+ )
+ || (*arg == K_SPECIAL && !literally))
+ ++arg;
+ if (arg > start)
+ stuffReadbuffLen(start, (long)(arg - start));
+
+ // stuff a single special character
+ if (*arg != NUL)
+ {
+ if (has_mbyte)
+ c = mb_cptr2char_adv(&arg);
+ else
+ c = *arg++;
+ if (literally && ((c < ' ' && c != TAB) || c == DEL))
+ stuffcharReadbuff(Ctrl_V);
+ stuffcharReadbuff(c);
+ }
+ }
+}
+
+/*
* Read a character from the redo buffer. Translates K_SPECIAL, CSI and
* multibyte characters.
* The redo buffer is left as it is.