From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26619 invoked from network); 20 Jan 1997 08:56:18 -0000 Received: from euclid.skiles.gatech.edu (list@130.207.146.50) by coral.primenet.com.au with SMTP; 20 Jan 1997 08:56:18 -0000 Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id DAA02285; Mon, 20 Jan 1997 03:54:21 -0500 (EST) Resent-Date: Mon, 20 Jan 1997 03:54:21 -0500 (EST) Message-Id: <199701200855.JAA01379@hydra.ifh.de> To: zsh-workers@math.gatech.edu (Zsh hackers list) Subject: Zle mark code (second posting) Date: Mon, 20 Jan 1997 09:55:40 +0100 From: Peter Stephenson Resent-Message-ID: <"LmKU63.0.eZ.yApuo"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/2810 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu 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 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.