On 21/05/12(Mon) 10:59, Lars Engblom wrote:
> On current snapshot (amd64), my ksh bindings are not working anymore.
> For example if I have this in .kshrc:
> 
> bind -m '^L'="^Cclear^M"
> set +o emacs-usemeta
> 
> This keybinding has been working for more than a year for me, prior to my
> latest upgrade. The expected behavior would be Ctrl-C to interrupt the line
> written followed by a 'clear' command and Enter. Now if i write 'ls'
> and then
> regret, wanting to clear the screen I get this visible on the screen:
> 
> $ ls^Cclear^M

This bug has been introduced in the last ksh change, thanks for reporting
it. The diff below should correct this behavior, can you confirm it works
for you?

Martin

Index: emacs.c
===================================================================
RCS file: /cvs/src/bin/ksh/emacs.c,v
retrieving revision 1.45
diff -u -p -r1.45 emacs.c
--- emacs.c     30 Apr 2012 03:51:29 -0000      1.45
+++ emacs.c     21 May 2012 11:08:37 -0000
@@ -108,6 +108,7 @@ static      char    *killstack[KILLSIZE];
 static int     killsp, killtp;
 static int     x_literal_set;
 static int     x_arg_set;
+static char    *macro_args;
 static int     prompt_skip;
 static int     prompt_redraw;
 
@@ -343,11 +344,12 @@ x_emacs(char *buf, size_t len)
 
                if (submatch == 1 && kmatch) {
                        if (kmatch->ftab->xf_func == x_ins_string &&
-                           kmatch->args) {
-                               /* insert macro string */
-                               x_ins(kmatch->args);
-                       }
-                       ret = kmatch->ftab->xf_func(c);
+                           kmatch->args && !macro_args) {
+                               /* treat macro string as input */
+                               macro_args = kmatch->args;
+                               ret = KSTD;
+                       } else
+                               ret = kmatch->ftab->xf_func(c);
                } else {
                        if (submatch)
                                continue;
@@ -410,7 +412,7 @@ x_insert(int c)
 static int
 x_ins_string(int c)
 {
-       return KSTD;
+       return x_insert(c);
 }
 
 static int x_do_ins(const char *cp, int len);
@@ -1862,6 +1864,12 @@ x_e_getc(void)
        if (unget_char >= 0) {
                c = unget_char;
                unget_char = -1;
+       } else if (macro_args) {
+               c = *macro_args++;
+               if (!c) {
+                       macro_args = NULL;
+                       c = x_getc();
+               }
        } else
                c = x_getc();

Reply via email to