tmonth old bug fix from rob - plan9port - [fork] Plan 9 from user space (HTM) git clone git://src.adamsgaard.dk/plan9port (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit 2a373ea419dafeed391ae37d152f06625bdb7255 (DIR) parent c1fca1adb018ad47beb0abfe4c3dbfcc87c81ebd (HTM) Author: rsc <devnull@localhost> Date: Fri, 18 Mar 2005 18:05:48 +0000 month old bug fix from rob Diffstat: M src/cmd/acme/text.c | 44 ++++++++++++++++++++----------- M src/cmd/acme/wind.c | 2 +- 2 files changed, 30 insertions(+), 16 deletions(-) --- (DIR) diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c t@@ -386,6 +386,14 @@ textinsert(Text *t, uint q0, Rune *r, uint n, int tofile) } } +void +typecommit(Text *t) +{ + if(t->w != nil) + wincommit(t->w, t); + else + textcommit(t, TRUE); +} void textfill(Text *t) t@@ -395,12 +403,8 @@ textfill(Text *t) if(t->fr.lastlinefull || t->nofill) return; - if(t->ncache > 0){ - if(t->w != nil) - wincommit(t->w, t); - else - textcommit(t, TRUE); - } + if(t->ncache > 0) + typecommit(t); rp = fbufalloc(); do{ n = t->file->b.nc-(t->org+t->fr.nchars); t@@ -649,16 +653,13 @@ texttype(Text *t, Rune r) switch(r){ case Kleft: if(t->q0 > 0){ - if(t->w) - wincommit(t->w, t); - else - textcommit(t, TRUE); + typecommit(t); textshow(t, t->q0-1, t->q0-1, TRUE); } return; case Kright: if(t->q1 < t->file->b.nc){ - wincommit(t->w, t); + typecommit(t); textshow(t, t->q1+1, t->q1+1, TRUE); } return; t@@ -689,15 +690,28 @@ texttype(Text *t, Rune r) textsetorigin(t, q0, TRUE); return; case Khome: + typecommit(t); textshow(t, 0, 0, FALSE); return; case Kend: - if(t->w) - wincommit(t->w, t); - else - textcommit(t, TRUE); + typecommit(t); textshow(t, t->file->b.nc, t->file->b.nc, FALSE); return; + case 0x01: /* ^A: beginning of line */ + typecommit(t); + /* go to where ^U would erase, if not already at BOL */ + nnb = 0; + if(t->q0>0 && textreadc(t, t->q0-1)!='\n') + nnb = textbswidth(t, 0x15); + textshow(t, t->q0-nnb, t->q0-nnb, TRUE); + return; + case 0x05: /* ^E: end of line */ + typecommit(t); + q0 = t->q0; + while(q0<t->file->b.nc && textreadc(t, q0)!='\n') + q0++; + textshow(t, q0, q0, TRUE); + return; } if(t->what == Body){ seq++; (DIR) diff --git a/src/cmd/acme/wind.c b/src/cmd/acme/wind.c t@@ -80,9 +80,9 @@ wininit(Window *w, Window *clone, Rectangle r) //assert(w->body.w == w); if(clone){ w->dirty = clone->dirty; + w->autoindent = clone->autoindent; textsetselect(&w->body, clone->body.q0, clone->body.q1); winsettag(w); - w->autoindent = clone->autoindent; } }