When printing a macro, any character with the 8th bit set will be printed
as `\M-' followed by the literal "unmetafied" character, even if the latter
is a control character:
$ bind '"_": "\201"'; bind -s | cat -v
"_": "\M-^A"
Or is a null byte:
$ bind '"1PI": "π"'; bind -s
"1PI": "\M-O\M-"
$ bind '"2PI": "ππ"'; bind -s
"2PI": "\M-O\M-"
---
diff --git a/lib/readline/bind.c b/lib/readline/bind.c
index a8b139f0..4811370b 100644
--- a/lib/readline/bind.c
+++ b/lib/readline/bind.c
@@ -732,7 +732,7 @@ _rl_untranslate_macro_value (char *seq, int use_escapes)
char *ret, *r, *s;
int c;
- r = ret = (char *)xmalloc (7 * strlen (seq) + 1);
+ r = ret = (char *)xmalloc (10 * strlen (seq) + 1);
for (s = seq; *s; s++)
{
c = *s;
@@ -743,7 +743,8 @@ _rl_untranslate_macro_value (char *seq, int use_escapes)
*r++ = '-';
c = UNMETA (c);
}
- else if (c == ESC)
+
+ if (c == ESC)
{
*r++ = '\\';
c = 'e';
@@ -768,12 +769,7 @@ _rl_untranslate_macro_value (char *seq, int
use_escapes)
c = '?';
}
- if (c == ESC)
- {
- *r++ = '\\';
- c = 'e';
- }
- else if (c == '\\' || c == '"')
+ if (c == '\\' || c == '"')
*r++ = '\\';
*r++ = (unsigned char)c;