On Sun, Sep 20, 2020 at 08:19:24AM -0600, Todd C. Miller wrote: > Does this look better? I don't think we need to refer to the emacs > clear-screen command in both cases; once should be sufficient. > > - todd >
i think it reads fine. jmc > Index: bin/ksh/ksh.1 > =================================================================== > RCS file: /cvs/src/bin/ksh/ksh.1,v > retrieving revision 1.209 > diff -u -p -u -r1.209 ksh.1 > --- bin/ksh/ksh.1 7 Jul 2020 10:33:58 -0000 1.209 > +++ bin/ksh/ksh.1 20 Sep 2020 14:16:50 -0000 > @@ -5053,6 +5053,13 @@ Erases previous character. > .It ^J | ^M > End of line. > The current line is read, parsed, and executed by the shell. > +.It ^L > +Clear the screen (if possible) and redraw the current line. > +See the > +.Em clear-screen > +command in > +.Sx Emacs editing mode > +for more information. > .It ^V > Literal next. > The next character typed is not treated specially (can be used > @@ -5510,7 +5517,9 @@ Miscellaneous vi commands > .Bl -tag -width Ds > .It ^J and ^M > The current line is read, parsed, and executed by the shell. > -.It ^L and ^R > +.It ^L > +Clear the screen (if possible) and redraw the current line. > +.It ^R > Redraw the current line. > .It Xo > .Oo Ar n Oc Ns \&. > Index: bin/ksh/vi.c > =================================================================== > RCS file: /cvs/src/bin/ksh/vi.c,v > retrieving revision 1.56 > diff -u -p -u -r1.56 vi.c > --- bin/ksh/vi.c 15 Mar 2018 16:51:29 -0000 1.56 > +++ bin/ksh/vi.c 20 Sep 2020 12:02:38 -0000 > @@ -14,12 +14,14 @@ > #include <ctype.h> > #include <stdlib.h> > #include <string.h> > +#ifndef SMALL > +# include <term.h> > +# include <curses.h> > +#endif > > #include "sh.h" > #include "edit.h" > > -#define CTRL(c) (c & 0x1f) > - > struct edstate { > char *cbuf; /* main buffer to build the command line */ > int cbufsize; /* number of bytes allocated for cbuf */ > @@ -52,8 +54,9 @@ static int Backword(int); > static int Endword(int); > static int grabhist(int, int); > static int grabsearch(int, int, int, char *); > +static void do_clear_screen(void); > static void redraw_line(int); > -static void refresh(int); > +static void refresh_line(int); > static int outofwin(void); > static void rewindow(void); > static int newcol(int, int); > @@ -271,9 +274,9 @@ vi_hook(int ch) > case 0: > if (state == VLIT) { > es->cursor--; > - refresh(0); > + refresh_line(0); > } else > - refresh(insert != 0); > + refresh_line(insert != 0); > break; > case 1: > return 1; > @@ -298,7 +301,7 @@ vi_hook(int ch) > return -1; > } else if (putbuf("?", 1, 0) != 0) > return -1; > - refresh(0); > + refresh_line(0); > } > } > } > @@ -310,7 +313,7 @@ vi_hook(int ch) > vi_error(); > } else > es->cbuf[es->cursor++] = ch; > - refresh(1); > + refresh_line(1); > state = VNORMAL; > break; > > @@ -375,7 +378,7 @@ vi_hook(int ch) > if (!srchpat[0]) { > vi_error(); > state = VNORMAL; > - refresh(0); > + refresh_line(0); > return 0; > } > } else { > @@ -392,17 +395,17 @@ vi_hook(int ch) > } while (srchlen > 0 && > isu8cont(locpat[srchlen])); > es->cursor = es->linelen; > - refresh(0); > + refresh_line(0); > return 0; > } > restore_cbuf(); > state = VNORMAL; > - refresh(0); > + refresh_line(0); > } else if (ch == edchars.kill) { > srchlen = 0; > es->linelen = 1; > es->cursor = 1; > - refresh(0); > + refresh_line(0); > return 0; > } else if (ch == edchars.werase) { > struct edstate new_es, *save_es; > @@ -421,7 +424,7 @@ vi_hook(int ch) > es->linelen -= char_len((unsigned > char)locpat[i]); > srchlen = n; > es->cursor = es->linelen; > - refresh(0); > + refresh_line(0); > return 0; > } else { > if (srchlen == SRCHLEN - 1) > @@ -446,7 +449,7 @@ vi_hook(int ch) > es->cbuf[es->linelen++] = ch; > } > es->cursor = es->linelen; > - refresh(0); > + refresh_line(0); > } > return 0; > } > @@ -459,15 +462,15 @@ vi_hook(int ch) > switch (vi_cmd(argc1, curcmd)) { > case -1: > vi_error(); > - refresh(0); > + refresh_line(0); > break; > case 0: > if (insert != 0) > inslen = 0; > - refresh(insert != 0); > + refresh_line(insert != 0); > break; > case 1: > - refresh(0); > + refresh_line(0); > return 1; > case 2: > /* back from a 'v' command - don't redraw the screen */ > @@ -482,7 +485,7 @@ vi_hook(int ch) > switch (vi_cmd(lastac, lastcmd)) { > case -1: > vi_error(); > - refresh(0); > + refresh_line(0); > break; > case 0: > if (insert != 0) { > @@ -495,10 +498,10 @@ vi_hook(int ch) > vi_error(); > } > } > - refresh(0); > + refresh_line(0); > break; > case 1: > - refresh(0); > + refresh_line(0); > return 1; > case 2: > /* back from a 'v' command - can't happen */ > @@ -651,6 +654,10 @@ vi_insert(int ch) > print_expansions(es); > break; > > + case CTRL('l'): > + do_clear_screen(); > + break; > + > case CTRL('i'): > if (Flag(FVITABCOMPLETE)) { > complete_word(0, 0); > @@ -708,6 +715,9 @@ vi_cmd(int argcnt, const char *cmd) > switch (*cmd) { > > case CTRL('l'): > + do_clear_screen(); > + break; > + > case CTRL('r'): > redraw_line(1); > break; > @@ -1028,7 +1038,7 @@ vi_cmd(int argcnt, const char *cmd) > c1, srchpat)) < 0) { > if (c3) { > restore_cbuf(); > - refresh(0); > + refresh_line(0); > } > return -1; > } else { > @@ -1717,10 +1727,24 @@ grabsearch(int save, int start, int fwd, > } > > static void > -redraw_line(int newline) > +do_clear_screen(void) > +{ > + int neednl = 1; > + > +#ifndef SMALL > + if (cur_term != NULL && clear_screen != NULL) { > + if (tputs(clear_screen, 1, x_putc) != ERR) > + neednl = 0; > + } > +#endif > + redraw_line(neednl); > +} > + > +static void > +redraw_line(int neednl) > { > (void) memset(wbuf[win], ' ', wbuf_len); > - if (newline) { > + if (neednl) { > x_putc('\r'); > x_putc('\n'); > } > @@ -1730,7 +1754,7 @@ redraw_line(int newline) > } > > static void > -refresh(int leftside) > +refresh_line(int leftside) > { > if (outofwin()) > rewindow(); > @@ -2033,7 +2057,7 @@ expand_word(int command) > modified = 1; hnum = hlast; > insert = INSERT; > lastac = 0; > - refresh(0); > + refresh_line(0); > return rval; > } > > @@ -2137,7 +2161,7 @@ complete_word(int command, int count) > modified = 1; hnum = hlast; > insert = INSERT; > lastac = 0; /* prevent this from being redone... */ > - refresh(0); > + refresh_line(0); > > return rval; > } >