Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Small display bug



heading_anthony@xxxxxxxxxxxx wrote:
> 
> A little display problem I've encountered:
> 
> Let _ be the cursor
> 
> % bindkey -e_
> 
> Then hit <esc>-t to transpose words
> 
> % -e bindkey_ -e

The problem is that refreshline() is clever enough to insert a new '-e
' before the bindkey, but doesn't hang around long enough to delete
the final -e.  I think I've seen similar behaviour a number of times,
but this is the first reproducible one.

This fixes it by
1) if it's possible to clear to end of line, do so if the old line
hasn't been used up when the new line is done (this should fix your
problem)
2) otherwise, output some extra spaces (this may be overkill since 1)
should cover most times there's a problem).

Very likely this depends on Zefram's recent zle patches.

*** Src/zle_refresh.c.ceol	Wed Jul  5 14:27:13 1995
--- Src/zle_refresh.c	Thu Jul  6 15:59:29 1995
***************
*** 486,491 ****
--- 486,493 ----
  	if ((j > i + tclen[TCCLEAREOL]) || /* new buf's spaces early enough */
  	    (nllen == winw && nl[winw - 1] == ' '))
  	    col_cleareol = i;
+ 	else
+ 	    col_cleareol = nllen;
      }
  
  /* 3: set character for first column, in case automargin stuff needs doing */
***************
*** 497,503 ****
      /* skip past all matching characters */
  	for (; *nl && (*nl == *ol); nl++, ol++, ccs++) ;
  
! 	if (!*nl)		/* we've finished writing the new line */
  	    return;
  
  	moveto(ln, ccs);	/* move to where we do all output from */
--- 499,505 ----
      /* skip past all matching characters */
  	for (; *nl && (*nl == *ol); nl++, ol++, ccs++) ;
  
! 	if (!*nl && !*ol)	/* we've finished writing the new line */
  	    return;
  
  	moveto(ln, ccs);	/* move to where we do all output from */
***************
*** 506,511 ****
--- 508,522 ----
  	if ((col_cleareol != -1) && (ccs >= col_cleareol)) {
  	    tcout(TCCLEAREOL);
  	    SELECT_ADD_COST(tclen[TCCLEAREOL]);
+ 	    return;
+ 	}
+     /* otherwise, if we've finished the new buffer, dump out enough spaces */
+ 	if (!*nl) {
+ 	    j = strlen(ol);
+ 	    for (i = 0; i < j; i++)
+ 		putc(' ', shout);
+ 	    vcs += j;
+ 	    moveto(ln, ccs);
  	    return;
  	}
  

-- 
Peter Stephenson <P.Stephenson@xxxxxxxxxxxxx>  Tel: +44 1792 205678 extn. 4461
WWW:  http://python.swan.ac.uk/~pypeters/      Fax: +44 1792 295324
Department of Physics, University of Wales, Swansea,
Singleton Park, Swansea, SA2 8PP, U.K.



Messages sorted by: Reverse Date, Date, Thread, Author