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

Reply via email to