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

Reply via email to