On Sun, Jul 31, 2016 at 10:58:15PM +0100, James Byrne wrote: > This improves the cread_line() function so that it will correctly > process the 'Home', 'End', 'Delete' and arrow key escape sequences > produced by various terminal emulators. This makes command line editing > a more pleasant experience. > > The previous code only supported the cursor keys and the 'Home' key, and > only for certain terminal emulator configurations. This adds support for > the 'End and 'Delete' keys, and recognises a wider range of escape > sequences. For example, the left arrow key can be 'ESC O D' instead of > 'ESC [ D', and the 'Home' key can be 'ESC [ H', 'ESC O H', 'ESC 1 ~' or > 'ESC 7 ~', depending on what terminal emulator you use and how it is > configured. > > Signed-off-by: James Byrne <james.by...@origamienergy.com> > --- > Changes for v2 > - Explicitly initialize variable to avoid spurious compiler warning.
Thanks. But now: > > common/cli_readline.c | 108 > ++++++++++++++++++++++++++++++++++++-------------- > 1 file changed, 78 insertions(+), 30 deletions(-) > > diff --git a/common/cli_readline.c b/common/cli_readline.c > index c1476e4..6690c13 100644 > --- a/common/cli_readline.c > +++ b/common/cli_readline.c > @@ -283,46 +283,94 @@ static int cread_line(const char *const prompt, char > *buf, unsigned int *len, > * handle standard linux xterm esc sequences for arrow key, etc. > */ > if (esc_len != 0) { > + enum { ESC_REJECT, ESC_SAVE, ESC_CONVERTED } act = > ESC_REJECT; > + > if (esc_len == 1) { > - if (ichar == '[') { > - esc_save[esc_len] = ichar; > - esc_len = 2; > + if (ichar == '[' || ichar == 'O') > + act = ESC_SAVE; > + else > + act = ESC_REJECT; Since act is ESC_REJECT to start with, we can kill the else. > + } else if (esc_len == 2) { > + switch (ichar) { > + case 'D': /* <- key */ > + ichar = CTL_CH('b'); > + act = ESC_CONVERTED; > + break; /* pass off to ^B handler */ > + case 'C': /* -> key */ > + ichar = CTL_CH('f'); > + act = ESC_CONVERTED; > + break; /* pass off to ^F handler */ > + case 'H': /* Home key */ > + ichar = CTL_CH('a'); > + act = ESC_CONVERTED; > + break; /* pass off to ^A handler */ > + case 'F': /* End key */ > + ichar = CTL_CH('e'); > + act = ESC_CONVERTED; > + break; /* pass off to ^E handler */ > + case 'A': /* up arrow */ > + ichar = CTL_CH('p'); > + act = ESC_CONVERTED; > + break; /* pass off to ^P handler */ > + case 'B': /* down arrow */ > + ichar = CTL_CH('n'); > + act = ESC_CONVERTED; > + break; /* pass off to ^N handler */ > + case '1': > + case '3': > + case '4': > + case '7': > + case '8': > + if (esc_save[1] == '[') { > + /* see if next character is ~ */ > + act = ESC_SAVE; > + } else { > + act = ESC_REJECT; > + } And here too. > + break; > + default: > + act = ESC_REJECT; > + break; And then we can drop the default case too. > + } > + } else if (esc_len == 3) { > + if (ichar == '~') { > + switch (esc_save[2]) { > + case '3': /* Delete key */ > + ichar = CTL_CH('d'); > + act = ESC_CONVERTED; > + break; /* pass to ^D handler */ > + case '1': /* Home key */ > + case '7': > + ichar = CTL_CH('a'); > + act = ESC_CONVERTED; > + break; /* pass to ^A handler */ > + case '4': /* End key */ > + case '8': > + ichar = CTL_CH('e'); > + act = ESC_CONVERTED; > + break; /* pass to ^E handler */ > + default: > + act = ESC_REJECT; > + break; Same. > + } > } else { > - cread_add_str(esc_save, esc_len, > - insert, &num, &eol_num, > - buf, *len); > - esc_len = 0; > + act = ESC_REJECT; > } And this is also redundant. Thanks! -- Tom
signature.asc
Description: Digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot