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 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; }