Yeah, I've made such stuff, even which preserves the actual position on the command line, but I'm not too happy about screwing up the yank buffers...
On June 16, 2018 9:16:50 PM GMT+02:00, Sebastian Benoit <be...@openbsd.org> wrote: > >fwiw you can just use > >bind -m '^L'=^Uclear'^J^Y' > > >Todd C. Miller(todd.mil...@sudo.ws) on 2018.06.16 06:37:03 -0600: >> On Tue, 12 Jun 2018 02:35:57 +0200, Alexander Hall wrote: >> >> > The diff below uses system(3) to call /usr/bin/clear, fiddling with > >> > *env() to make sure the current TERM value is propagated. The error > >> > handling is deliberately sparse, since I don't know what the >reasonable >> > error actions would be. >> > >> > It's quite possible there already exists a better function to call >> > within the ksh code already, but I was unable to figure out which >if so. >> >> Using system() within ksh seems wrong. How about this instead? >> >> - todd >> >> Index: bin/ksh/emacs.c >> =================================================================== >> RCS file: /cvs/src/bin/ksh/emacs.c,v >> retrieving revision 1.84 >> diff -u -p -u -r1.84 emacs.c >> --- bin/ksh/emacs.c 16 Jan 2018 17:17:18 -0000 1.84 >> +++ bin/ksh/emacs.c 16 Jun 2018 12:31:59 -0000 >> @@ -146,6 +146,7 @@ static int isu8cont(unsigned char); >> /* proto's for keybindings */ >> static int x_abort(int); >> static int x_beg_hist(int); >> +static int x_clear_screen(int); >> static int x_comp_comm(int); >> static int x_comp_file(int); >> static int x_complete(int); >> @@ -202,6 +203,7 @@ static int x_debug_info(int); >> static const struct x_ftab x_ftab[] = { >> { x_abort, "abort", 0 }, >> { x_beg_hist, "beginning-of-history", 0 }, >> + { x_clear_screen, "clear-screen", 0 }, >> { x_comp_comm, "complete-command", 0 }, >> { x_comp_file, "complete-file", 0 }, >> { x_complete, "complete", 0 }, >> @@ -1004,12 +1006,19 @@ x_draw_line(int c) >> { >> x_redraw(-1); >> return KSTD; >> +} >> >> +static int >> +x_clear_screen(int c) >> +{ >> + x_redraw(-2); >> + return KSTD; >> } >> >> -/* Redraw (part of) the line. If limit is < 0, the everything is >redrawn >> - * on a NEW line, otherwise limit is the screen column up to which >needs >> - * redrawing. >> +/* Redraw (part of) the line. >> + * A non-negative limit is the screen column up to which needs >> + * redrawing. A limit of -1 redraws on a new line, while a limit >> + * of -2 (attempts to) clear the screen. >> */ >> static void >> x_redraw(int limit) >> @@ -1018,9 +1027,20 @@ x_redraw(int limit) >> char *cp; >> >> x_adj_ok = 0; >> - if (limit == -1) >> + if (limit == -2) { >> + char *term = str_val(global("TERM")); >> + int ret = -1; >> + if (term && *term) { >> + Source *sold = source; >> + ret = command("/usr/bin/clear", 0); >> + source = sold; >> + } >> + if (ret != 0) >> + x_e_putc('\n'); >> + } >> + else if (limit == -1) >> x_e_putc('\n'); >> - else >> + else if (limit >= 0) >> x_e_putc('\r'); >> x_flush(); >> if (xbp == xbuf) { >> Index: bin/ksh/ksh.1 >> =================================================================== >> RCS file: /cvs/src/bin/ksh/ksh.1,v >> retrieving revision 1.200 >> diff -u -p -u -r1.200 ksh.1 >> --- bin/ksh/ksh.1 30 May 2018 21:20:52 -0000 1.200 >> +++ bin/ksh/ksh.1 16 Jun 2018 12:29:34 -0000 >> @@ -4690,6 +4690,10 @@ Moves the cursor to the beginning of the >> Uppercase the first character in the next >> .Ar n >> words, leaving the cursor past the end of the last word. >> +.It clear-screen: >> +Attempts to clears the screen by invoking >> +.Xr clear 1 >> +and redraws the prompt and current input line. >> .It comment: ^[# >> If the current line does not begin with a comment character, one is >added at >> the beginning of the line and the line is entered (as if return had >been >>