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

Zle mark code (second posting)



I posted this on Friday, but it doesn't seem to have arrived back, so
it's possible another version of this will turn up at some point.

This is what I was hoping for to get the Emacs mark to work with
insertions and deletions; it should cope with all the well-behaved
code which calls spaceinline() and the kill and del functions to do
the work, though there may be parts which shift chunks of the line
themselves.  As rewritten, it's scarcely longer than the original
code.

This is against zsh-3.0.3-test3 and it's quite liable to clash with
one or other of Zefram's zle patches.  For the same reason, I haven't
written anything to handle this in the undo code, although that needs
doing.

*** Src/zle_utils.c.mark	Fri Jan 17 14:43:32 1997
--- Src/zle_utils.c	Fri Jan 17 15:00:08 1997
***************
*** 55,60 ****
--- 55,79 ----
  	line[i + ct] = line[i];
      ll += ct;
      line[ll] = '\0';
+ 
+     if (mark >= cs)
+ 	mark += ct;
+ }
+ 
+ /**/
+ void
+ shiftchars(int to, int cnt)
+ {
+     if (mark >= to + cnt)
+ 	mark -= cnt;
+     else if (mark > to)
+ 	mark = to;
+ 
+     while(to + cnt <= ll) {
+ 	line[to] = line[to + cnt];
+ 	to++;
+     }
+     ll -= cnt;
  }
  
  /**/
***************
*** 64,74 ****
      int i = (cs -= ct);
  
      cut(i, ct, dir);
!     while (i + ct < ll) {
! 	line[i] = line[i + ct];
! 	i++;
!     }
!     ll -= ct;
  }
  
  /**/
--- 83,89 ----
      int i = (cs -= ct);
  
      cut(i, ct, dir);
!     shiftchars(i, ct);
  }
  
  /**/
***************
*** 78,88 ****
      int i = cs;
  
      cut(i, ct, dir);
!     while (i + ct < ll) {
! 	line[i] = line[i + ct];
! 	i++;
!     }
!     ll -= ct;
  }
  
  /**/
--- 93,99 ----
      int i = cs;
  
      cut(i, ct, dir);
!     shiftchars(i, ct);
  }
  
  /**/
***************
*** 157,182 ****
  void
  backdel(int ct)
  {
!     int i = (cs -= ct);
! 
!     while (i + ct <= ll) {
! 	line[i] = line[i + ct];
! 	i++;
!     }
!     ll -= ct;
  }
  
  /**/
  void
  foredel(int ct)
  {
!     int i = cs;
! 
!     while (i + ct <= ll) {
! 	line[i] = line[i + ct];
! 	i++;
!     }
!     ll -= ct;
  }
  
  /**/
--- 168,181 ----
  void
  backdel(int ct)
  {
!     shiftchars(cs -= ct, ct);
  }
  
  /**/
  void
  foredel(int ct)
  {
!     shiftchars(cs, ct);
  }
  
  /**/

-- 
Peter Stephenson <pws@xxxxxx>       Tel: +49 33762 77366
WWW:  http://www.ifh.de/~pws/       Fax: +49 33762 77413
Deutsches Elektronen-Synchrotron --- Institut fuer Hochenergiephysik Zeuthen
DESY-IfH, 15735 Zeuthen, Germany.



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